customRef() تخصيص سلوك القراءة والكتابة لـ ref
آخر تحديث: 2026-10-22
customRef() تخصيص سلوك القراءة والكتابة لـ ref
تتيح customRef() تخصيص تتبع الاعتماديات وتوقيت الإطلاق عبر دالة مصنع، والاستخدام النموذجي لها هو إضافة debounce لحقل الإدخال.
| المجموعة | التفاعلية: المتقدم |
|---|---|
| النوع | API |
| النطاق | داخل المكوّن |
| إصدار Vue | 3.0+ |
| دعم SSR | مدعوم |
📝 الصيغة
function useDebounced(value, delay) {
return customRef((track, trigger) => ({
get() { track(); return value },
set(v) { clearTimeout(timer); timer = setTimeout(() => { value = v; trigger() }, delay) }
}))
}
⚙️ الوسائط
| factory | (track, trigger) => { get, set }، حيث تجمع track الاعتماديات وتُبلّغ trigger بالتحديث |
|---|
القيمة المُرجعة:ref بسلوك مخصص
▶ مثال
عدّل الشيفرة أدناه وشاهد النتيجة مباشرة:
المخرجات:
Typing fast updates the line only after a 400ms pause — intermediate states are merged.
💡 نقاط مهمة
⚠️ تحذير يجب استدعاء track() وtrigger(): فإغفال track يُفقد جمع الاعتماديات، وإغفال trigger يمنع إطلاق التحديث.
💡 نصيحة تغليفها داخل دالة تركيبية (مثل useDebounced) لإعادة استخدامها هو الاستخدام القياسي لـ customRef.
ℹ️ ملاحظة مناسبة لاستراتيجيات المزامنة المخصصة مثل منع التكرار (debounce) وخنق المعدل (throttle) ونماذج الإدخال ذات التحقق.
🏷️ المتقدم ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قريباً.
📚 دروس ذات صلة
❓ الأسئلة الشائعة
س لماذا يجب تتبع الاعتماديات يدويًا بـ track؟
ج منحك customRef تحكمًا كاملًا: قرار متى تُجمع الاعتماديات ومتى يُطلق الإشعار لك، لذا يجب التصريح به صراحة.
س هل من الضروري استخدامها في سيناريو debounce؟
ج ليست ضرورية: يمكن أيضًا استخدام watch مع setTimeout لصيانة ref عادي يدويًا، لكن صيغة customRef أكثر تماسكًا.
س هل يمكنها تحقيق خنق المعدل (throttle)؟
ج نعم، يكفي التحكم في set بتنفيذ المرة الأولى فورًا وإطلاق اللاحقة وفق فاصل زمني.