Vue что такое v model
Vue.js для начинающих, урок 10: формы
Сегодня, в 10 уроке курса по Vue, мы поговорим о том, как работать с формами. Формы позволяют собирать данные, вводимые пользователем. Кроме того, здесь мы обсудим валидацию форм, то есть — проверку того, что в них вводят.
Цель урока
Мы собираемся создать форму, которая позволяет посетителям сайта отправлять отзывы на товары. При этом нужно, чтобы отзыв можно было бы отправить только в том случае, если заполнены все поля формы, которые обязательно должны быть заполнены.
Начальный вариант кода
Вот что сейчас находится в index.html :
Так выглядит main.js :
Задача
Нам надо, чтобы посетители сайта могли бы оставлять отзывы на товары, но на нашем сайте пока нет средств, позволяющих получать данные от пользователей. Такими средствами являются формы.
Решение задачи
Зарегистрируем новый компонент, приступим к формированию его шаблона и оснастим его некоторыми данными:
Директива v-model
Директива v-model позволяет организовывать двустороннюю привязку данных. При такой схеме работы, если что-то новое оказывается в поле ввода, это приводит к изменению данных. И, соответственно, когда меняются данные, обновляется состояние элемента управления, эти данные использующего.
Добавим к полю ввода директиву v-model и привяжем это поле к свойству name из данных компонента.
Теперь добавим в шаблон компонента полный код формы:
Дополним набор данных компонента, добавив в него те данные, к которым привязаны вышеописанные элементы управления:
Доработаем метод onSubmit :
Далее, нам надо организовать прослушивание этого события, разместив в шаблоне product следующее:
Вот код этого метода:
Вывод отзывов о товаре
Страница с формой для ввода отзывов
Проверка форм
В формах часто бывают поля, которые, перед отправкой формы, должны быть обязательно заполнены. Например, нам не хотелось бы, чтобы пользователи отправляли бы отзывы, в которых поле текста отзыва было бы пустым.
Подобная конструкция приведёт к автоматическому выводу сообщения об ошибке в том случае, если пользователь попытается отправить форму, в которой required-поле окажется пустым.
Сообщение об ошибке
Наличие в браузере стандартных механизмов проверки полей форм — это очень приятно, так как это может освободить нас от создания собственных механизмов проверки полей. Но то, как проводится стандартная проверка данных, может, в каком-то особом случае, нас не устроить. В такой ситуации вполне логично будет написать собственный код проверки форм.
Пользовательская проверка форм
Поговорим о том, как создать собственную систему проверки форм.
Включим в состав данных компонента product-review массив для хранения сообщений об ошибках. Назовём его errors :
Мы хотели бы добавлять в этот массив сведения об ошибках, возникающих в ситуациях, когда поля формы оказываются пустыми. Речь идёт о следующем коде:
А куда поместить этот код?
Если же хотя бы одно из полей оказывается пустым, мы помещаем в массив errors сообщение об ошибке, зависящее от того, что именно не ввёл пользователь перед отправкой формы.
Осталось лишь вывести эти ошибки, что можно сделать с помощью следующего кода:
Сообщения об ошибках
Теперь у нас имеется собственная система валидации формы.
Практикум
Итоги
Сегодня мы говорили о работе с формами. Вот самое важное из того, что вы сегодня узнали:
# Изменения в работе v-model
# Обзор
Краткий обзор что изменилось:
Для получения дополнительной информации читайте дальше!
# Введение
# Синтаксис в 2.x
В версии 2.x использование v-model на компоненте эквивалентно передаче входного параметра value и отслеживании сгенерированного события input :
Если хочется изменить используемый входной параметр или имя события на другие, можно воспользоваться опцией model в компоненте ChildComponent :
В этом случае v-model будет сокращённым вариантом для
# Использование v-bind.sync
Тогда родительский компонент может прослушать это событие и обновить локальное свойство, если захочет. Например:
# Синтаксис в 3.x
В версии 3.x v-model на пользовательском компоненте эквивалентно передаче входного параметра modelValue и отслеживании сгенерированного события update:modelValue :
# Аргументы v-model
Чтобы изменить имя свойства, вместо использования опции model в компоненте, теперь можно передавать аргумент в директиву v-model :
# Модификаторы v-model
Подробнее о пользовательских модификаторах v-model можно прочитать в разделе пользовательских событий.
# Стратегия миграции
для всех v-model без аргументов убедитесь, что изменили входной параметр и имя события на modelValue и update:modelValue соответственно
Разбираем основные директивы Vue.js
Директивы Vue.js это специальные атрибуты, которые мы можем использовать внутри html шаблона компонента vue, для того чтобы тем или иным образом взаимодействовать с html тегами и не только. Все директивы обычно начинаются с буквы v, затем через дефис идет название директивы. В статье мы разберем основные директивы, которые вы будете наиболее часто использовать в вашем Vue приложении.
v-show
Данная директива отвечает за отображение элемента в зависимости от переданного значения. Если мы передадим в значение true, то элемент отобразится на странице и наоборот.
Так же мы можем передать в значение директивы функцию или метод, который будет возвращать булево значение.
В данном случае если мы передадим в метод showTitle число > 0, то заголовок будет отображаться, если отрицательное, то нет.
Эта директива так же как и v-show отвечает за условную отрисовку элементов, с той лишь разницей, что при использовании v-show элемент всегда будет оставаться в DOM и будет меняться только значение css свойcтва display. Если вы управляете видимостью элемента через v-if, то ваш элемент будет пропадать и появляться в DOM дереве в зависимости от значения директивы. v-if принимает значения по аналогии с v-show.
v-else, v-else-if
Директива v-if удобна тем, что её можно использовать вместе с директивами v-else и v-else-if. В зависимости от значений будет отображаться тот или иной компонент. В примере ниже отрисуется третий заголовок.
v-bind
Директива служит для так называемой data binding — привязки данных. Для того чтобы осуществить вывод динамических данных внутри html атрибута необходимо передать аргументом директиве v-bind этот атрибут. Аргументы к директивам передаются после символа двоеточие. Например: v-bind:href. В примере кода мы привязали значение переменной url к атрибуту href.
v-model
Директива несколько похожа на v-bind и служит для двухсторонней привязки между данными элементами формы и данными из объекта data (two-way binding). Директива игнорирует атрибуты value, checked, selected, которые присутствуют у элементов. За истинное значение директива берет данные, которые мы передаём ей из объекта data. В примере ниже мы привязали значение инпута к переменной inputText в объекте дата экземпляра vue. При вводе данных значение из инпута будет автоматически записываться в переменную inputText.
Добавление события на элемент реализуется директивой v-on. Аргументом директивы после двоеточия нужно передать название события. Названия событий аналогичны событиям JavaScript. В примере мы навесили обработчик события click, на кнопку, которая увеличивает переменную counter на единицу.
Так же с версии vue 2.4.0 доступна возможность навесить сразу несколько событий на элемент.
Для того чтобы вывести данные массива в список элементов существует директива v-for. Она имеет следующий синтаксис — v-for=»item in items». В значение директивы мы передаем итерируемый элемент (в нашем случае это item) и массив, который мы будем обходить (items). Далее в теле тега мы уже можем обращаться к итерируемому элементу.
Данный код выведет следующий результат:
v-html
С помощью данной директивы по аналогии с innerHTML можно устанавливать html разметку внутрь данного элемента.
Заключение
Президент США Джо Байден ужесточает ограничения в отношении Huawei и ZTE
Samsung заявляет, что Android 12 и One UI 4 готовы для Galaxy S21
Опрос в Twitter призывает Элона Маска продать 10% акций Tesla
800 000 человек играют в Forza Horizon 5, а она еще даже не вышла
Исследователи Массачусетского технологического института создали ИИ, который может сделать роботов лучше
Instagram @web.dev.setups
Так называемый принцип Парето был сформулирован в 19 веке. Он говорит, что 20% усилий принесут 80% результата, и наоборот, 80% усилий принесут только 20% результата. Этот закон Парето можно применить в любой сфере жизни. Взглянем на примеры: 20% книг дают 80% знаний, 20% злоумышленников совершают 80% преступлений, 20% всех людей на планете владеют 80% всех денег в мире.
Проанализируйте, какие именно действия принесут вам большую отдачу и отдайте предпочтение именно им. Сконцентрируйтесь на 20% вещах, которые обеспечат вам максимальную отдачу.
⚡Нездоровый перфекционизм это зло
Самокритика хороша только до того момента когда вы перестаете здраво оценивать свои возможности, и стараетесь перейти поставленную планку. В такой момент лучше отставить в сторону черезмерные претензии к самому себе – наша жизнь сама по себе неидеальна. Перестаньте копаться в мелких деталях – этим вы себе только навредите, особенно учитывая тот факт, что копаться в себе можно до бесконечности.
⚡Разрешайте себе отдыхать
⚡Сложно сохранить ровную осанку когда ты сидишь за столом 4, 6 или 8 часов. Спина постоянно ищет удобное положение и интуитивно мы начинаем сползать с кресел вниз. Чтобы этого не произошло нужно использовать подставку для ног.
⚡Подставка для ног позволяет телу испытывать минимальные напряжения и позволяет спине полностью откинуться на стул. Таким образом заняв правильное положение на рабочем месте, можно избавиться от усталости мышц спины и затекания ног.
Основы компонентов
Базовый пример
Вот пример компонента Vue:
Переиспользование компонентов
Компоненты можно переиспользовать столько раз, сколько захотите:
Свойство data должно быть функцией
При определении компонента вы могли заметить, что data не была представлена в виде объекта, например так:
Вместо этого свойство data у компонентов должно быть функцией, чтобы каждый экземпляр компонента управлял собственной независимой копией возвращаемого объекта данных:
Если бы не было этого правила, нажатие на одну кнопку повлияло бы на данные всех других экземпляров, как например тут:
Организация компонентов
Обычно приложение организуется в виде дерева вложенных компонентов:
Например, у вас могут быть компоненты для заголовка, боковой панели, зоны контента, каждый из которых может содержать другие компоненты для навигационных ссылок, постов блога и т.д.
Чтобы использовать эти компоненты в шаблонах, они должны быть зарегистрированы, чтобы Vue узнал о них. Есть два типа регистрации компонентов: глобальная и локальная. До сих пор мы регистрировали компоненты только глобально, используя Vue.component :
Компоненты, зарегистрированные глобально, могут использоваться в шаблоне любого корневого экземпляра Vue ( new Vue ) созданного впоследствии — и даже внутри всех компонентов, расположенных в дереве компонентов этого экземпляра Vue.
На данный момент это всё, что вам нужно знать о регистрации компонентов. Но когда вы закончите изучение этой страницы и разберётесь со всей информацией представленной здесь — мы рекомендуем вернуться позднее и прочитать полное руководство по регистрации компонентов.
Передача данных в дочерние компоненты через входные параметры
Ранее мы создавали компонент для записи блога. Проблема в том, что этот компонент бесполезен, если не будет возможности передавать ему данные, такие как заголовок и содержимое записи блога, которую мы хотим показать. Вот для чего нужны входные параметры.
Входные параметры — это пользовательские атрибуты, которые вы можете установить на компоненте. Когда значение передаётся в атрибут входного параметра, оно становится свойством экземпляра компонента. Чтобы передать заголовок в компонент нашей записи блога, мы можем включить его в список входных параметров, которые принимает компонент, с помощью опции props :
После объявления входного параметра вы можете передавать данные в него через пользовательский атрибут, например:
Однако, в типичном приложении у вас наверняка будет массив записей в data :
Тогда нужно отобразить компонент для каждой записи:
Как мы видим выше, можно использовать v-bind для динамической передачи данных во входные параметры. Это особенно полезно, когда вы не знаете заранее точного содержимого, которое потребуется отобразить, например после загрузки записей блога из API.
На данный момент это всё, что вам нужно знать о входных параметрах. Но когда вы закончите изучение этой страницы и разберётесь со всей информацией представленной здесь — мы рекомендуем вернуться позднее и прочитать полное руководство по входным параметрам.
Один корневой элемент
По крайней мере, вы захотите отобразить и содержимое записи в блог:
Однако, если вы попробуете сделать это в шаблоне, Vue покажет ошибку с пояснением что каждый компонент должен иметь один корневой элемент. Вы можете исправить эту ошибку, обернув шаблон в родительский элемент, например так:
По мере роста нашего компонента, вероятно, нам может понадобиться не только заголовок и содержание поста блога, но и дата публикации, комментарии и так далее. Определять входной параметр для каждой связанной части информации может стать очень раздражающим:
Приведённый выше пример и некоторые далее используют шаблонные строки JavaScript, чтобы сделать многострочные шаблоны более читаемыми. Эта возможность не поддерживается Internet Explorer (IE), поэтому если вам нужна поддержка IE и нет возможности использовать транспиляцию (например с помощью Babel или TypeScript), то используйте запись с обратными слэшами для многострочных шаблонов вместо них.
Прослушивание событий из дочерних компонентов в родительских компонентах
По мере разработки нашего компонента для некоторых возможностей может потребоваться передавать данные обратно в родительский компонент. Например, мы можем решить включить функцию для доступности, чтобы увеличивать размер текста в записях блога, оставив остальную часть страницы с размером текста по умолчанию.
В родительском компоненте мы можем добавить свойство postFontSize для этой возможности:
Которое будет использоваться в шаблоне для управления размером шрифта для всех записей блога:
Теперь давайте добавим кнопку для увеличения текста прямо перед содержимым каждой записи блога:
Проблема в том, что эта кнопка ничего не делает:
Передача данных вместе с событием
Или, если обработчик события будет методом:
Тогда значение будет передано первым аргументом:
Использование v-model на компонентах
делает то же самое, что и:
При использовании на компоненте, v-model вместо этого делает следующее:
Чтобы это действительно работало, элемент внутри компонента должен:
Вот это в действии:
Теперь v-model будет прекрасно работать с этим компонентом:
На данный момент это всё, что вам нужно знать о пользовательских событиях. Но когда вы закончите изучение этой страницы и разберётесь со всей информацией представленной здесь — мы рекомендуем вернуться позднее и прочитать полное руководство по пользовательским событиям.
Распределение контента слотами
Как и с обычными HTML-элементами, часто бывает полезным передать компоненту содержимое, например:
Что может выглядеть примерно так:
К счастью, эта задача легко решается с помощью пользовательского элемента у Vue:
Как вы видите выше, мы просто добавляем слот там, куда хотим подставлять контент — и это всё. Готово!
На данный момент это всё, что вам нужно знать о слотах. Но когда вы закончите изучение этой страницы и разберётесь со всей информацией представленной здесь — мы рекомендуем вернуться позднее и прочитать полное руководство по слотам.
Динамическое переключение компонентов
Иногда бывает полезно динамически переключаться между компонентами, например в интерфейсе с вкладками:
Показанное выше стало возможным с помощью элемента Vue со специальным атрибутом is :
В примере выше currentTabComponent может содержать:
Посмотрите этот пример чтобы поэкспериментировать с полным кодом, или эту версию для примера привязки к объекту с настройками компонента вместо указания его имени.
На данный момент это всё, что вам нужно знать о динамических компонентах. Но когда вы закончите изучение этой страницы и разберётесь со всей информацией представленной здесь — мы рекомендуем вернуться позднее и прочитать полное руководство по динамическим и асинхронным компонентам.
Особенности парсинга DOM-шаблона
Это приведёт к проблемам при использовании компонентов с элементами, которые имеют такие ограничения. Например:
Пользовательский компонент будет поднят выше, так как считается недопустимым содержимым, вызывая ошибки в итоговой отрисовке. К счастью, специальный атрибут is предоставляет решение этой проблемы:
Следует отметить, что этого ограничения не будет если вы используете строковые шаблоны из одного из следующих источников:
# v-model
# Overview
In terms of what has changed, at a high level:
For more information, read on!
# Introduction
With Vue 3, the API for two-way data binding is being standardized in order to reduce confusion and to allow developers more flexibility with the v-model directive.
# 2.x Syntax
In 2.x, using a v-model on a component was an equivalent of passing a value prop and emitting an input event:
If we wanted to change prop or event names to something different, we would need to add a model option to ChildComponent component:
So, v-model in this case would be a shorthand to
# Using v-bind.sync
Then the parent could listen to that event and update a local data property, if it wants to. For example:
# 3.x Syntax
In 3.x v-model on the custom component is an equivalent of passing a modelValue prop and emitting an update:modelValue event:
# v-model arguments
To change a model name, instead of a model component option, now we can pass an argument to v-model :
# v-model modifiers
Read more about custom v-model modifiers in the Custom Events section.
# Migration Strategy
for all v-model s without arguments, make sure to change props and events name to modelValue and update:modelValue respectively
# Next Steps
For more information on the new v-model syntax, see:
Deployed on Netlify.
Caught a mistake or want to contribute to the documentation? Edit this on GitHub!
(opens new window)
Last updated: 2021-09-26, 05:42:19 UTC