Skip to content

Валидация с помощью вспомогательных библиотек

Существует отдельный пакет с набором ресолверов @vue-validate-form/resolvers (пока поддерживается только yup)

bash
npm install @vue-validate-form/resolvers yup

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

vue
<script lang="ts">
import { yupResolver } from '@vue-validate-form/resolvers';
import { ValidationField, ValidationProvider } from 'vue-validate-form';
import { object, string } from 'yup';

export default {
  components: { ValidationProvider, ValidationField },
  computed: {
    resolver() {
      return yupResolver(
        object({
          firstName: string().required(),
        }),
      );
    },
  },
  methods: {
    onSubmit(values) {},
  },
};
</script>

<template>
  <ValidationProvider
    :resolver="resolver"
    @submit="onSubmit"
  >
    <template #default="{ handleSubmit }">
      <form
        novalidate
        @submit.prevent="handleSubmit"
      >
        <ValidationField name="firstName">
          <template #default="{ modelValue, onChange }">
            <input
              :value="modelValue"
              type="text"
              @input="onChange($event.target.value)"
            >
          </template>
        </ValidationField>
      </form>
    </template>
  </ValidationProvider>
</template>

TIP

Почему параметр resolver computed? yupResolver возвращает функцию для валидации, но при этом схема может быть динамической и зависеть от состояния компонента (data, props и т.п.).

Например: У вас общая схема для создания и редактирования, для редактировать параметр id обязателен, а вот для создания его нет

vue
<script lang="ts">
import { yupResolver } from '@vue-validate-form/resolvers';
import { ValidationField, ValidationProvider } from 'vue-validate-form';
import { number, object, string } from 'yup';

export default {
  components: { ValidationProvider, ValidationField },
  props: {
    isNew: Boolean,
  },
  computed: {
    resolver() {
      const fields = {
        firstName: string().required(),
      };
      if (this.isNew) {
        fields.id = number().required();
      }
      return yupResolver(object(fields));
    },
  },
  methods: {
    onSubmit(values) {},
  },
};
</script>

<template>
  <ValidationProvider
    :resolver="resolver"
    @submit="onSubmit"
  >
    <template #default="{ handleSubmit }">
      <form
        novalidate
        @submit.prevent="handleSubmit"
      >
        <ValidationField name="firstName">
          <template #default="{ modelValue, onChange }">
            <input
              :value="modelValue"
              type="text"
              @input="onChange($event.target.value)"
            >
          </template>
        </ValidationField>
      </form>
    </template>
  </ValidationProvider>
</template>