computed() وwatch()
اشتق القيم بكسل باستخدام computed()، وتفاعل مع تغييرات الحالة باستخدام watch() وwatchEffect()، وتحكّم في توقيت flush.
computed() وwatch() درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
computed() في Composition API
تنشئ computed(fn) ref تفاعلياً للقراءة فقط، وتشتق قيمته من مصادر تفاعلية أخرى. وتُخزّن القيمة مؤقتاً، لذلك لا تُشغَّل الدالة getter إلا عند تغيّر التبعيات.
<script setup>
import { ref, computed } from 'vue';
const items = ref([{ price: 10 }, { price: 20 }, { price: 30 }]);
const tax = ref(0.1);
const subtotal = computed(() => items.value.reduce((s, i) => s + i.price, 0));
const total = computed(() => subtotal.value * (1 + tax.value));
</script>computed() القابلة للكتابة
مرّر كائناً يحتوي على get وset لإنشاء computed قابلة للكتابة. يتولى setter معالجة التحديثات، وعادةً ما يعكس التغيير على ref المصدر.
const firstName = ref('Alice');
const lastName = ref('Smith');
const fullName = computed({
get: () => `${firstName.value} ${lastName.value}`,
set: (val: string) => {
[firstName.value, lastName.value] = val.split(' ');
}
});
fullName.value = 'Bob Jones'; // sets both refsأساسيات watch()
تشغّل watch(source, callback) دالة الاستدعاء callback عند تغيّر المصدر. وتتلقى دالة الاستدعاء القيمتين الجديدة والقديمة.
import { ref, watch } from 'vue';
const query = ref('');
watch(query, (newVal, oldVal) => {
console.log(`Changed from '${oldVal}' to '${newVal}'`);
searchAPI(newVal);
});مراقبة ref مقارنةً بـ reactive
راقب ref مباشرةً. ولمراقبة خاصية تفاعلية، استخدم دالة getter مثل () => state.prop.
const count = ref(0);
watch(count, val => console.log('count:', val));
const state = reactive({ count: 0, name: '' });
watch(() => state.count, val => console.log('state.count:', val));المراقبة العميقة
مرّر { deep: true } لمراقبة التغيّرات المتداخلة في ref يحتوي على كائن.
const user = ref({ name: 'Alice', address: { city: 'NY' } });
watch(user, (newUser) => {
console.log('user changed:', newUser);
}, { deep: true });المراقبة الفورية
مرّر { immediate: true } لتشغيل دالة الاستدعاء فوراً عند الإعداد، قبل حدوث أي تغيير. وهذا مفيد عندما تريد تشغيل أثر جانبي باستخدام القيمة الأولية.
watch(userId, async (id) => {
user.value = await fetchUser(id);
}, { immediate: true }); // runs once on setup, then on changewatchEffect()
تشغّل watchEffect(fn) دالة الاستدعاء فوراً، ثم تعيد تشغيلها كلما تغيّرت أي تبعية تفاعلية مستخدمة داخلها. ولا حاجة إلى تحديد المصادر صراحةً.
import { watchEffect } from 'vue';
watchEffect(() => {
// runs immediately and whenever query or page changes:
fetchResults(query.value, page.value);
});watchEffect مقارنةً بـ watch
watchEffect: فوري، ويتتبّع التبعيات تلقائياً، ولا يتيح الوصول إلى القيمة القديمة. watch: مصادر صريحة، ويكون كسولاً افتراضياً، ويتيح الوصول إلى القيمتين القديمة والجديدة. استخدم watchEffect للآثار الجانبية التصريحية، واستخدم watch عندما تحتاج إلى التحكم في وقت التشغيل وعدد مرات تكراره.
إيقاف المراقِبات
تعيد كل من watch وwatchEffect دالة إيقاف. استدعها لإيقاف المراقبة. في