Продвинутая работа с формами в фреймворке Vue
Сейчас мы с вами научимся работе с текстареа, чекбоксами, радиокнопочками и селектами в фреймворке Vue.
Textarea
Работа с textarea происходит абсолютно также, как и с инпутами - через директиву v-model:
let app = new Vue({
el: '#app',
data: {
message: 'hello', // начальное значение в textarea
},
});
<div id="app">
<textarea v-model="message"></textarea>
<p>Введенное сообщение: {{ message }}</p>
</div>
Вот такая вставка переменной: <textarea>{{text}}</textarea> - не будет работать. Используйте вместо нее директиву v-model.
Чекбоксы
Давайте теперь посмотрим, как происходит работа с чекбоксами.
Пусть у нас есть чекбокс, к которому через v-model привязано свойство checked:
<div id="app">
<input type="checkbox" v-model="checked">
</div>
Если чекбокс отмечен - свойство checked будет иметь значение true, а если не отмечен - то false.
Чтобы убедится в этом, можно вывести значение свойства checked на экран, вот так:
<div id="app">
<input type="checkbox" v-model="checked">
<p>Состояние: {{ checked }}</p>
</div>
Не забудьте о том, что при использовании любого свойства, в нашем случае checked оно должно быть объявлено в data.
В нашем случае checked может иметь значение true или false и будет задавать начальное состояние чекбокса: если в checked лежит true - то чекбокс будет по умолчанию отмечен, а если false - то не отмечен.
Итак, реализуем описанное и запустим:
let app = new Vue({
el: '#app',
data: {
checked: true,
},
});
<div id="app">
<input type="checkbox" v-model="checked">
<p>Состояние: {{ checked }}</p>
</div>
Запустите этот код и понажимайте на чекбокс - вы увидите, как состояние чекбокса одновременно меняется в абзаце под нашим чекбоксом.
Чекбоксы и тернарный оператор
Пусть мы хотим в нашем абзаце выводить не true/false, а что-то более осмысленное в зависимости от состояния чекбокса.
В этом нам поможет тернарный оператор. Давайте с его помощью будем выводить 'отмечен', если в checked лежит true, и 'не отмечен', если там false:
<div id="app">
<input type="checkbox" v-model="checked">
<p>Состояние: {{ checked ? 'отмечен' : 'не отмечен' }}</p>
</div>
let app = new Vue({
el: '#app',
data: {
checked: true,
},
});
Чекбоксы и массив
Пусть у нас есть группа чекбоксов. Можно сделать так, чтобы значение атрибута value всех отмеченных чекбоксов складывалось в массив.
Для этого нужно к v-model этих чекбоксов привязать массив. Давайте сделаем это:
let app = new Vue({
el: '#app',
data: {
lang: [], // значение по умолчанию - массив
},
});
<div id="app">
<input type="checkbox" v-model="lang" value="html">
<input type="checkbox" v-model="lang" value="css">
<input type="checkbox" v-model="lang" value="js">
<p>Содержимое массива: {{ lang }}</p>
</div>
Запустите этот код и понажимайте на чекбоксы - вы увидите, как в абзаце выводится содержимое атрибутов value отмеченных чекбоксов.
Радиокнопочки
Давайте теперь рассмотрим работу с радиокнопочками.
Пусть у нас есть набор радиокнопочек:
<input name="radio" type="radio">
<input name="radio" type="radio">
<input name="radio" type="radio">
Напишем каждой из них директиву v-model и привяжем к ней свойство type:
<input name="radio" type="radio" v-model="type">
<input name="radio" type="radio" v-model="type">
<input name="radio" type="radio" v-model="type">
Дадим также каждой из них свой value:
<input name="radio" type="radio" v-model="type" value="один">
<input name="radio" type="radio" v-model="type" value="два">
<input name="radio" type="radio" v-model="type" value="три">
Если запустить подобный код, то в свойстве type всегда будет лежать value отмеченной радиокнопочки.
Давайте запустим:
let app = new Vue({
el: '#app',
data: {
type: '', // не забываем задать привязанное свойство в data
},
});
<div id="app">
<input name="radio" type="radio" v-model="type" value="один">
<input name="radio" type="radio" v-model="type" value="два">
<input name="radio" type="radio" v-model="type" value="три">
<p>Вы выбрали: {{ type }}</p>
</div>
Если после запуска вы понажимаете на радиокнопочки - вы увидите, как в абзаце под ними каждый раз выводится value отмеченной кнопки.
Селекты
Работа с селектами осуществляется аналогично - на тег селект вешается атрибут v-model, к нему привязывается свойство объекта data. В это свойство будет попадать текст выбранного тега <option>.
Попробуйте сами - запустите следующий код и поиграйтесь с ним:
let app = new Vue({
el: '#app',
data: {
selected: 'один', // значение по умолчанию
},
});
<div id="app">
<select v-model="selected">
<option>один</option>
<option>два</option>
<option>три</option>
</select>
<p>Вы выбрали: {{ selected }}</p>
</div>
Селекты и циклы
Не обязательно делать теги <option> вручную, ведь чаще всего данные, которые будут показаны в селекте хранятся в массиве.
Давайте сделаем такой массив и сформируем теги <option> с помощью цикла v-for:
let app = new Vue({
el: '#app',
data: {
selected: 'один', // значение по умолчанию
options: ['один', 'два', 'три'], // массив
},
});
<div id="app">
<select v-model="selected">
<option v-for="option in options">{{ option }}</option>
</select>
<p>Вы выбрали: {{ selected }}</p>
</div>