useForm, useControl

useForm и useControl - хелперы для работы с формами и валидацией

useForm

useForm используется в компонентах форм, для задания валидации и всплывающих submit/reset событий

Аргументы

context

  • type: SetupContext
  • required: true

Контекст setup функции

options

  • type: FormOptions<T, Vargs>
  • default: {}
interface FormOptions<
  T extends Object,
  Vargs extends ValidationArgs<T> = ValidationArgs<T>,
> {
  form?: T | Ref<T> | ToRefs<T>; // Обьект формы по которому проводится валидация
  rules?: Vargs | Ref<Vargs>; // Правила для валидации формы
  bubble?: boolean; // Должно ли событие всплывать, так же является дефолтным значением в `onSubmit` и `onReset`
  vuelidateGlobalConfig?: GlobalConfig; // Конфиг для `useVuelidate`
  reset?: () => void; // Функция вызываемая в `onReset` для сброса формы изнутри
}

Return

v

Обьект валидации, результат вызова useVuelidate(rules?, form?, vuelidateGlobalConfig)

onSubmit

  • type: ({ bubble?: boolean, data?: any }) => Promise<boolean>

Функция для вызова submit, так же она через provide доступна дочерним компонентам

Аргументы
bubble
  • type: boolean
  • default: options.bubble

Должна ли вызываться родительская функция сабмита

data
  • type: any
  • default: null

Любые данные, которые нужно отправить вместе с событием submit(@submit="(form, data) => {}")

Return
  • type: Promise<boolean>

Асинхронно возвращается состояние валидации текущей формы(не рекурсивно)

onReset

  • type: ({ bubble?: boolean, data?: any }) => Promise<void>

Функция для вызова reset, так же она через provide доступна дочерним компонентам

Аргументы
bubble
  • type: boolean
  • default: options.bubble

Должна ли вызываться родительская функция сброса

data
  • type: any
  • default: null

Любые данные, которые нужно отправить вместе с событием reset(@reset="(data) => {}")

parentOnSubmit

Функция полученная из provide

parentOnReset

Функция полученная из provide

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

<template>
  <form
    @submit.prevent="onSubmit"
    @reset.prevent="onReset"
  >
    <div>
      <input
        v-model.lazy="$v.name.$model"
        placeholder="Name"
      >

      <span v-if="$v.name.$error">
        {{ $v.name.$errors[0].messages }}
      </span>
    </div>

    <div>
      <input
        v-model.lazy="$v.email.$model"
        type="email"
        placeholder="Email"
      >

      <span v-if="$v.email.$error">
        {{ $v.email.$errors[0].messages }}
      </span>
    </div>

    <div>
      <button type="submit">
        Submit
      </button>

      <button type="reset">
        Reset
      </button>
    </div>
  </form>
</template>
import Vue from 'vue';
import { email, minLength, required } from '@vuelidate/validators';
import { ref, computed } from '@vue/composition-api';

import { useForm } from '#sf/composition/form';

const defaultForm = () => ({
  name: '',
  email: '',
});

export default Vue.extend({
  setup(props, context) {
    const form = ref(defaultForm());
    const reset = () => {
      form.value = defaultForm();
    };

    const rules = computed(() => ({
      name: {
        minLength: minLength(4),
        required,
      },

      email: {
        email,
        required,
      },
    }));

    const {
      v,
      onSubmit,
      onReset,
    } = useForm(context, { rules, form, reset });

    return {
      $v: v,
      onSubmit,
      onReset,
    };
  },
});

useControl

useControl - упрощенная версия useForm для использования в компонентах контролов

Аргументы

context

  • type: SetupContext
  • required: true

Контекст setup функции

options

  • type: ControlOptions
  • default: {}
interface ControlOptions {
  bubble?: boolean; // Должно ли событие всплывать, так же является дефолтным значением в `onSubmit` и `onReset`
}

Return

onSubmit

  • type: ({ bubble?: boolean, data?: any }) => true

Функция для вызова submit

Аргументы
bubble
  • type: boolean
  • default: options.bubble

Должна ли вызываться родительская функция сабмита

data
  • type: any
  • default: null

Любые данные, которые нужно отправить вместе с событием submit(@submit="(form, data) => {}")

Return
  • type: true

onReset

  • type: ({ bubble?: boolean, data?: any }) => void

Функция для вызова reset

Аргументы
bubble
  • type: boolean
  • default: options.bubble

Должна ли вызываться родительская функция сброса

data
  • type: any
  • default: null

Любые данные, которые нужно отправить вместе с событием reset(@reset="(data) => {}")

parentOnSubmit

Функция полученная из provide

parentOnReset

Функция полученная из provide