Hook use: do React para Recursos: Um Guia Abrangente | MLOG | MLOG}> {/* Supondo que este ID não exista e causará um erro */} ); } export default App;

Neste exemplo, se a função fetchUser lançar um erro (por exemplo, devido a um status 404), o componente ErrorBoundary capturará o erro e exibirá a UI de fallback. O fallback pode ser qualquer componente React, como uma mensagem de erro ou um botão de tentar novamente.

Técnicas Avançadas com use:

1. Cache de Recursos

Para evitar buscas redundantes, você pode armazenar em cache o recurso (Promise) e reutilizá-lo em vários componentes ou renderizações. Essa otimização é crucial para o desempenho.

            
import React, { Suspense, useRef } from 'react';

const resourceCache = new Map();

async function fetchUser(id) {
  const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
  if (!response.ok) {
    throw new Error(`Failed to fetch user: ${response.status}`);
  }
  return response.json();
}

function getUserResource(userId) {
  if (!resourceCache.has(userId)) {
    resourceCache.set(userId, {
      read() {
        if (!this.promise) {
          this.promise = fetchUser(userId);
        }
        if (this.result) {
          return this.result;
        }
        throw this.promise;
      }
    });
  }
  return resourceCache.get(userId);
}

function UserProfile({ userId }) {
  const resource = getUserResource(userId);
  const user = resource.read();

  return (
    

{user.name}

Email: {user.email}

Phone: {user.phone}

); } function App() { return ( Carregando dados do usuário...
}> ); } export default App;

Neste exemplo:

2. Usando use: com Server Components

O hook use: é particularmente útil em React Server Components, onde a busca de dados pode ser realizada diretamente no servidor. Isso resulta em carregamentos de página iniciais mais rápidos e SEO aprimorado.

Exemplo com um Server Component do Next.js

            
// app/user/[id]/page.jsx (Server Component no Next.js)
import React from 'react';

async function fetchUser(id) {
  const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
  if (!response.ok) {
    throw new Error(`Failed to fetch user: ${response.status}`);
  }
  return response.json();
}

export default async function UserPage({ params }) {
  const user = React.use(fetchUser(params.id));

  return (
    

{user.name}

Email: {user.email}

Phone: {user.phone}

); }

Neste server component do Next.js, a função fetchUser busca os dados do usuário no servidor. O hook use: suspende o componente até que os dados estejam disponíveis, permitindo uma renderização eficiente no lado do servidor.

Melhores Práticas para o use:

Exemplos do Mundo Real

1. Listagem de Produtos de E-commerce

Imagine um site de e-commerce exibindo listagens de produtos. Cada card de produto pode usar o use: para buscar detalhes do produto:

            
// ProductCard.jsx
import React, { Suspense } from 'react';

async function fetchProduct(productId) {
  const response = await fetch(`/api/products/${productId}`);
  if (!response.ok) {
    throw new Error(`Failed to fetch product: ${response.status}`);
  }
  return response.json();
}

function ProductCard({ productId }) {
  const product = React.use(fetchProduct(productId));

  return (
    

{product.name}

{product.description}

Price: ${product.price}

); } function ProductList({ productIds }) { return (
{productIds.map((productId) => ( Carregando produto...
}> ))}
); } export default ProductList;

Essa abordagem garante que cada card de produto carregue independentemente, e a renderização geral da página não seja bloqueada por produtos de carregamento lento. O usuário vê indicadores de carregamento individuais para cada produto, proporcionando uma experiência melhor.

2. Feed de Mídia Social

Um feed de mídia social pode usar o use: para buscar perfis de usuários, postagens e comentários:

            
// Post.jsx
import React, { Suspense } from 'react';

async function fetchPost(postId) {
  const response = await fetch(`/api/posts/${postId}`);
  if (!response.ok) {
    throw new Error(`Failed to fetch post: ${response.status}`);
  }
  return response.json();
}

async function fetchComments(postId) {
  const response = await fetch(`/api/posts/${postId}/comments`);
  if (!response.ok) {
    throw new Error(`Failed to fetch comments: ${response.status}`);
  }
  return response.json();
}

function Comments({ postId }) {
  const comments = React.use(fetchComments(postId));

  return (
    
    {comments.map((comment) => (
  • {comment.text}
  • ))}
); } function Post({ postId }) { const post = React.use(fetchPost(postId)); return (

{post.title}

{post.content}

Carregando comentários...
}>
); } export default Post;

Este exemplo usa limites de Suspense aninhados para carregar o conteúdo da postagem e os comentários de forma independente. O usuário pode ver o conteúdo da postagem enquanto os comentários ainda estão carregando.

Armadilhas Comuns e Como Evitá-las

Alternativas ao use:

Embora o use: ofereça benefícios significativos, existem abordagens alternativas para a busca de dados no React:

A escolha entre essas alternativas depende da complexidade da sua aplicação e de seus requisitos específicos. Para cenários simples de busca de dados, o use: pode ser uma ótima opção. Para cenários mais complexos, bibliotecas como useSWR ou React Query podem ser mais apropriadas.

Conclusão

O hook use: no React fornece uma maneira poderosa e declarativa de lidar com o carregamento de recursos e a busca de dados. Ao aproveitar o use: com o Suspense, você pode simplificar a lógica do seu componente, melhorar a experiência do usuário e otimizar o desempenho. Este guia cobriu os fundamentos, técnicas avançadas e melhores práticas para usar o use: em suas aplicações React. Seguindo estas diretrizes, você pode gerenciar efetivamente operações assíncronas e construir aplicações robustas, performáticas e amigáveis ao usuário. À medida que o React continua a evoluir, dominar técnicas como o use: torna-se essencial para se manter à frente e entregar experiências de usuário excepcionais.

Recursos