Reactov `use:` hook: Sveobuhvatan vodič | MLOG | MLOG}> {/* Assuming this ID doesn't exist and will cause an error */} ); } export default App;

U ovom primjeru, ako funkcija fetchUser baci pogrešku (npr. zbog statusa 404), komponenta ErrorBoundary će uhvatiti pogrešku i prikazati zamjensko sučelje. Zamjensko sučelje može biti bilo koja React komponenta, poput poruke o pogrešci ili gumba za ponovni pokušaj.

Napredne tehnike s use: hookom

1. Predmemoriranje (caching) resursa

Kako biste izbjegli suvišno dohvaćanje, možete predmemorirati resurs (Promise) i ponovno ga koristiti u više komponenti ili renderiranja. Ova optimizacija je ključna za performanse.

            
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;

U ovom primjeru:

2. Korištenje use: sa Server Components

Hook use: je posebno koristan u React Server Components, gdje se dohvaćanje podataka može izvršiti izravno na poslužitelju. To rezultira bržim početnim učitavanjem stranice i poboljšanim SEO-om.

Primjer s 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}

); }

U ovoj Next.js serverskoj komponenti, funkcija fetchUser dohvaća korisničke podatke na poslužitelju. Hook use: suspendira komponentu dok podaci ne postanu dostupni, omogućujući učinkovito renderiranje na strani poslužitelja.

Najbolje prakse za use:

Primjeri iz stvarnog svijeta

1. Popis proizvoda u e-trgovini

Zamislite web stranicu e-trgovine koja prikazuje popise proizvoda. Svaka kartica proizvoda može koristiti use: za dohvaćanje detalja o proizvodu:

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

Ovaj pristup osigurava da se svaka kartica proizvoda učitava neovisno, a cjelokupno renderiranje stranice nije blokirano sporim učitavanjem proizvoda. Korisnik vidi pojedinačne indikatore učitavanja za svaki proizvod, što pruža bolje iskustvo.

2. Feed na društvenim mrežama

Feed na društvenim mrežama može koristiti use: za dohvaćanje korisničkih profila, objava i komentara:

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

Ovaj primjer koristi ugniježđene granice Suspensea za neovisno učitavanje sadržaja objave i komentara. Korisnik može vidjeti sadržaj objave dok se komentari još uvijek učitavaju.

Uobičajene zamke i kako ih izbjeći

Alternative za use:

Iako use: nudi značajne prednosti, postoje alternativni pristupi dohvaćanju podataka u Reactu:

Izbor između ovih alternativa ovisi o složenosti vaše aplikacije i vašim specifičnim zahtjevima. Za jednostavne scenarije dohvaćanja podataka, use: može biti odlična opcija. Za složenije scenarije, biblioteke poput useSWR ili React Queryja mogu biti prikladnije.

Zaključak

Hook use: u Reactu pruža moćan i deklarativan način za rukovanje učitavanjem resursa i dohvaćanjem podataka. Korištenjem use: sa Suspenseom, možete pojednostaviti logiku svoje komponente, poboljšati korisničko iskustvo i optimizirati performanse. Ovaj vodič je pokrio osnove, napredne tehnike i najbolje prakse za korištenje use: u vašim React aplikacijama. Slijedeći ove smjernice, možete učinkovito upravljati asinkronim operacijama i graditi robusne, performantne i korisnički prijateljske aplikacije. Kako se React nastavlja razvijati, ovladavanje tehnikama poput use: postaje ključno za ostajanje u toku i pružanje izvanrednih korisničkih iskustava.

Resursi