0Pricing
React Academy · درس

‏use() للموارد غير المتزامنة

اقرأ الوعود والسياق أثناء التصيير باستخدام hook ‏use() في React 19.

‏use() للموارد غير المتزامنة درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

مرحبًا

في هذا الدرس ستستخدمون hook ‏use() في React 19 لقراءة الوعود وقيم السياق مباشرةً داخل دالة العرض، مما يبسّط الوصول إلى البيانات غير المتزامنة.

ما هو use()؟

‏use() هو hook في React 19 يقرأ موردًا — إما Promise أو Context — بشكل متزامن داخل دالة العرض. وإذا كان Promise في حالة انتظار، يعلّق المكوّن عمله، ويعرض أقرب حد Suspense قيمة fallback الخاصة به.
import { use } from 'react';

function UserProfile({ userPromise }) {
  const user = use(userPromise); // suspends if pending
  return <h1>{user.name}</h1>;
}

تمرير الوعود كـ props

من الأنماط الشائعة في React 19 أن ينشئ مكوّن الخادم Promise (مثل استعلام DB)، ويمرّره إلى مكوّن العميل، ثم يقرأه مكوّن العميل باستخدام use(). ويمكن أن يوجد حد Suspense في أي موضع أعلى منه.
// Server Component
export default function Page() {
  const userPromise = fetchUser(1); // NOT awaited
  return (
    <Suspense fallback={<Spinner />}>
      <Profile userPromise={userPromise} />
    </Suspense>
  );
}

// Client Component
'use client';
export function Profile({ userPromise }) {
  const user = use(userPromise);
  return <p>{user.name}</p>;
}

use() مقابل useEffect للبيانات

يتطلب جلب البيانات باستخدام useEffect إدارة حالتي التحميل والخطأ يدويًا. أما استخدام use() مع Suspense فيزيل كل هذا الكود المتكرر، إذ يقرأ جسم المكوّن البيانات كما لو كانت متزامنة.

use() للسياق

يمكن لـ use() أيضًا قراءة قيم السياق، تمامًا مثل useContext. والفرق هو أن use() يمكن استدعاؤه بشكل مشروط (داخل if أو الحلقات)، بخلاف useContext الذي يتبع Rules of Hooks.
import { use } from 'react';
import { ThemeContext } from './ThemeContext';

function Button({ danger }) {
  if (danger) {
    const theme = use(ThemeContext); // conditional — allowed with use()!
    return <button style={{ color: theme.red }}>Delete</button>;
  }
  return <button>Click</button>;
}

التعامل مع الأخطاء باستخدام ErrorBoundary

إذا رُفض Promise المُمرَّر إلى use()، فإن React يرمي الخطأ. غلّفوا المكوّن باستخدام ErrorBoundary لالتقاط الخطأ وعرض قيمة fallback.
<ErrorBoundary fallback={<Error />}>
  <Suspense fallback={<Loading />}>
    <Profile userPromise={fetchUser(id)} />
  </Suspense>
</ErrorBoundary>

use() في مكوّنات العميل فقط

يعمل use() مع Promise في مكوّنات العميل. أما في مكوّنات الخادم، فاستخدموا async/await مباشرةً، إذ لا حاجة إلى استخدام use() مع Promises على الخادم.

تخزين الوعود مؤقتًا

إذا أُعيد عرض المكوّن، فيجب أن يتلقى مرجع Promise نفسه لتجنب إعادة الجلب. أنشئوا Promises خارج المكوّن أو في موقع ثابت (الخادم أو cache أو الحالة)، ومرّروها كـ props.

البث باستخدام use()

يتيح دمج use() مع SSR المتدفق لـ React بث HTML الصفحة، وعرض قيمة fallback الخاصة بـ Suspense، ثم بث المحتوى الذي اكتمل تحميله فور حل Promise، وكل ذلك عبر اتصال HTTP واحد.

‏React.cache() لإزالة التكرار

على الخادم، تعمل React.cache() (أو unstable_cache في Next.js) على إزالة التكرار بين الاستدعاءات المتعددة للدالة غير المتزامنة نفسها أثناء عملية تصيير واحدة، لذلك لا تُستدعى قاعدة البيانات إلا مرة واحدة حتى إذا استخدمت مكوّنات متعددة الـ promise نفسه.

تحقّق سريع

ماذا يفعل Client Component عند استدعاء use(promise) بينما لا يزال الـ promise قيد الانتظار؟

مراجعة

تقرأ use(promise) البيانات غير المتزامنة بشكل متزامن أثناء التصيير، وتعلّق التنفيذ إذا كانت البيانات قيد الانتظار. تعمل use(context) بشكل شرطي، بخلاف useContext. احرص دائمًا على إقرانها بـ Suspense لحالة التحميل وErrorBoundary لمعالجة الأخطاء.

التالي

الدرس التالي: **React Actions و useActionState** — ستعرّفون إجراءات الخادم والعميل، وستتعاملون مع إرسال النماذج مع حالة الانتظار.

الأسئلة الشائعة

هل درس «‏use() للموارد غير المتزامنة» مجاني؟

نعم — نص درس «‏use() للموارد غير المتزامنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏use() للموارد غير المتزامنة»؟

اقرأ الوعود والسياق أثناء التصيير باستخدام hook ‏use() في React 19. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «‏use() للموارد غير المتزامنة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. شرح مكوّنات React على الخادم
  2. ‏use() للموارد غير المتزامنة
  3. إجراءات React وuseActionState
  4. ‏useOptimistic للاستجابة الفورية
← العودة إلى React Academy