返回

在包含不同表单的选项卡式应用中仅验证活动表单

vue.js

使用 Vuelidate 验证两种表单中的任意一种

问题:

使用 Vuelidate 库时,如何在具有不同表单的选项卡式应用程序中只验证活动表单?

解决方案:

步骤 1:创建验证器实例

为每个表单创建一个独立的 Vuelidate 验证器实例。

步骤 2:切换选项卡时激活/禁用验证器

在切换选项卡时,激活相应表单的验证器,并禁用另一个表单的验证器。

步骤 3:仅验证活动表单

在提交表单时,仅验证活动表单。

实现:

HTML:

<template>
  <div>
    <button @click="switchTab('login')">登录</button>
    <button @click="switchTab('signup')">注册</button>

    <form v-if="currentTab === 'login'" @submit.prevent="submitLoginForm">
      <input v-model="loginForm.email" type="email">
      <input v-model="loginForm.password" type="password">
      <button type="submit">登录</button>
    </form>

    <form v-if="currentTab === 'signup'" @submit.prevent="submitSignUpForm">
      <input v-model="signUpForm.name" type="text">
      <input v-model="signUpForm.email" type="email">
      <input v-model="signUpForm.password" type="password">
      <input v-model="signUpForm.passwordConfirmation" type="password">
      <button type="submit">注册</button>
    </form>
  </div>
</template>

JavaScript:

<script>
import { required } from 'vuelidate/lib/validators'

export default {
  data() {
    return {
      currentTab: 'login',
      loginForm: {
        email: '',
        password: ''
      },
      loginFormRules: {
        email: { required },
        password: { required }
      },
      signUpForm: {
        name: '',
        email: '',
        password: '',
        passwordConfirmation: ''
      },
      signUpFormRules: {
        name: { required },
        email: { required },
        password: { required },
        passwordConfirmation: { required, sameAsPassword: 'password' }
      }
    }
  },
  computed: {
    loginFormIsValid() {
      return !this.$v.loginForm.$invalid
    },
    signUpFormIsValid() {
      return !this.$v.signUpForm.$invalid
    }
  },
  methods: {
    switchTab(tab) {
      this.currentTab = tab
      this.$v.loginForm.$reset()
      this.$v.signUpForm.$reset()

      if (tab === 'login') {
        this.$v.loginForm.$enable()
        this.$v.signUpForm.$disable()
      } else if (tab === 'signup') {
        this.$v.signUpForm.$enable()
        this.$v.loginForm.$disable()
      }
    },
    submitLoginForm() {
      if (this.loginFormIsValid) {
        // 提交登录表单
      }
    },
    submitSignUpForm() {
      if (this.signUpFormIsValid) {
        // 提交注册表单
      }
    }
  }
}
</script>

结论:

通过按照这些步骤,你可以有效地验证两种表单中的一种,并自动激活/禁用验证器,从而确保只验证当前活动的表单。

常见问题解答:

  1. 如何处理表单重置?

    使用 $reset 方法在切换选项卡或提交表单时重置验证器状态。

  2. 如何添加额外的验证规则?

    使用 Vuelidate 提供的内置验证规则或创建你自己的自定义规则。

  3. 如何处理嵌套表单?

    嵌套表单需要使用嵌套验证器,其中父验证器验证嵌套表单的有效性。

  4. 如何获取验证错误消息?

    使用 $error 属性访问验证器上的错误消息。

  5. 如何在表单提交时显示验证错误?

    在表单元素上使用条件渲染或 CSS 类来在验证失败时显示错误消息。