LoginSignup
0
0

More than 3 years have passed since last update.

VeeValidate3で複数のフィールドをバリデーションする

Last updated at Posted at 2020-12-30

環境

  • Vue 2.6.11
  • VeeValidate 3.2.5

はじめに

VeeValidate3系ではValidationObserverとValidationProviderを使ってバリデーションを行いますが、ValidationProviderは単一のフィールドが対象になります。開始終了時間のように複数のフィールドをセットでバリデーションしたい場合のやり方が分からなかったので調べてみました。

コンポーネント化

VueではUIコンポーネントを自作できるため、複数のフィールドを持つコンポーネントを作成して、コンポーネントのv-modelに対してバリデーションをするようにします。

Form.vue
<ValidationProvider ref="provider" v-slot="{ errors }" rules="fromToRequired">
  <FromToText v-model="fromToTime" />
  <span>{{ errors[0] }}</span>
</ValidationProvider>
FromToText.vue
<template>
  <div>
    <input type="text" v-model="text.from" />
    <span></span>
    <input type="text" v-model="text.to" />
  </div>
</template>

<script>
  export default {
    props: {
      value: Object,
    },
    data () {
      return {
        text: {}
      }
    },
    mounted () {
      this.text = this.value
    }
  }
</script>

v-modelに設定しているfromToTimeがObject型になっているところがポイントです。こうすることで一つのコンポーネントで複数のフィールドを扱えるようになります。後はこのObject型の変数のバリデーションを作成すれば完成です。

Form.vue
<script>
  import { ValidationObserver, ValidationProvider, extend } from 'vee-validate'
  import FromToText from '@/components/UIComponents/Inputs/FromToText'

  export default{
    components: {
      ValidationProvider,
      ValidationObserver,
      FromToText
    },
    data () {
      return {
        fromToTime: {}
      }
    },
    beforeCreate () {
      extend('fromToRequired', {
        validate: (value) => {
          if (value === null || value === undefined) {
            return {
              valid: false
            }
          }
          return {
            valid: value.from && value.to
          }
        },
        message: '開始と終了を両方入力してください。'
      })
    }
  }
</script>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0