React hook `use`: Komplexný sprievodca | MLOG | MLOG}> {/* Assuming this ID doesn't exist and will cause an error */} ); } export default App;

V tomto príklade, ak funkcia fetchUser vyvolá chybu (napr. z dôvodu stavu 404), komponent ErrorBoundary chybu zachytí a zobrazí fallbackové UI. Fallback môže byť akýkoľvek React komponent, napríklad chybová správa alebo tlačidlo na opakovanie pokusu.

Pokročilé techniky s use

1. Cachovanie zdrojov

Aby ste sa vyhli redundantnému načítavaniu, môžete zdroj (Promise) cachovať a opakovane ho používať vo viacerých komponentoch alebo renderoch. Táto optimalizácia je kľúčová pre výkon.

            
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;

V tomto príklade:

2. Použitie use so serverovými komponentmi

Hook use je obzvlášť užitočný v React Server Components, kde sa načítavanie dát môže vykonávať priamo na serveri. To vedie k rýchlejšiemu počiatočnému načítaniu stránky a zlepšenému SEO.

Príklad so serverovým komponentom v Next.js

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

); }

V tomto serverovom komponente Next.js funkcia fetchUser načítava dáta používateľa na serveri. Hook use pozastaví komponent, kým nie sú dáta dostupné, čo umožňuje efektívne renderovanie na strane servera.

Osvedčené postupy pre use

Príklady z praxe

1. Zoznam produktov v e-shope

Predstavte si webovú stránku e-shopu, ktorá zobrazuje zoznamy produktov. Každá karta produktu môže použiť use na načítanie detailov produktu:

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

Tento prístup zaisťuje, že každá karta produktu sa načíta nezávisle a celkové renderovanie stránky nie je blokované pomaly sa načítavajúcimi produktmi. Používateľ vidí individuálne indikátory načítavania pre každý produkt, čo poskytuje lepší zážitok.

2. Feed sociálnej siete

Feed sociálnej siete môže použiť use na načítanie profilov používateľov, príspevkov a komentárov:

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

Tento príklad používa vnorené hranice Suspense na nezávislé načítanie obsahu príspevku a komentárov. Používateľ môže vidieť obsah príspevku, zatiaľ čo sa komentáre ešte načítavajú.

Bežné nástrahy a ako sa im vyhnúť

Alternatívy k use

Hoci use ponúka významné výhody, existujú aj alternatívne prístupy k načítavaniu dát v Reacte:

Voľba medzi týmito alternatívami závisí od zložitosti vašej aplikácie a vašich špecifických požiadaviek. Pre jednoduché scenáre načítavania dát môže byť use skvelou voľbou. Pre zložitejšie scenáre môžu byť vhodnejšie knižnice ako useSWR alebo React Query.

Záver

Hook use v Reacte poskytuje výkonný a deklaratívny spôsob na spracovanie načítavania zdrojov a dát. Využitím use so Suspense môžete zjednodušiť logiku svojich komponentov, zlepšiť používateľský zážitok a optimalizovať výkon. Tento sprievodca pokryl základy, pokročilé techniky a osvedčené postupy pre používanie use vo vašich React aplikáciách. Dodržiavaním týchto usmernení môžete efektívne spravovať asynchrónne operácie a vytvárať robustné, výkonné a používateľsky prívetivé aplikácie. Keďže sa React neustále vyvíja, zvládnutie techník ako use sa stáva nevyhnutným pre udržanie si náskoku a poskytovanie výnimočných používateľských zážitkov.

Zdroje