0Pricing
React Academy · درس

استخدام useDeferredValue لتأخير إدخال المستخدم

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

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

مرحبًا

في هذا الدرس ستستخدمون useDeferredValue لتأخير إعادة تصيير الأجزاء المكلفة من واجهة المستخدم، مع الحفاظ على سرعة استجابة حقول الإدخال المُدارة.

ما هو useDeferredValue؟

يقبل useDeferredValue قيمةً ويعيد نسخةً مؤجلةً منها. تتأخر القيمة المؤجلة عن القيمة الحالية أثناء عمليات التصيير العاجلة، مما يسمح لـ React بتحديث واجهة المستخدم على خطوتين: إدخال سريع، ثم مخرجات مكلفة مؤجلة.
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
// query updates immediately on keystroke
// deferredQuery updates when React has capacity

تطبيقه على المكونات المكلفة

مرّروا القيمة المؤجلة، وليس القيمة الحالية، إلى المكوّن المكلف. سيُعاد تصيير المكوّن المكلف فقط عندما تتغير deferredQuery، وهي تتأخر عن الإدخال عند الكتابة السريعة.
function App() {
  const [q, setQ] = useState('');
  const dq = useDeferredValue(q);
  return (
    <>
      <input value={q} onChange={e => setQ(e.target.value)} />
      <HeavyList query={dq} /> {/* renders with deferred value */}
    </>
  );
}

عرض مؤشر المحتوى القديم

قارنوا القيمة الحالية بالقيمة المؤجلة. عندما تختلفان، يكون المحتوى قديمًا، ويمكنكم تعتيمه باستخدام opacity أو عرض مؤشر تحميل.
const isStale = q !== dq;
<div style={{ opacity: isStale ? 0.5 : 1 }}>
  <HeavyList query={dq} />
</div>

useDeferredValue مقارنةً بـ debounce

يضيف debounce المعتمد على setTimeout تأخيرًا ثابتًا دائمًا، مثل 300ms، حتى على الأجهزة السريعة. أما useDeferredValue فهو متكيف؛ إذ يُصيّر المحتوى فورًا على الأجهزة السريعة ويؤجله على الأجهزة البطيئة لمنع التقطّع.

useDeferredValue مقارنةً بـ useTransition

استخدموا useTransition عندما تملكون setter الخاص بالحالة، بحيث يمكنكم تغليف setState. واستخدموا useDeferredValue عندما تتلقون قيمةً كـ prop أو من Context ولا تستطيعون التحكم في توقيت تحديثها.
// You own the state: use useTransition
startTransition(() => setTab(newTab));

// You receive the value: use useDeferredValue
const deferredProp = useDeferredValue(props.searchQuery);

الدمج مع React.memo

لكي يتمكن useDeferredValue من تخطي عمليات إعادة التصيير بفاعلية، يجب تغليف المكوّن المكلف داخل React.memo. ومن دون ذلك، سيُعاد تصيير المكوّن في كل مرة يُعاد فيها تصيير المكوّن الأب، بغض النظر عن القيمة المؤجلة.
const HeavyList = React.memo(function({ query }) {
  // expensive rendering
  return <ul>{data.filter(q => ...).map(...)}</ul>;
});

القيمة المؤجلة عند التصيير الأول

في التصيير الأول، تساوي القيمة المؤجلة القيمة الحالية؛ فلا يوجد أي تأخير. ولا يبدأ التأجيل إلا عندما تختلف القيمتان الحالية والمؤجلة أثناء إعادة التصيير.

قيم مؤجلة متعددة

يمكنكم استدعاء useDeferredValue عدة مرات لأجزاء مختلفة ومكلفة من واجهة المستخدم، بحيث يُؤجَّل كل جزء بشكل مستقل.
const deferredA = useDeferredValue(valueA);
const deferredB = useDeferredValue(valueB);

القيود

لا يجعل useDeferredValue التصيير أسرع؛ بل يؤجله فقط. فإذا استغرق التصيير المكلف 500ms، فستظل واجهة المستخدم تعاني من التقطّع. ادمجوه مع virtualization، مثل react-virtual، عند التعامل مع القوائم الكبيرة جدًا.

تحقق سريع

متى يوفّر useDeferredValue فائدةً مقارنةً بقيمة عادية؟

مراجعة

يعيد useDeferredValue نسخةً متأخرةً من القيمة. مرّروها إلى المكونات المكلفة المغلّفة بـ React.memo. اعرضوا مؤشرًا للمحتوى القديم عندما تكون `deferredValue !== value`. وفضّلوا استخدامها على debounce ذي التأخير الثابت للحصول على أداء متكيف.

التالي

الدرس التالي: **Suspense لحدود البيانات والشيفرة** — ستدمجون Suspense مع التحميل الكسول ومكتبات البيانات لإنشاء حالات تحميل واضحة.

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

هل درس «استخدام useDeferredValue لتأخير إدخال المستخدم» مجاني؟

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

ماذا ستتعلم في «استخدام useDeferredValue لتأخير إدخال المستخدم»؟

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

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

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

كم من الوقت يستغرق درس «استخدام useDeferredValue لتأخير إدخال المستخدم»؟

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

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

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

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

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