Формы в Vue

Вы чрезмерно дорабатываете свои формы Vue

Как быстро создавать компоненты чистой формы

Практически каждое приложение содержит какую-то форму. Независимо от того, создаете ли вы приложение-задачу, чат-бота или следующий клон-клуб, вам, скорее всего, понадобится создать хотя бы один вид.

Одним из основных преимуществ Vue является его реактивность и система привязки данных. Если вы работали с ним раньше, то наверняка сталкивались с v-model и другими вариантами привязки данных к элементам шаблона или дочерним компонентам.

Это также обычно первое, что приходит в голову при создании новой формы.

«Просто добавьте несколько тегов ввода и наложите на каждую v-модель». - ничего не подозревающий разработчик

v-model великолепен и занимает свое (заслуженное) место во многих компонентах Vue.

Но, как это часто бывает в программировании, обычно есть другие решения, которые необходимо рассмотреть. Иногда эти другие решения лучше подходят для конкретных случаев использования.

Итак, давайте посмотрим, как мы можем выровнять наши формы и тратить больше времени на кодирование вещей, которые на самом деле требуют умственных способностей.

Проблема с v-моделью

Использование v-model требует затрат.

Когда вы используете v-model в компонентах формы, вы двусторонне привязываете данные из компонентов к некоторым тегам ввода или дочерним компонентам внутри формы. Для этого вам необходимо добавить атрибут к каждому тегу, который вы хотите использовать в шаблоне.

Возьмем простую форму входа:

Наша функция login может выглядеть примерно так:

Этот код хорош, но ввод v-model для каждого тега может очень быстро стать избыточным. Представьте себе страницу регистрации для чего-то более сложного, например, приложения FinTech. Возможно, вам потребуется собрать данные о финансовой экспертизе, истории и ситуации пользователя.

Это может быстро привести к созданию длинных форм с множеством различных типов входных данных.

Вы можете сказать, что с этим легко справиться с помощью v-for, и будете правы - в определенной степени.

Если у вас есть только набор текстовых полей, с вами, вероятно, все в порядке.

Но что, если у вас есть разные типы ввода, какой-то текст, какой-то номер и поле пароль?

Теперь добавьте необходимость в различных тегах, таких как textarea или настраиваемые дочерние компоненты. В конечном итоге вы передаете inputs массив объектов в качестве опоры компоненту FormFields и используете кучу сложной логики и / или слотов для создания излишне спроектированной версии того, что вы изначально только что напечатали. в шаблоне.

Но, по крайней мере, теперь он многоразовый, не так ли?

Недостаток этой архитектуры становится еще более серьезным, если вы вспомните, для чего вообще нужен v-model.

Вот первое предложение о v-model из документации Vue:

Вы можете использовать директиву v-model для создания двусторонних привязок данных при вводе формы, текстовом поле и выбранных элементах.

Он используется для двусторонней привязки данных. Но вам не нужна двусторонняя привязка данных в формах входа, формах регистрации или финансовых анкетах!

Пользователь вводит данные, отправляет их и все.

Во многих случаях вам просто не нужен компонент, чтобы иметь возможность обновлять данные во входных данных.

Использование Object.fromEntries

Один из способов обработки представленных материалов - использовать Object.prototype.fromEntries в FormData соответствующей формы.

Подумайте о форме входа в систему из предыдущего примера. Другой способ заставить его работать - это полностью испустить любые v-model и v-on:click обработчики и просто полагаться на старые добрые формы JavaScript для выполнения этой работы.

Если вам нужно немного вспомнить, почему это работает, button тегам в form тегах, не имеющих указанного атрибута type, присваивается тип submit, и при нажатии на них запускается событие родительских form тегов submit. Затем событие submit вызывает функцию входа в систему с объектом Event, содержащим свойство target, относящееся к элементу формы.

Давайте взглянем на нашу блестящую новую функцию login.

Здесь мы передаем элемент формы конструктору FormData, который возвращает набор пар ключ / значение, представляющих поля формы и их значения (https://developer.mozilla.org/en-US/docs/ Web / API / FormData , MDN).

Затем мы передаем возвращаемое значение из new FormData конструктора в Object.fromEntries, чтобы превратить наш FormData в Object.

Поскольку теперь у нас есть значения, доступные в виде простых свойств объекта, мы можем перейти к получению нужных нам значений с помощью деструктуризации и простой передачи соответствующих значений в функцию loginWithUsernameAndPassword.

Этот метод не создает двусторонней привязки и поэтому просто работает, создавая шаблон и извлекая значения в функции входа в систему.

Предостережения

Имейте в виду, что, поскольку этот метод не создает двусторонней привязки, все введенные пользователем значения будут потеряны при повторной визуализации компонента. Если вы используете этот метод, не привязывайте какие-либо элементы внутри компонента, используя реактивные свойства, такие как v-модель. Каждое событие обновления, генерируемое входом, содержащим v-model, будет вызывать повторную визуализацию компонента, очищая все нереактивные поля ввода.

Последние мысли

Формы - очень распространенный тип компонентов. Несмотря на то, что разработчики используют их очень часто, люди редко тратят время на оптимизацию своих рабочих процессов с формами, даже если это может иметь огромное значение в удобочитаемости, а также во времени и опыте разработки.

Надеюсь, вам понравилась эта небольшая статья о методе, который я полюбил и уже применял в нескольких проектах промышленного уровня.

Если у вас есть другой подход к созданию чистых и эффективных форм во Vue, я хотел бы услышать о них в комментариях!

Больше контента на plainenglish.io