ربط إدخالات النموذج
عند التعامل مع النماذج في الواجهة الأمامية، عادة ما نحتاج إلى مزامنة حالة عناصر إدخال النموذج مع الحالة المطابقة في شيفرة الـJavaScript. قد يكون مزعجًا ربط الاتصال يدويًا بين القيم و متغيرات مستمعي أحداث الإدخال:
template
<input
:value="text"
@input="event => text = event.target.value">
السمة الموجهة v-model
تساعدنا على تبسيط الشيفرة السابقة إلى:
template
<input v-model="text">
على غرار ذلك، يمكن استخدام v-model
على عناصر <input>
من أنواع مختلفة، <textarea>
، و <select>
. يوسع تلقائيًا إلى مختلف خاصيات وأحداث الـDOM بناءً على العنصر الذي يُستخدم عليه :
<input>
مع أنواع النصوص وعناصر<textarea>
تستخدم خاصيةvalue
وحدثinput
؛<input type="checkbox">
و<input type="radio">
تستخدم خاصيةchecked
وحدثchange
؛<select>
تستخدمvalue
كخاصية وchange
كحدث.
ملاحظة
سيتجاهل v-model
القيم الأولية للخاصيات value
، checked
أو selected
التي توجد على أي عنصر من عناصر النموذج. سيتعامل دائمًا مع الحالة المرتبطة بـJavaScript الحالية كمصدر للحقيقة. يجب عليك تعريف القيمة الأولية من جانب الـJavaScript، باستخدام واجهة الدوال التفاعلية مثل ref
أو [reactive
](/api/reactivity-core.html#reactivity-api-core).
الاستخدام الأساسي
النص
template
<p>الرسالة: {{ message }}</p>
<input v-model="message" placeholder="حرر رسالة" />
الرسالة :
ملاحظة
بالنسبة لللغات التي تتطلب محرر أسلوب الإدخال IME ( مثل الصينية، اليابانية، الكورية إلخ.)، ستلاحظ أن v-model
لا يحدث أثناء تحرير تركيبات الـIME. إذا كنت ترغب في الرد على هذه تحديثات أيضًا، استخدم مستمع حدث الـinput
وربط السمة value
بالخاصية التفاعلية بدلاً من استخدام v-model
.
النص متعدد السطور
template
<span>رسالة متعددة السطور :</span>
<p style="white-space: pre-line;">{{ multilineText }}</p>
<textarea v-model="message" placeholder="إضافة سطور متعددة"></textarea>
رسالة متعددة السطور :
تجدر الملاحظة أن الاقحام النصي داخل <textarea>
لن يعمل. استخدم v-model
بدلاً من ذلك.
template
<!-- سيء -->
<textarea>{{ text }}</textarea>
<!-- جيد -->
<textarea v-model="text"></textarea>
خانة الاختيار
خانة اختيار وحيدة يعني ربطها مع قيمة منطقية واحدة :
template
<input type="checkbox" id="checkbox" v-model="checked" />
<label for="checkbox">{{ checked }}</label>
يمكننا أيضًا ربط عدة خانات اختيار مع قيمة مصفوفة أو Set :
js
const checkedNames = ref([])
template
<div>الأسماء المحددة: {{ checkedNames }}</div>
<input type="checkbox" id="عبد العزيز" value="عبد العزيز" v-model="checkedNames">
<label for="عبد العزيز">عبد العزيز</label>
<input type="checkbox" id="ابراهيم" value="ابراهيم" v-model="checkedNames">
<label for="ابراهيم">ابراهيم</label>
<input type="checkbox" id="واثق" value="واثق" v-model="checkedNames">
<label for="واثق">واثق</label>
الأسماء المحددة: []
في هذه الحالة ، ستحتوي مصفوفة الـcheckedNames
دائمًا على قيم خانات الاختيار المحددة.
زر الانتقاء
template
<div>Picked: {{ picked }}</div>
<input type="radio" id="واحد" value="واحد" v-model="picked" />
<label for="واحد">واحد</label>
<input type="radio" id="اثنان" value="اثنان" v-model="picked" />
<label for="اثنان">اثنان</label>
المنتقى:
القائمة المنسدلة
اختيار واحد:
template
<div>محدد: {{ selected }}</div>
<select v-model="selected">
<option disabled value="">حدد خيارا</option>
<option>أ</option>
<option>ب</option>
<option>ج</option>
</select>
محدد:
ملاحظة
إذا لم تتطابق القيمة الابتدائية لتعبير الـv-model
مع أي من الخيارات، فسيتم تصيير عنصر <select>
في حالة "غير محدد". في iOS، سيؤدي هذا إلى عدم قدرة المستخدم على تحديد العنصر الأول لأن iOS لا ينشئ حدثًا في هذه الحالة. من المفضل أن توفر خيارًا معطلًا بقيمة فارغة، كما هو موضح في المثال أعلاه.
اختيارات متعددة (مربوطة بمصفوفة):
template
<div>محدد: {{ multiSelected }}</div>
<select v-model="multiSelected" multiple>
<option disabled value="">حدد خيارا</option>
<option>أ</option>
<option>ب</option>
<option>ج</option>
</select>
محدد: []
خيارات المنسدلة يمكن تصييرها بشكل ديناميكي باستخدام v-for
:
js
const selected = ref('A')
const options = ref([
{ text: "واحد", value: "أ", },
{ text: "اثنان", value: "ب" },
{ text: "ثلاثة", value: "ج" },
]);
template
<select v-model="selected">
<option v-for="option in options" :key="option.value" :value="option.value">
{{ option.text }}
</option>
</select>
<div>محدد: {{ selected }}</div>
ربط القيم
بالنسبة لزر الانتقاء ، وخيارات خانة الاختيار والمنسدلة ، فإن قيم الربط v-model
عادة ما تكون سلاسل ثابتة (أو قيم منطقية لخانة الاختيار):
template
<!-- `picked` هو سلسلة نصية "أ" عند الاختيار -->
<input type="radio" v-model="picked" value="أ" />
<!-- `toggle` هو إما صحيح أو خاطئ -->
<input type="checkbox" v-model="toggle" />
<!-- `selected` هو سلسلة نصية "أ ب ج" عند اختيار الخيار الأول -->
<select v-model="selected">
<option value="أ ب ج">أ ب ج</option>
</select>
لكن في بعض الأحيان قد نرغب في ربط القيمة بخاصية ديناميكية من نسخة المكون الحالي. يمكننا استخدام v-bind
لبلوغه. على غرار ذلك ، يسمح لنا استخدام v-bind
بربط قيمة الإدخال بقيم غير السلاسل النصية.
خانة الاختيار
template
<input
type="checkbox"
v-model="toggle"
true-value="نعم"
false-value="لا" />
true-value
و false-value
هي سمات مخصصة لـ Vue التي تعمل فقط مع v-model
. هنا سيتم تعيين قيمة خاصية toggle
إلى 'نعم'
عند تحديد الخانة ، وتعيينها إلى 'لا'
عند إلغاء التحديد. يمكنك أيضًا ربطهم بقيم ديناميكية باستخدام v-bind
:
template
<input
type="checkbox"
v-model="toggle"
:true-value="dynamicTrueValue"
:false-value="dynamicFalseValue" />
نصيحة
لا تؤثر السمات true-value
و false-value
على سمة value
للإدخال ، لأن المتصفحات لا تضم الخانات غير المحددة عند إرسال النماذج. لضمان إرسال أحد القيمتين في النموذج (على سبيل المثال ، "نعم" أو "لا") ، استخدم إدخالات زر الانتقاء بدلاً من ذلك.
زر الانتقاء
template
<input type="radio" v-model="pick" :value="first" />
<input type="radio" v-model="pick" :value="second" />
pick
سيُعيَّن بقيمة first
عند تحديد إدخال الزر الأول ، وتعيينه إلى قيمة second
عند تحديد الثاني.
خيارات القائمة المنسدلة
template
<select v-model="selected">
<!-- كائن مضمن سطريا -->
<option :value="{ number: 123 }">123</option>
</select>
v-model
تدعم أيضًا ربط بالقيم غير السلاسل النصية! في المثال أعلاه ، عند تحديد الخيار ، سيتم تعيين selected
إلى قيمة كائنية مجردة { number: 123 }
.
المُعدِّلات
المُعدِّل .lazy
افتراضيا، v-model
تزامن الإدخال مع البيانات بعد كل حدث input
(باستثناء تركيب IME كما وصف أعلاه). يمكنك إضافة المعدل lazy
للمزامنة بعد الانتهاء من الكتابة و مغادرة إطار الإدخال أي بعد حدث change
:
template
<!-- مزامنة بعد "change" بدلاً من "input" -->
<input v-model.lazy="msg" />
المُعدِّل .number
إذا كنت ترغب في تحويل إدخال المستخدم إلى عدد تلقائيًا ، يمكنك إضافة المعدل number
إلى الإدخالات المُوجهة بـv-model
:
template
<input v-model.number="age" />
إذا لم تُحلّل القيمة باستخدام parseFloat()
، فستُستخدام القيمة الأصلية بدلاً من ذلك.
المُعدِّل number
يُطبَّق تلقائيًا إذا كان الإدخال لديه السمة type="number"
.
المُعدِّل .trim
إذا كنت ترغب في التخلص من المسافات الفارغة من إدخال المستخدم تلقائيًا، يمكنك إضافة المُعدِّل trim
إلى الإدخالات الموجهة بـv-model
:
template
<input v-model.trim="msg" />
v-model
مع المكونات
إذا لم تكن معتادًا على مكونات Vue ، يمكنك تخطي هذا القسم في الوقت الحالي.
أنواع الإدخالات المدمجة في HTML لن تلبي احتياجاتك. لحسن الحظ، تتيح لك مكونات Vue إنشاء إدخالات قابلة لإعادة الاستخدام مع سلوك مخصص تمامًا. تعمل هذه الإدخالات حتى مع v-model
! لمعرفة المزيد ، اطلع على استخدام v-model
في دليل المكونات.