FRONTEND BLOG

Валидация форм с vue.js – делаем удобнее форму редактирования

Элементарная форма редактирования. Что мы хотим сделать? Мы хотим возвращать полю его изначальное значение при нажатии клавиши ESC и при потере полем фокуса, если оно пустое. Так что для начала нам нужно куда-то сохранить эти самые изначальные значения. Для этого добавим в data объект backup, в который при загрузке компонента будем сохранять копию данных, полученных с сервера:

export default {  data() {    return {      user: {        name: '',        email: ''      },      backup: {}    }  },  mounted() {    this.user.name = 'John';    this.user.email = 'john@test.com';    this.backup = { ...this.user };  }};

Теперь напишем метод для восстановления изначального значения поля:

restoreField(value, field) {  this.user[field] = this.backup[field];}

И метод для проверки пустое поле или нет:

checkEmpty(value, field) {  if (!value.trim()) {    this.restoreField(value, field)  }}

Добавим эти методы к полям формы и вот финальный результат:

<template>  <div id="app">    <form>      <div class="form__row">        <label for="name">Name</label>        <input type="text" name="name" id="name" class="form__control" v-model="user.name" @keydown.esc="restoreField(user.name, 'name')" @change="checkEmpty(user.name, 'name')">      </div>      <div class="form__row">        <label for="email">Email</label>        <input type="email" name="email" id="email" class="form__control" v-model="user.email" @keydown.esc="restoreField(user.email, 'email')" @change="checkEmpty(user.email, 'email')">      </div>    </form>  </div></template><script>export default {  data() {    return {      user: {        name: '',        email: ''      },      backup: {}    }  },  mounted() {    this.user.name = 'John';    this.user.email = 'john@test.com';    this.backup = { ...this.user };  },  methods: {    restoreField(value, field) {      this.user[field] = this.backup[field];    },    checkEmpty(value, field) {      if (!value.trim()) {        this.restoreField(value, field)      }    }  }};</script>

Совсем немного кода, но форма редактирования, как мне кажется, стала немного удобней и, что главное, она стала более дружелюбной.