محتويات الدورة

React / الأداء والحدود الموثوقة / الدرس 14

التنميط وMemo المقصودة

قس تفاعلا ممثلا وحدد المكلف واستخدم تحسين الهوية حيث يفيد فعليا.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تحديد سؤال الأداء
  • تخزين حساب مشتق نقي
  • التحقق من المكاسب والموارد الباقية

تحديد سؤال الأداء

ابدأ بمقياس كاستجابة الكتابة أو التنقل وسجل الإصدار والبناء والجهاز والبيانات. قد يشوه التطوير وStrict Mode الزمن فاستخدم إعداد قياس مناسب. العرض جزء من الشبكة والحساب والتخطيط والرسم؛ لا يعني التكرار الكلفة ولا يمنع عرض واحد الحجب. قس قبل تحسين ما يبدو معقدا.

الهوية عقد بمفاضلات

قد تتخطى memo عرضا يقوده الأب عند تساوي الخصائص، ولا تضمن ذلك دلاليا. تحدثها حالتها وسياقها، وقد تهزم الهوية الجديدة المقارنة. بسط المدخل والملكية قبل التخزين. يجب أن يحفظ المقارن السلوك وردود النداء لا النص فقط حتى لا يحتفظ بمعالج قديم، وقد تزيد كلفته عن العرض المتجنب.

تخزين حساب مشتق نقي

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

jsx وحدة مكون — تتطلب مضيف React الموضح بالمقرر
import { useMemo, useState } from "react";
const items = [{ id: "a", label: "Alpha", cost: 2 }, { id: "b", label: "Beta", cost: 3 }];
export default function App() { const [query, setQuery] = useState(""); const total = useMemo(() => items.filter(x => x.label.toLowerCase().includes(query.toLowerCase())).reduce((n, x) => n + x.cost, 0), [query]); return <main><h1>Filtered total: {total}</h1><label>Query<input value={query} onChange={e => setQuery(e.target.value)} /></label></main>; }
الناتج المتوقع
Initial total: 5. Query bet: total 3.

الحساب نقي ويتبع query ويحفظ حذف التخزين النتيجة، والبيانات ثابتة للفحص.

مدخلات مستقرة عند الفائدة

يغلف المثال عرضا بـmemo ويمرر تسمية بدائية لا يغيرها عداد آخر، دون جعل عد العروض نتيجة عامة. تثبت useCallback هوية حيث تهم ولا تصلح عدم النقاء. قد تؤتمت أدوات React Compiler بعض التخزين عند إعدادها، ولا يثبت الإصدار تفعيلها. وضح البناء ولا توزع memo أو وعود الأتمتة في كل مكان.

jsx وحدة مكون — تتطلب مضيف React الموضح بالمقرر
import { memo, useState } from "react";
const Label = memo(function Label({ text }) { return <p>{text}</p>; });
export default function App() { const [count, setCount] = useState(0); return <main><h1>Stable prop boundary</h1><Label text="Fixed label" /><button type="button" onClick={() => setCount(c => c + 1)}>Unrelated count {count}</button></main>; }
الناتج المتوقع
The label stays Fixed label while the button count increases.

لا تغير الزيادة خاصية الابن، وقد تتجنب memo عملا دون أن يعتمد العقد على عد العرض.

التحقق من المكاسب والموارد الباقية

أعد التفاعل بعد تغيير واحد وقارن المقياس والذاكرة والتعقيد واحذف غير المفيد. ادرس تقليل البيانات والترقيم أو افتراضية مراجعة مع إتاحة بدل حفظ كل الصفوف. افحص الاشتراكات والإغلاقات عند النمو. احفظ الاختبارات؛ فإسقاط الصفوف أو الأخطاء يغير المهمة لا يحسنها.

الأخطاء الشائعة وإصلاحها

يخفي التخزين عيب صحة

لماذا يحدث؟
للحساب آثار أو حالة خفية.
كيف تصلحه؟
استعد النقاء والملكية.
كيف تتجنب تكراره؟
اختبر دون التحسين.

يحفظ المقارن معالجا قديما

لماذا يحدث؟
قارن العرض وأغفل السلوك.
كيف تصلحه؟
صحح المعنى أو احذفه.
كيف تتجنب تكراره؟
اختبر بعد تغير المدخل.

يُفترض تفعيل المترجم بالترقية

لماذا يحدث؟
اختلط الإصدار بالأداة.
كيف تصلحه؟
افحص الإعداد الفعلي.
كيف تتجنب تكراره؟
وثق افتراض القياس.

اختبر فهمك

1. لماذا قد يضعف كائن جديد memo رغم ثبات حقوله؟

اعرض الحل المشروح

تقارن الافتراضية الهوية فيختلف الكائن الجديد. ادرس مدخلات بدائية أو موضع الإنشاء، ثم خزن الهوية لفائدة مقيسة واعتماديات صحيحة.

2. خفض تغيير الزمن بحذف صفوف الخطأ. هل هو تحسين صحيح؟

اعرض الحل المشروح

لا إلا إذا تغير العقد صراحة. احفظ النتائج والتعافي قبل المقارنة، وإلا قست عملا أقل لنتيجة مختلفة لا تسريعا أمينا.

أهم ما تعلمته

  • قس قبل memo.
  • المخازن أدوات أداء اختيارية.
  • احفظ السلوك واحسب الموارد.

المراجع الرسمية