React / الأداء والحدود الموثوقة / الدرس 13
الانتقالات والعرض القابل للمقاطعة
ميز التفاعل العاجل من العرض الأقل إلحاحا وافهم الجدولة دون افتراض JavaScript متوازية.
في هذه الصفحة
أهداف الدرس
- التزامن جدولة لا حقيقة مجال
- وسم تحديث عرض ثانوي
- تفاصيل الإصدار والأفعال غير المتزامنة
التزامن جدولة لا حقيقة مجال
قد تعد React عملا بأولويات وتقاطعه للعاجل. لا تحول الحلقة لعامل خلفي ولا تبيح الأثر أثناء العرض. احفظ النقاء كي لا يترك المتروك أثرا. يصف الانتقال الجدولة لا التفويض والاكتمال. قس الاستجابة ولا تعد التزامن تسريعا شاملا؛ يبقى الحساب المتزامن الطويل حاجبا للخيط.
إبقاء ضبط الإدخال عاجلا
حدث حالة النص مباشرة ولا تجعلها انتقالية. يمكن أن يتأخر عرض نتيجة منفصل مع بقاء الإدخال. تقدم useTransition البدء والانتظار، وتؤخر useDeferredValue مستهلك قيمة لا يملك محدثها. ليستا مؤقت debounce ثابتا؛ فقد يبدأ العمل سريعا أو يتأخر ويجب بيان القديم بصدق.
وسم تحديث عرض ثانوي
يحدث المثال لوحة محلية داخل الانتقال ويبين الانتظار الذي قد لا يلاحظ لرخص المحتوى؛ فهو يشرح الملكية لا التسريع. أكد النهاية لا مدة الدوار أو عدد العروض. تنفذ دالة البدء فورا لتصنيف التحديث ولا تؤخر كودا اعتباطيا؛ فيبقى تحضير مكلف داخلها متزامنا. احفظ الإدخال ورد الفعل العاجلين منفصلين.
import { useState, useTransition } from "react";
export default function App() { const [tab, setTab] = useState("Overview"); const [pending, startTransition] = useTransition(); return <main><h1>Panels</h1><button type="button" onClick={() => startTransition(() => setTab("Details"))}>Show details</button>{pending && <p>Updating</p>}<h2>{tab}</h2></main>; }
After Show details settles: Details.
يوسَم العرض أقل إلحاحا وتثبت نهايته دون ضمان رؤية مدة الانتظار.
تأخير مستهلك مع بيان الحداثة
يبقي المثال الاستعلام فوريا ويؤخر مستهلك التصفية ويبين لحاق النتائج. البيانات صغيرة لشرح العلاقات لا الحاجة للتحسين. لا يقلل التأخير الطلبات ولا يقدم تخزينا وإلغاء. طبق هوية طبقة البيانات مستقلة. قد ينسق الانتقال تكامل Suspense، لكن وعدا عشوائيا في العرض ليس مصدرا مدعوما لمجرد إحاطته بها.
import { useDeferredValue, useState } from "react";
const names = ["Alpha", "Beta", "Gamma"];
export default function App() { const [query, setQuery] = useState(""); const deferred = useDeferredValue(query); const matches = names.filter(n => n.toLowerCase().includes(deferred.toLowerCase())); return <main><h1>Local search</h1><label>Query<input value={query} onChange={e => setQuery(e.target.value)} /></label>{query !== deferred && <p>Results catching up</p>}<ul>{matches.map(n => <li key={n}>{n}</li>)}</ul></main>; }
Typing bet eventually leaves only Beta in the results.
الكتابة عاجلة وقد يستهلك العرض استعلاما أقدم وجيزا، والأسماء ثابتة في هذه العينة.
تفاصيل الإصدار والأفعال غير المتزامنة
تدعم 19 أفعالا غير متزامنة أوسع من أمثلتنا المتزامنة المشتركة، وتوثق قيودا كوسم تحديث ما بعد await ببدء إضافي حيث يلزم وترتيب النتائج. لا تنقل مثالها إلى 18 بافتراض التطابق. قد ينسق الإطار ترتيبه وتملك المخصص سياساتها. اختبر السرعة والمقاطعة والقدم والفشل والمفاتيح؛ فالانتظار ليس إثبات تراجع بعيد أو نجاح مرة واحدة.
الأخطاء الشائعة وإصلاحها
يتأخر الحقل المضبوط
- لماذا يحدث؟
- وُسمت حالته أقل إلحاحا.
- كيف تصلحه؟
- حدثه مباشرة وأخر المستهلك.
- كيف تتجنب تكراره؟
- اختبر الكتابة مع الحمل.
يحجب البدء بحلقة طويلة
- لماذا يحدث؟
- تنفذ الدالة متزامنة.
- كيف تصلحه؟
- قلل العمل أو انقله بتصميم مناسب.
- كيف تتجنب تكراره؟
- قس زمن الخيط مستقلا.
يرسل المؤخر طلبات كثيرة
- لماذا يحدث؟
- اختلط التأخير بتجميع الشبكة.
- كيف تصلحه؟
- صمم قبول الطلب وإلغاءه.
- كيف تتجنب تكراره؟
- افصل أولوية العرض والنقل.
اختبر فهمك
1. ماذا يؤكد اختبار انتقال رخيص؟
اعرض الحل المشروح
أكد المحتوى النهائي والتفاعل العاجل ولا تفرض مدة دوار مخترعة؛ فقد ينتهي الرخيص فورا. استخدم حملا ممثلا مضبوطا لقياس الجدولة.
2. هل تنقل useDeferredValue تصفية حسابية لخيط آخر؟
اعرض الحل المشروح
لا؛ تنسق الأولوية وتسمح بعرض قديم مؤقتا، ويبقى الحساب ببيئة العرض. حسن الخوارزمية أو استخدم عاملا إذا تطلب التوازي.
أهم ما تعلمته
- تختلف الأولوية من التنفيذ المتوازي.
- أبق ضبط الإدخال عاجلا.
- دلالات الانتقال غير المتزامن مرتبطة بالإصدار.