Vue / الأساسي: المكوّنات التفاعلية وعقود الإدخال / الدرس 4
القيم المحسوبة والمراقبات المقصودة
افصل الحالة المشتقة عن الآثار واختر مصادر تفاعلية تعبّر عن اعتماد العملية الحقيقي.
في هذه الصفحة
أهداف الدرس
- استخدم computed للقيم المشتقة الخالصة.
- اشرح مصادر watch والتوقيت وحدود التنظيف.
اشتق القيمة بدلاً من مزامنة نسخها
تصف computed نتيجة من مدخلات تفاعلية، ويخزنها Vue وفق الاعتماد ويعيد تقييمها عند الحاجة. تختلف عن دالة تستدعى بكل عرض. اجعل getter خالصاً بلا طلب أو تعديل مصدر أو كتابة مرجع أثناء حساب العرض. لا تحتاج القائمة المرشحة عادة مراقبة تنسخها لثانية. يقلل المصدر الواحد والاشتقاق الواضح التناقض ويسهل المراجعة والاختبار.
اجعل علاقة العرض صريحة
يشتق المثال عدد غير المنتهي من قائمة يملكها المكوّن ويفك القالب واجهته المرجعية. يغير finished عبر القائمة التفاعلية العدد دون إعادة عد يدوية. يعيد getter رقماً ولا يعدل القائمة. إذا جاء المصدر من خاصية أو مخزن فاحفظ الملكية واشتق العرض لا تعدل مجموعة غيرك. قس المكلف قبل مخابئ إضافية قد تخفي مدخلاً قديماً بمفتاح خاطئ.
<script setup>
import { ref, computed } from "vue"
const notes = ref([
{ id: "n1", finished: false },
{ id: "n2", finished: true }
])
const unfinishedCount = computed(() =>
notes.value.filter(note => !note.finished).length
)
</script>
<template>
<p>Unfinished: {{ unfinishedCount }}</p>
</template>
تنتج البيانات Unfinished: 1 في مشروع مضبوط، ويجعل إنهاء n1 العدد صفراً عبر المالك. روجع السلوك الموثق ولم ينفذ في متصفح.
راقب عندما يستدعي التغير أثراً
تراقب watch مصدراً صريحاً وتنفذ ردها عند تغيره وفق الخيارات. يختلف المرجع والكائن وgetter والمصفوفة عن بدائي مقروء مسبقاً. تكتشف watchEffect القراءات المتزامنة ولا تتتبع تلقائياً ما بعد أول await. اختر watch عند أهمية الهوية، للأثر كالاختيار والطلب، وcomputed للقيمة الحالية. يمنع الفصل الحلقات ونسخ الحالة الزائدة.
سجل انتقالاً محلياً من معرّف مختار
تضيف المراقبة انتقال الاختيار لتاريخ محلي لا يمكن اشتقاقه من الحالي وحده، لذلك يناسب الأثر. المصدر selectedId لا قيمته. تكون المراقبة الافتراضية كسولة ومجمعة وقد تجمع كتابات متزامنة بانتقال. ليس هذا تدقيقاً دائماً أو ضمان أمان أو فوترة. يحتاج العمل الخارجي إلغاء وخطأ ومالكاً مناسباً.
import { ref, watch } from "vue"
const selectedId = ref("n1")
const transitions = ref([])
watch(selectedId, (current, previous) => {
transitions.value.push({ previous, current })
})
selectedId.value = "n2"
يستخدم داخل setup متزامن أو نطاق أثر مدار. بعد معالجة التغير الواحد يحتوي التاريخ انتقال n1 إلى n2. يتطلب الجزء Vue وليس برنامجاً مستقلاً منفذاً.
امتلك عمر المراقبة وتوقيت التحديث
ترتبط المراقبة المتزامنة في setup بالمكوّن وتتوقف عادة عند إزالته، وقد تحتاج المنشأة لاحقاً إدارة صريحة. يبطل التنظيف الأثر القديم قبل التالي أو نهاية المالك. تضيف 3.5 onWatcherCleanup بتسجيل متزامن وتبقى واجهة الرد خياراً. استخدم post عند DOM المحدث ولا تستخدم sync على مجموعات كثيرة التغير بلا قياس. للتعمق كلفة ولا ينشئ لقطات مستقلة للقديم.
الأخطاء الشائعة وإصلاحها
يغير getter المحسوب حالة المصدر
- لماذا يحدث؟
- اختلط الاشتقاق بالأثر.
- كيف تصلحه؟
- اجعل الحساب خالصاً وانقل الأثر لمعالج أو مراقبة.
- كيف تتجنب تكراره؟
- راجع الكتابة والعمل الخارجي داخل الحساب.
تتلقى المراقبة رقماً بدلاً من مصدر
- لماذا يحدث؟
- قُرئت قيمة المرجع قبل تمريرها.
- كيف تصلحه؟
- مرر المرجع أو getter يقرأ الخاصية.
- كيف تتجنب تكراره؟
- حدد المصدر المراقب بالعقد.
يستمر الأثر بعد غياب مالكه
- لماذا يحدث؟
- أُنشئت المراقبة خارج العمر المدار.
- كيف تصلحه؟
- أدر مقبض الإيقاف أو النطاق بقصد.
- كيف تتجنب تكراره؟
- راجع الإنشاء غير المتزامن والتنظيف.
اختبر فهمك
1. العنوان المعروض دائماً نسخة كبيرة الحروف من title. هل تنسخه مراقبة؟
اعرض الحل المشروح
تعبر computed عن العلاقة مباشرة. تنشئ المراقبة قيمة قابلة للتعديل قد تختلف؛ احتفظ بها لأثر أو تاريخ مستقل فقط مع توثيق السبب.
2. تقرأ watchEffect مرجعاً بعد انتظار promise فقط. ما مشكلة الاعتماد؟
اعرض الحل المشروح
يشمل الجمع الجزء المتزامن. استخدم مصدراً صريحاً أو اقرأ قبل await إذا وافق القصد، ثم تحقق من الإبطال والإلغاء ولا تفترض تتبع كل لاحق.
أهم ما تعلمته
- تصف المحسوبة علاقات حالية خالصة.
- تنسق المراقبة أثراً بمصدر وعمر.
- التوقيت والتنظيف جزء من عقد الأثر.