Vue / الأساسي: المكوّنات التفاعلية وعقود الإدخال / الدرس 5
الخصائص والأحداث والفتحات وعقود المكوّنات
ابنِ مكوّنات قابلة لإعادة الاستخدام بملكية مدخل واضحة واقتراح تغيير صريح.
في هذه الصفحة
أهداف الدرس
- استخدم الخصائص مدخلات والأحداث المعلنة مخرجات.
- اشرح نطاق الأب والتعديل المتداخل ووصول الخاصية التفاعلي.
امنح القيمة مالكاً معتمداً واحداً
يمرر الأب قيمة ويعرضها الابن ويرسل حدث اقتراح تغيير، فتظهر الملكية وتقل النسخ المتخالفة. الخصائص للقراءة على الرابط العلوي ومخالفة تعديلها تكسر الاتجاه الواحد. قد تبقى محتويات الكائن والمصفوفة قابلة للتعديل فلا تعزل بعمق. فضل قيماً ضيقة وعمليات صريحة عند مفاجأة الاشتراك. لا يحتاج حقل المخزن كله ليبلغ تغير نصه.
أعلن واجهة الابن العامة
defineProps وdefineEmits وحدتا مترجم في setup لا تحتاجان استيراد تشغيل. توثق الأنواع وتحذر في التطوير ولا تتحقق أمنياً من بيانات بعيدة. يقبل المثال عنواناً ويرسل نصاً بحدث change-title ويقرأ props.title دون نسخة خاصة. تشكل value وinput عقد المتصفح. في TypeScript ضيق هدف الحدث ولا تفترض قيمة بكل EventTarget؛ يفصل مثال JavaScript هذا التفصيل.
<script setup>
const props = defineProps({
title: { type: String, required: true }
})
const emit = defineEmits(["change-title"])
</script>
<template>
<label>
Note title
<input :value="props.title" @input="emit('change-title', $event.target.value)">
</label>
</template>
يحفظ باسم TitleField.vue. ترسل الكتابة النص المقترح وتتبع القيمة المرئية الخاصية القادمة من الأب. لا يحفظ الجزء سجلاً بعيداً أو يتحقق منه.
أكمل حلقة القيمة والحدث لدى الأب
يمتلك الأب title ويقرر قبول المقترح. يسنده المثال مباشرة وقد يتحقق النموذج أو يطبعه عند الحد المناسب. لا تصعد أحداث المكوّن عبر الآباء كـ DOM؛ يمررها المطور بقصد. يؤثر الإعلان في العقد وسلوك مرور المستمع. اجعل الابن قابلاً للاختبار بقيمة ومراقب حدث، وتحقق من تحديثه بقيمة أب جديدة لتمييزه من نسخة تهيئة قديمة.
<script setup>
import { ref } from "vue"
import TitleField from "./TitleField.vue"
const title = ref("Reading notes")
</script>
<template>
<TitleField :title="title" @change-title="title = $event" />
<p>Preview: {{ title }}</p>
</template>
يتطلب الأب المكوّن السابق والترجمة المتوافقة. يشترك الإدخال والمعاينة بقيمة الأب الوحيدة، ولم ينفذ ربط أو اختبار حدث متصفح لهذا الجزء.
راعِ قاعدة التفكيك الخاصة بالإصدار
يحافظ مترجم 3.5 على بعض روابط defineProps المفككة بإعادة الوصول في setup نفسه؛ التقطت السابقة القيمة عادة. لا يجعل التحويل وسيط الدالة مصدراً حياً؛ مرر getter أو مرجعاً عند الحاجة للمستقبل. يمثل props.title نمطاً واضحاً محمولاً. لا تفترض القاعدة لكائن أو مخزن عادي وراجع المصدر والعائلة قبل تشخيص التحديث.
ركّب المحتوى دون إخفاء تدفق البيانات
تتيح الفتحات محتوى الأب داخل تخطيط يملكه الابن. يستخدم المحتوى نطاق الأب وتكشف scoped slots بيانات مختارة بخصائص فتحة، لا وصولاً عشوائياً للداخل. تحتاج السمات المارة والجذور المتعددة توجيهاً مقصوداً. احفظ العنوان والتعطيل والتركيز والأحداث مع العنصر الفعلي، ولا يدفن الغلاف البصري عقد المتصفح والوصول بحالة غير مضبوطة.
الأخطاء الشائعة وإصلاحها
يعدل الابن الخاصية مباشرة
- لماذا يحدث؟
- اختلطت ملكية المدخل بالحالة المحلية.
- كيف تصلحه؟
- أرسل اقتراحاً ودع المالك يحدث القيمة.
- كيف تتجنب تكراره؟
- وثق عقد الاتجاه الواحد.
لا تتبع الخاصية المنسوخة تحديث الأب
- لماذا يحدث؟
- أنشأت التهيئة لقطة محلية منفصلة.
- كيف تصلحه؟
- اقرأ الخاصية أو حدد سياسة مسودة صريحة.
- كيف تتجنب تكراره؟
- اختبر تغير الخاصية بعد العرض الأول.
لا يتلقى سلف الحدث المخصص
- لماذا يحدث؟
- افترض صعود الحدث كـ DOM.
- كيف تصلحه؟
- مرر الحدث أو اختر مالكاً مشتركاً.
- كيف تتجنب تكراره؟
- راجع كل حد مكوّن صراحة.
اختبر فهمك
1. يتلقى الابن كائناً ويغير record.title. لماذا يفاجئ الأب؟
اعرض الحل المشروح
لا تمنع الخاصية العلوية كل تعديل متداخل، فيؤثر الابن في المشترك بلا حدث متوقع. فضل مدخلاً ضيقاً وحدثاً أو عقد تعديل مشترك موثقاً بوضوح.
2. يحتاج composable متابعة خاصية مفككة في 3.5. ماذا يمرر؟
اعرض الحل المشروح
مرر getter مثل () => title أو مصدراً مدعوماً لا البدائي الحالي. لا يحول تحويل المترجم المحلي الوسيط العادي لمصدر حي خارج الدالة.
أهم ما تعلمته
- تزود الخصائص قيماً وتقترح الأحداث تغييراً.
- تحويلات الخاصية محددة بالنطاق والإصدار.
- تحتاج الفتحات والمرور عقود ملكية صريحة.