React's use: Resource Hook: Een Uitgebreide Handleiding | MLOG | MLOG

In dit voorbeeld, als de fetchUser functie een fout gooit (bijv. vanwege een 404 status), zal de ErrorBoundary component de fout opvangen en de fallback UI weergeven. De fallback kan elke React component zijn, zoals een foutmelding of een retry button.

Geavanceerde Technieken met use:

1. Resources Cachen

Om redundante ophaling te vermijden, kun je de resource (Promise) cachen en hergebruiken over meerdere componenten of renders. Deze optimalisatie is cruciaal voor prestaties.

            
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 ( Loading user data...
}> ); } export default App;

In dit voorbeeld:

2. use: Gebruiken met Server Components

De use: hook is bijzonder nuttig in React Server Components, waar data-ophaling direct op de server kan worden uitgevoerd. Dit resulteert in snellere initiƫle page loads en verbeterde SEO.

Voorbeeld met Next.js Server Component

            
// app/user/[id]/page.jsx (Server Component in 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}

); }

In deze Next.js server component haalt de fetchUser functie gebruikersdata op de server op. De use: hook schort de component op totdat de data beschikbaar is, waardoor efficiƫnte server-side rendering mogelijk is.

Best Practices voor use:

Real-World Voorbeelden

1. E-commerce Product Listing

Stel je een e-commerce website voor die product listings weergeeft. Elke product card kan use: gebruiken om productdetails op te halen:

            
// 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) => ( Loading product...
}> ))}
); } export default ProductList;

Deze aanpak zorgt ervoor dat elke product card onafhankelijk laadt, en de algehele page rendering wordt niet geblokkeerd door langzaam ladende producten. De gebruiker ziet individuele laadindicatoren voor elk product, wat een betere ervaring biedt.

2. Social Media Feed

Een social media feed kan use: gebruiken om user profiles, posts en comments op te halen:

            
// 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}

Loading comments...
}>
); } export default Post;

Dit voorbeeld gebruikt geneste Suspense boundaries om de post content en comments onafhankelijk te laden. De gebruiker kan de post content zien terwijl de comments nog laden.

Veelvoorkomende Valkuilen en Hoe Ze Te Vermijden

Alternatieven voor use:

Hoewel use: aanzienlijke voordelen biedt, zijn er alternatieve benaderingen voor data-ophaling in React:

De keuze tussen deze alternatieven hangt af van de complexiteit van je applicatie en je specifieke vereisten. Voor eenvoudige data-ophalingsscenario's kan use: een geweldige optie zijn. Voor meer complexe scenario's kunnen libraries zoals useSWR of React Query geschikter zijn.

Conclusie

De use: hook in React biedt een krachtige en declaratieve manier om resource loading en data-ophaling af te handelen. Door use: te gebruiken met Suspense, kun je je componentlogica vereenvoudigen, de gebruikerservaring verbeteren en de prestaties optimaliseren. Deze handleiding heeft de basisprincipes, geavanceerde technieken en best practices voor het gebruik van use: in je React applicaties behandeld. Door deze richtlijnen te volgen, kun je asynchrone operaties effectief beheren en robuuste, performante en gebruiksvriendelijke applicaties bouwen. Naarmate React zich blijft ontwikkelen, wordt het beheersen van technieken zoals use: essentieel om voorop te blijven lopen en uitzonderlijke gebruikerservaringen te leveren.

Resources