Vue快速实现通用表单验证功能

yizhihongxing

下面是“Vue快速实现通用表单验证功能”的完整攻略:

1. 需求背景

在前端开发中,表单验证是一个必不可少的功能,但每个表单的验证规则都不尽相同,造成了大量重复的工作,降低了开发效率。因此,我们需要一种通用的表单验证方案,可以快速实现各种表单验证规则。

2. 解决方案

Vue提供了丰富的API和生命周期,可以使开发者在编写代码时更加高效。我们可以使用Vue的v-model指令以及Computed属性和watch属性来实现通用表单验证功能,具体步骤如下:

  1. 首先,在vue实例中定义一个data对象,用来存储表单每个输入项的值,如下所示:
data () {
  return {
    form: {
      username: '',
      email: '',
      password: '',
      repeatPassword: ''
    },
    rules: {
      username: [
        { required: true, message: '请输入用户名', trigger: 'blur' },
        { min: 3, max: 12, message: '长度在 3 到 12 个字符', trigger: 'blur' }
      ],
      email: [
        { required: true, message: '请输入邮箱', trigger: 'blur' },
        { type: 'email', message: '请输入正确的邮箱格式', trigger: ['blur', 'change'] }
      ],
      password: [
        { required: true, message: '请输入密码', trigger: 'blur' },
        { min: 6, max: 20, message: '密码长度在6-20位之间', trigger: 'blur' }
      ],
      repeatPassword: [
        { required: true, message: '请再次输入密码', trigger: 'blur' },
        { validator: validateConfirmPassword, trigger: 'blur' }
      ]
    }
  }
}

上面的代码中,form对象用于存储表单每个输入项的值,rules对象用于存储每个输入项的验证规则,其中每个验证规则都是一个数组,数组中包含多个验证条件。

  1. 然后,通过v-model指令将表单数据和data中的form对象双向绑定,如下所示:
<el-form label-width="80px" :model="form" ref="form" :rules="rules" class="demo-ruleForm">
  <el-form-item label="用户名" prop="username">
    <el-input v-model="form.username"></el-input>
  </el-form-item>
  <el-form-item label="邮箱" prop="email">
    <el-input v-model="form.email"></el-input>
  </el-form-item>
  <el-form-item label="密码" prop="password">
    <el-input type="password" v-model="form.password"></el-input>
  </el-form-item>
  <el-form-item label="确认密码" prop="repeatPassword">
    <el-input type="password" v-model="form.repeatPassword"></el-input>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm('form')">提交</el-button>
    <el-button @click="resetForm('form')">重置</el-button>
  </el-form-item>
</el-form>

在上面的代码中,form对象和rules对象都作为el-form组件的属性传递,el-input中通过v-model指令将数据绑定到form中。

  1. 最后,通过Computed属性和watch属性来监听表单数据的变化和验证结果,如下所示:
computed: {
  formDataValid () {
    for (const item in this.form) {
      if (this.form.hasOwnProperty(item)) {
        if (this.$refs.form.fields[item]) {
          if (this.$refs.form.fields[item].validating) return false
          if (this.$refs.form.fields[item].errors.length > 0) return false
        }
      }
    }
    return true
  }
},
watch: {
  formDataValid (valid) {
    this.isFormValid = valid
  }
},
methods: {
  validateConfirmPassword (rule, value, callback) {
    if (value !== this.form.password) {
      callback(new Error('两次输入密码不一致'))
    } else {
      callback()
    }
  },
  submitForm (formName) {
    this.$refs[formName].validate(valid => {
      if (valid) {
        this.$alert('提交成功!', '提示', {
          confirmButtonText: '确定',
          type: 'success'
        })
      } else {
        return false
      }
    })
  },
  resetForm (formName) {
    this.$refs[formName].resetFields()
    this.isFormValid = false
  }
}

在上面的代码中,formDataValid是一个Computed属性,通过循环判断每个表单项是否验证通过的方式来计算出整个表单的验证结果,然后通过watch属性监听该属性的变化,一旦验证结果发生变化,就会将结果赋值给isFormValid属性,可以在提交表单的时候用来判断是否验证通过,submitForm方法中使用了该结果,如果验证不通过,就不会提交表单。

validateConfirmPassword是一个自定义的验证规则函数,用于验证两次密码输入是否一致。

3. 示例说明

下面演示两个示例来说明该方案的实现方法:

示例一:验证密码是否符合规则

假设有一个表单中只有一个密码输入框,需要验证密码符合一下规则:

  1. 密码不能为空;
  2. 密码长度必须在6-20位之间。

代码如下:

<el-form label-width="80px" :model="form" ref="form" class="demo-ruleForm">
  <el-form-item label="密码" prop="password">
    <el-input type="password" v-model="form.password"></el-input>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm('form')">提交</el-button>
    <el-button @click="resetForm('form')">重置</el-button>
  </el-form-item>
</el-form>

然后在data对象中,定义form对象和rules对象,其中rules对象定义了密码的验证规则,如下所示:

data () {
  return {
    form: {
      password: ''
    },
    rules: {
      password: [
        { required: true, message: '请输入密码', trigger: 'blur' },
        { min: 6, max: 20, message: '密码长度在6-20位之间', trigger: 'blur' }
      ]
    }
  }
}

最后,在submitForm方法中调用表单组件的validate方法来进行表单验证,代码如下:

submitForm (formName) {
  this.$refs[formName].validate(valid => {
    if (valid) {
      this.$alert('提交成功!', '提示', {
        confirmButtonText: '确定',
        type: 'success'
      })
    } else {
      return false
    }
  })
}

在执行提交操作时,表单会根据定义的rules对象来验证输入的密码是否符合规则,如果验证不通过就会弹出提示框。

示例二:验证两次密码是否一致

假设有一个表单中有两个密码输入框,需要验证两次输入的密码是否一致。代码如下:

<el-form label-width="80px" :model="form" ref="form" class="demo-ruleForm">
  <el-form-item label="密码" prop="password">
    <el-input type="password" v-model="form.password"></el-input>
  </el-form-item>
  <el-form-item label="确认密码" prop="confirmPassword">
    <el-input type="password" v-model="form.confirmPassword"></el-input>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm('form')">提交</el-button>
    <el-button @click="resetForm('form')">重置</el-button>
  </el-form-item>
</el-form>

然后在data对象中,定义form对象和rules对象,其中定义了验证两次密码是否一致的规则函数validateConfirmPassword,代码如下:

data () {
  return {
    form: {
      password: '',
      confirmPassword: ''
    },
    rules: {
      password: [
        { required: true, message: '请输入密码', trigger: 'blur' },
        { min: 6, max: 20, message: '密码长度在6-20位之间', trigger: 'blur' }
      ],
      confirmPassword: [
        { required: true, message: '请再次输入密码', trigger: 'blur' },
        { validator: this.validateConfirmPassword, trigger: 'blur' }
      ]
    }
  }
},
methods: {
  validateConfirmPassword (rule, value, callback) {
    if (value !== this.form.password) {
      callback(new Error('两次输入密码不一致'))
    } else {
      callback()
    }
  }
}

最后,在表单验证成功后,再判断formDataValid属性是否为true,如果为true,则表示所有输入项都通过了验证,这时就可以执行提交操作。如下所示:

submitForm (formName) {
  this.$refs[formName].validate(valid => {
    if (valid && this.formDataValid) {
      this.$alert('提交成功!', '提示', {
        confirmButtonText: '确定',
        type: 'success'
      })
    } else {
      return false
    }
  })
}

这样,在执行提交操作时,表单会根据定义的rules对象来验证两次密码输入是否一致,如果验证不通过就会弹出提示框。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue快速实现通用表单验证功能 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • webpack css加载和图片加载的方法示例

    下面是详细讲解“webpack css加载和图片加载的方法示例”的完整攻略: 一、Webpack中CSS加载 CSS是网站中不可避免的一部分。在Webpack中,我们可以使用CSS-loader来加载CSS。 1. 安装CSS-loader 在项目文件夹中运行以下命令来安装CSS-loader: npm install –save-dev css-load…

    css 2023年6月9日
    00
  • CSS3打造磨砂玻璃背景效果

    下面我们详细讲解一下“CSS3打造磨砂玻璃背景效果”的完整攻略。 1. 引入磨砂玻璃效果所需要的CSS 我们需要先引入CSS,然后使用css选择器来设置元素的磨砂玻璃效果,下面是代码: /* 设置磨砂玻璃效果 */ .background-blur { -webkit-filter: blur(10px); -moz-filter: blur(10px); …

    css 2023年6月9日
    00
  • css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果

    下面是“CSS3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果”的完整攻略。 实现方式 这个效果可以通过CSS3的transform属性和过渡动画来实现。当鼠标悬浮在图片上时,通过scale函数将图片进行缩放,并设置transition属性实现动画效果;当鼠标离开时,将scale的值设为1,再次使用过渡动画使得图片缓慢恢复原来的尺寸。 具体实现 使用下面的…

    css 2023年6月10日
    00
  • jQuery Selectors(选择器)的使用(二、层次篇)

    下面给出详细的jQuery选择器使用攻略——层次篇。 1. 基本层次选择器 jQuery中的基本层次选择器可以直接选择指定元素或元素组,并且选择器之间用空格隔开。以下是基本层次选择器的一些示例: 1.1 后代选择器 后代选择器是用于选择某个元素内所有满足条件的后代元素。例如,可以选择body元素内所有的p元素: $("body p") 1…

    css 2023年6月9日
    00
  • 第一次接触神奇的Bootstrap网格系统

    第一次接触神奇的Bootstrap网格系统 Bootstrap是一款流行的前端开发框架,其中最具特色的功能莫过于它的网格系统了。本文将详细介绍如何利用Bootstrap网格系统进行前端页面布局。 什么是Bootstrap网格系统 Bootstrap网格系统是一种通过12个栅格列来进行页面布局的系统。栅格列可以覆盖整个页面宽度,也可以将页面分成多个部分。 默认…

    css 2023年6月11日
    00
  • Vue入门之animate过渡动画效果

    Vue入门之animate过渡动画效果 在Vue.js中使用过渡动画效果可以使页面更加生动、美观、易于交互。本文将介绍Vue中的animate过渡动画效果的完整攻略。 安装必备依赖 在使用Vue过渡动画效果前,我们需要先安装相关依赖: npm install animate.css 设置组件的过渡动画 组件的过渡动画可以通过Vue提供的过渡类名来实现。在组件…

    css 2023年6月10日
    00
  • 使用css实现圆角图形绘制

    我会用Markdown格式帮你详细讲解如何使用CSS实现圆角图形绘制。 1. 了解CSS3 border-radius属性 CSS3的border-radius属性可以让我们非常简单地实现圆角的图形绘制。该属性可以为任何一个元素添加一个或多个圆角。其语法如下: border-radius: value; 其中,value可以是一个具体的长度,表示圆角的半径;…

    css 2023年6月10日
    00
  • CSS中的line-height行高属性学习教程

    下面为您详细讲解“CSS中的line-height行高属性学习教程”的完整攻略。 什么是line-height? line-height(行高)是CSS中的一个属性,它用于设置文字行与行之间的距离,更为准确的说是行框盒模型中相邻的两个框之间的距离。 line-height的语法 line-height的语法非常简单,可以使用单位或者无单位,如下所示: /* …

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部