0Pricing
React Academy · درس

استخدام useTransition لتحديثات واجهة غير حاجبة

غلّف تحديثات الحالة المكلفة داخل startTransition للحفاظ على استجابة الواجهة.

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

مرحبًا

في هذا الدرس ستستخدمون hook المسمى useTransition لوضع علامة على تحديثات الحالة المكلفة باعتبارها غير عاجلة، مما يحافظ على استجابة واجهة المستخدم أثناء تنفيذ التصيير المكثف في الخلفية.

مشكلة التحديث الحاجب

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

وضع React للعرض المتزامن

قدّم React 18 العرض المتزامن: يستطيع React بدء تصيير تحديث للحالة، ثم إيقافه مؤقتًا، ومنح الأولوية للتحديثات الأكثر إلحاحًا، مثل الكتابة. وuseTransition هو hook الذي يتيح لكم تصنيف التحديثات على أنها انتقالات منخفضة الأولوية.

أساسيات useTransition

يعيد useTransition القيمة `[isPending, startTransition]`. غلّفوا تحديث الحالة غير العاجل داخل `startTransition()`. سيمنح React الأولوية للتحديثات الأخرى، مثل حقل الإدخال المُدار، على حساب الانتقال.
const [isPending, startTransition] = useTransition();

const handleChange = (e) => {
  setInputValue(e.target.value); // urgent: update input immediately
  startTransition(() => {
    setFilteredList(filter(e.target.value)); // non-urgent
  });
};

استخدام isPending لواجهة التحميل

أثناء معالجة الانتقال، تكون `isPending` مساويةً للقيمة `true`. استخدموها لعرض مؤشر تحميل أو لتعتيم قائمة النتائج القديمة، كي يعرف المستخدمون أن تحديثًا قيد التنفيذ.
return (
  <>
    <input value={inputValue} onChange={handleChange} />
    {isPending && <Spinner />}
    <ResultList items={filteredList} />
  </>
);

ما يوضع داخل startTransition

ضعوا تحديثات الحالة فقط داخل startTransition، وليس العمليات غير المتزامنة. فتحديث الحالة الذي يطلق التصيير المكلف هو ما ينبغي تغليفه.
// Correct
startTransition(() => setTab('heavy'));

// Wrong — async work outside React state
startTransition(async () => { await fetch(...); }); // not supported

استخدام startTransition من دون hook

إذا لم تكونوا بحاجة إلى `isPending`، يمكنكم استيراد startTransition واستدعاؤه مباشرةً من React من دون استخدام hook.
import { startTransition } from 'react';

startTransition(() => setQuery(newValue));

مثال على التبديل بين علامات التبويب

من حالات الاستخدام الشائعة أن يؤدي النقر على علامة تبويب إلى تبديل مكوّن ثقيل. غلّفوا تغيير علامة التبويب داخل startTransition، كي يتحدث مؤشر علامة التبويب النشطة فورًا بينما يُصيّر المكوّن الثقيل في الخلفية.
const [tab, setTab] = useState('posts');
const [isPending, startTransition] = useTransition();

const selectTab = (t) =>
  startTransition(() => setTab(t));

useTransition مقارنةً بـ useDeferredValue

استخدموا useTransition عندما تكونون مالكي تحديث الحالة، أي عندما تستدعون setState. واستخدموا useDeferredValue عندما تتلقون prop أو قيمة لا يمكنكم تأخيرها مباشرةً؛ إذ يؤخر القيمة نفسها.

ليس بديلًا عن التحسين

لا يجعل startTransition التصيير أسرع؛ بل يؤجله فقط. فإذا استغرق تصيير مكوّن 500ms، فسيظل يستغرق 500ms. ادمجوه مع React.memo أو virtualization عند التعامل مع القوائم البطيئة فعلًا.

تحقق سريع

ماذا تمثّل isPending التي يعيدها useTransition؟

مراجعة

يتيح لكم useTransition تصنيف تحديثات الحالة على أنها انتقالات غير عاجلة. تُصيّر التحديثات العاجلة، مثل الإدخال، فورًا؛ أما الانتقالات فتُصيّر عندما تتوفر لدى React القدرة على ذلك. استخدموا isPending لعرض مؤشر التحميل.

التالي

الدرس التالي: **useDeferredValue لتأخير إعادة تصيير الإدخال** — ستؤخرون إعادة تصيير الأجزاء البطيئة من واجهة المستخدم مع الحفاظ على سرعة استجابة الإدخال.

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

هل درس «استخدام useTransition لتحديثات واجهة غير حاجبة» مجاني؟

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

ماذا ستتعلم في «استخدام useTransition لتحديثات واجهة غير حاجبة»؟

غلّف تحديثات الحالة المكلفة داخل startTransition للحفاظ على استجابة الواجهة. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «استخدام useTransition لتحديثات واجهة غير حاجبة»؟

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

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

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

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

  1. حالات التنافس وتنظيف Effect
  2. استخدام useTransition لتحديثات واجهة غير حاجبة
  3. استخدام useDeferredValue لتأخير إدخال المستخدم
  4. استخدام Suspense لحدود البيانات والتعليمات البرمجية
← العودة إلى React Academy