Element UI フォームバリデーションの実装パターン

フィールド単位の検証設定

フォーム項目に対して個別に検証条件を適用するには、el-form:rules属性をバインドし、対応するel-form-itempropを指定します。検証ロジックはデータオブジェクト内でルール配列として定義します。

<el-form :model="formData" :rules="constraints" ref="accountForm">
  <el-form-item label="ログインID" prop="loginId">
    <el-input v-model="formData.loginId" placeholder="アカウントを入力" />
  </el-form-item>
</el-form>
export default {
  data() {
    return {
      formData: { loginId: '' },
      constraints: {
        loginId: [
          { required: true, message: 'アカウントの入力は必須です', trigger: 'blur' },
          { min: 4, max: 16, message: '4文字以上16文字以内で設定してください', trigger: 'change' }
        ]
      }
    }
  }
}

フォーム全体の検証と送信制御

複数の項目を一度に検証し、送信処理を制御する場合はel-formrefを設定し、インスタンスメソッドを呼び出します。検証結果はコールバックまたはPromiseで取得可能です。

methods: {
  executeSubmit() {
    this.$refs.accountForm.validate((isValid) => {
      if (isValid) {
        // 全項目の検証に成功
        this.sendApiRequest()
      } else {
        // 検証失敗
        console.warn('入力内容を確認してください')
        return false
      }
    })
  }
}

独自バリデーション関数の実装

標準の検証条件では対応できない複合的なチェックが必要な場合、カスタムバリデーターを作成します。検証関数はrulevaluecallbackの3引数を受け取り、エラー時にはcallback(new Error('...'))を、成功時にはcallback()を実行します。

export default {
  data() {
    // data関数内、returnの外で検証ロジックを定義
    const checkPasswordMatch = (rule, value, callback) => {
      if (!value) {
        callback(new Error('確認用パスワードは必須です'))
      } else if (value !== this.formData.originalPassword) {
        callback(new Error('入力されたパスワードが一致しません'))
      } else {
        callback()
      }
    }

    return {
      formData: { originalPassword: '', confirmPassword: '' },
      rules: {
        confirmPassword: [
          { validator: checkPasswordMatch, trigger: 'blur' }
        ]
      }
    }
  }
}

テンプレート側では対象項目にprop="confirmPassword"を設定し、上記のルールを:rulesへバインドすることで動作します。カスタム検証関数内でのthis参照は、Vueコンポーネントのスコープ内で適切にバインドされるよう実装してください。

タグ: Element-UI vue-js Form-Validation custom-validator javascript

6月14日 21:31 投稿