Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Поля форм: v-model

Директива v-model связывает поле формы с переменной в обе стороны: пользователь печатает — переменная меняется, переменная меняется в коде — поле показывает новое значение. Не нужно вручную читать input.value в обработчике.

Текстовое поле

<!-- src/App.vue -->
<script setup>
import { ref } from 'vue'
 
const newTodo = ref('')
</script>
 
<template>
  <input v-model="newTodo" placeholder="Что нужно сделать?">
  <p>Вы вводите: {{ newTodo }}</p>
</template>

Текст под полем повторяет всё, что вы печатаете, буква за буквой. v-model — сокращение для пары :value="newTodo" и @input="newTodo = $event.target.value".

Форма добавления задачи

Соединим v-model с событием отправки формы:

<!-- src/App.vue -->
<script setup>
import { ref } from 'vue'
 
const todos = ref([])
const newTodo = ref('')
let nextId = 1
 
function addTodo() {
  const text = newTodo.value.trim()
  if (text === '') return
  todos.value.push({ id: nextId++, text, done: false })
  newTodo.value = ''
}
</script>
 
<template>
  <form @submit.prevent="addTodo">
    <input v-model="newTodo" placeholder="Что нужно сделать?">
    <button>Добавить</button>
  </form>
  <ul>
    <li v-for="todo in todos" :key="todo.id">{{ todo.text }}</li>
  </ul>
</template>

Введите «Купить хлеб» и нажмите Enter или кнопку — задача появится в списке, а поле очистится, потому что код записал в newTodo пустую строку.

Флажок

Для checkbox переменная получает true или false:

<template>
  <li v-for="todo in todos" :key="todo.id">
    <label>
      <input type="checkbox" v-model="todo.done">
      {{ todo.text }}
    </label>
  </li>
</template>

Отметка флажка сразу меняет поле done у задачи — счётчик оставшихся задач на computed тоже обновится.

Другие поля

ПолеЗначение переменной
input, textareaСтрока
input type="checkbox"true или false
Несколько checkbox с одним массивомМассив значений отмеченных
input type="radio"Значение value выбранного
selectЗначение value выбранного option
<script setup>
import { ref } from 'vue'
 
const filter = ref('all')
</script>
 
<template>
  <select v-model="filter">
    <option value="all">Все</option>
    <option value="active">Активные</option>
    <option value="done">Выполненные</option>
  </select>
  <p>Фильтр: {{ filter }}</p>
</template>

При выборе пункта под списком появится его значение, например «Фильтр: active».

Модификаторы

МодификаторЧто делает
v-model.trimУбирает пробелы по краям
v-model.numberПревращает ввод в число
v-model.lazyОбновляет переменную при потере фокуса, а не на каждый символ

Частая ошибка

Указать у поля и v-model, и value:

<input v-model="newTodo" value="Новая задача">

v-model игнорирует атрибут value, checked и selected — начальное значение берётся только из переменной. Задайте его в скрипте: const newTodo = ref('Новая задача').

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.