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

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

واجهات المكونات وHooks المخصصة

صمم عقودا صغيرة تحفظ الملكية والإتاحة وقواعد Hooks مع تطور التنفيذ.

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

أهداف الدرس

  • تشمل الواجهة السلوك والملكية
  • عرض النية بمكون مضبوط
  • تطوير العقد العام بالدليل

تشمل الواجهة السلوك والملكية

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

اختيار نمطي التحكم عن قصد

يتلقى المضبوط القيمة ورد التغيير، ويملك غير المضبوط البداية المحلية. قد تدعم الاثنين بعقد تهيئة وتحويل ورد واضح لا مصدري حقيقة. لا تنسخ prop لحالة وEffect دون حاجة. قد يوضح حد هوية إعادة سجل، وأبق القيود لدى مالك ينسق كل التحكمات.

عرض النية بمكون مضبوط

يطلب Stepper الزيادة ويملك الأب العدد دون نسخة أو تعديل prop. زره أصلي ونوعه صريح وتعرض التسمية القيمة. أضف حدودا أو تعطيلًا فقط بعقد واختبارات. لا تجعل الرد يعني الطلب وتأكيد الحفظ معا؛ افصل النية من النتيجة كي لا يفترض المستهلك أثرا لم يحدث.

jsx وحدة مكون — تتطلب مضيف React الموضح بالمقرر
import { useState } from "react";
function Stepper({ value, onIncrement }) { return <button type="button" onClick={onIncrement}>Increase from {value}</button>; }
export default function App() { const [count, setCount] = useState(0); return <main><h1>Controlled API</h1><Stepper value={count} onIncrement={() => setCount(c => c + 1)} /></main>; }
الناتج المتوقع
Initial button: Increase from 0. After click: Increase from 1.

الأب مالك الحالة الوحيد ويبلغ الابن النية برده.

تشارك Hooks المنطق لا نسخ الحالة

يستخرج المثال useCounter ويستدعيه مرتين فتستقل الحالة؛ يشارك المنطق لا نسخة عامة. تستدعى Hooks العادية بترتيب علوي ثابت قبل خروج يتخطاها لا بمعالج وحلقة ودالة عادية. لـuse الخاصة استثناءات موثقة بإصدارات داعمة ولا تبيحها لـuseState وuseEffect. سم المخصص وأكمل اعتمادياته وتنظيفه.

jsx وحدة مكون — تتطلب مضيف React الموضح بالمقرر
import { useState } from "react";
function useCounter() { const [count, setCount] = useState(0); return { count, increment: () => setCount(c => c + 1) }; }
function Counter({ label }) { const { count, increment } = useCounter(); return <button type="button" onClick={increment}>{label}: {count}</button>; }
export default function App() { return <main><h1>Independent Hook calls</h1><Counter label="A" /><Counter label="B" /></main>; }
الناتج المتوقع
Initial: A: 0 and B: 0. Clicking A changes only A to 1.

يستدعي الاثنان المنطق نفسه بحالتين مستقلتين.

تطوير العقد العام بالدليل

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

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

يشارك Hook بيانات عامة فجأة

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

يتغير ترتيب Hooks بعد خروج

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

للتحكم قيمتان متنافستان

لماذا يحدث؟
تملك props والمحلية السلطة.
كيف تصلحه؟
حدد النمط صراحة.
كيف تتجنب تكراره؟
اختبر التهيئة وتحديث المالك.

اختبر فهمك

1. لماذا لا يجعل استخراج useCounter العدادين مشتركين؟

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

تنتمي كل دعوة لنسخة وموضع؛ يعاد المنطق لا التخزين. للمشاركة ارفع الحالة أو استخدم تكاملا مشتركا محدد النطاق.

2. ماذا توثق قبل إضافة onSave غير متزامنة؟

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

حدد مالك الانتظار والوعد والرفض والتكرار والإلغاء ومعنى النجاح، وأوضح التحقق والتفويض. لا يكفي الاسم لضمان العمر والثقة.

أهم ما تعلمته

  • تشمل إعادة الاستخدام الملكية والدلالة.
  • تشارك Hooks المنطق باستقلال الحالة.
  • تتطلب Hooks العادية ترتيبا ثابتا.

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