React use: Resource Hook: Изчерпателно Ръководство | MLOG | MLOG}> {/* Assuming this ID doesn't exist and will cause an error */} ); } export default App;

В този пример, ако функцията fetchUser хвърли грешка (например, поради 404 статус), компонентът ErrorBoundary ще улови грешката и ще покаже резервния UI. Fallback може да бъде всеки React компонент, като например съобщение за грешка или бутон за повторен опит.

Разширени техники с use:

1. Кеширане на ресурси

За да избегнете излишно извличане, можете да кеширате ресурса (Promise) и да го използвате повторно в множество компоненти или изобразявания. Тази оптимизация е от решаващо значение за производителността.

            
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;

В този пример:

2. Използване на use: със Server Components

use: hook е особено полезен в React Server Components, където извличането на данни може да се извърши директно на сървъра. Това води до по-бързо първоначално зареждане на страницата и подобрено SEO.

Пример с 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}

); }

В този Next.js сървърен компонент, функцията fetchUser извлича потребителски данни на сървъра. use: hook спира компонента, докато данните не са налични, позволявайки ефективно рендиране от страна на сървъра.

Най-добри практики за use:

Реални примери

1. E-commerce Product Listing

Представете си уебсайт за електронна търговия, показващ списъци с продукти. Всяка продуктова карта може да използва use: за извличане на подробности за продукта:

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

Този подход гарантира, че всяка продуктова карта се зарежда независимо и цялостното рендиране на страницата не е блокирано от бавно зареждащи се продукти. Потребителят вижда индивидуални индикатори за зареждане за всеки продукт, осигурявайки по-добро изживяване.

2. Social Media Feed

Социална медийна емисия може да използва use: за извличане на потребителски профили, публикации и коментари:

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

Този пример използва вложени Suspense boundaries за зареждане на съдържанието на публикацията и коментарите независимо. Потребителят може да види съдържанието на публикацията, докато коментарите все още се зареждат.

Често срещани грешки и как да ги избегнете

Алтернативи на use:

Въпреки че use: предлага значителни предимства, има алтернативни подходи за извличане на данни в React:

Изборът между тези алтернативи зависи от сложността на вашето приложение и вашите специфични изисквания. За прости сценарии за извличане на данни, use: може да бъде чудесен вариант. За по-сложни сценарии, библиотеки като useSWR или React Query може да са по-подходящи.

Заключение

use: hook в React предоставя мощен и декларативен начин за обработка на зареждането на ресурси и извличането на данни. Чрез използването на use: със Suspense, можете да опростите логиката на вашия компонент, да подобрите потребителското изживяване и да оптимизирате производителността. Това ръководство обхвана основите, разширените техники и най-добрите практики за използване на use: във вашите React приложения. Следвайки тези указания, можете ефективно да управлявате асинхронни операции и да изграждате стабилни, производителни и удобни за потребителя приложения. Тъй като React продължава да се развива, овладяването на техники като use: става от съществено значение, за да останете напред и да предоставяте изключителни потребителски изживявания.

Ресурси