خطاف الموارد use: في React: دليل شامل | MLOG | MLOG}> {/* Assuming this ID doesn't exist and will cause an error */} ); } export default App;

في هذا المثال، إذا أطلقت دالة fetchUser خطأ (على سبيل المثال، بسبب حالة 404)، فسيلتقط المكون ErrorBoundary الخطأ ويعرض واجهة المستخدم البديلة. يمكن أن يكون البديل أي مكون React، مثل رسالة خطأ أو زر إعادة المحاولة.

تقنيات متقدمة مع use:

1. التخزين المؤقت للموارد (Caching)

لتجنب الجلب المتكرر، يمكنك تخزين المورد (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: مع مكونات الخادم

الخطاف use: مفيد بشكل خاص في مكونات خادم React، حيث يمكن إجراء جلب البيانات مباشرة على الخادم. يؤدي هذا إلى تحميل أولي أسرع للصفحات وتحسين محركات البحث (SEO).

مثال مع مكون خادم 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}

); }

في مكون الخادم هذا من Next.js، تقوم دالة fetchUser بجلب بيانات المستخدم على الخادم. يقوم الخطاف use: بتعليق المكون حتى تتوفر البيانات، مما يسمح بعرض فعال من جانب الخادم.

أفضل الممارسات لاستخدام use:

أمثلة من الواقع العملي

1. قائمة منتجات في متجر إلكتروني

تخيل موقع تجارة إلكترونية يعرض قوائم المنتجات. يمكن لكل بطاقة منتج استخدام 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. صفحة أخبار في وسائط التواصل الاجتماعي

يمكن لصفحة أخبار في وسائط التواصل الاجتماعي استخدام 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 متداخلة لتحميل محتوى المنشور والتعليقات بشكل مستقل. يمكن للمستخدم رؤية محتوى المنشور بينما لا تزال التعليقات قيد التحميل.

الأخطاء الشائعة وكيفية تجنبها

بدائل لـ use:

بينما يقدم use: فوائد كبيرة، هناك أساليب بديلة لجلب البيانات في React:

يعتمد الاختيار بين هذه البدائل على مدى تعقيد تطبيقك ومتطلباتك المحددة. لسيناريوهات جلب البيانات البسيطة، يمكن أن يكون use: خيارًا رائعًا. للسيناريوهات الأكثر تعقيدًا، قد تكون مكتبات مثل useSWR أو React Query أكثر ملاءمة.

الخاتمة

يوفر الخطاف use: في React طريقة قوية وتعريفية للتعامل مع تحميل الموارد وجلب البيانات. من خلال الاستفادة من use: مع Suspense، يمكنك تبسيط منطق المكون الخاص بك، وتحسين تجربة المستخدم، وتحسين الأداء. لقد غطى هذا الدليل الأساسيات والتقنيات المتقدمة وأفضل الممارسات لاستخدام use: في تطبيقات React الخاصة بك. باتباع هذه الإرشادات، يمكنك إدارة العمليات غير المتزامنة بفعالية وبناء تطبيقات قوية وعالية الأداء وسهلة الاستخدام. مع استمرار تطور React، يصبح إتقان تقنيات مثل use: ضروريًا للبقاء في المقدمة وتقديم تجارب مستخدم استثنائية.

المصادر