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

下面是“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日

相关文章

  • JS获取和修改元素样式的实例代码

    当我们开发网页时,经常需要通过JavaScript获取元素样式,并修改元素的样式来实现各种交互效果。接下来,我将为您介绍获取和修改元素样式的实例代码。 获取元素样式 要获取元素的样式,我们可以使用getComputedStyle()函数。getComputedStyle()函数需要传递两个参数:要获取样式的元素和伪类(如果没有伪类则传递null)。这个函数返…

    css 2023年6月11日
    00
  • CSS3五个技巧给你的网站带来出色的效果

    CSS3五个技巧给你的网站带来出色的效果 1. 渐变(Gradient) 渐变是一种非常流行的Web设计元素,可以为网站添加出色的色彩效果。CSS3中的Gradient功能可以让我们很容易地实现渐变。 实现一个横向渐变背景色的例子: background: linear-gradient(to right, #3366cc 0%, #666666 100%)…

    css 2023年6月10日
    00
  • css的核心内容 标准流、盒子模型、浮动、定位等分析

    CSS(Cascading Style Sheets)是网页设计中不可或缺的一部分。在CSS中,我们需要了解一些核心内容才能更好地使用它。 标准流 标准流(Normal Flow)是CSS中最基本的元素布局方式。在标准流中,元素按照其在HTML文档中出现的顺序依次排列。块级元素从上到下排列,行内元素从左到右排列。元素的宽度默认为其包含的内容的宽度。 示例1:…

    css 2023年6月9日
    00
  • CSS滤镜示范(filter)附源代码(静态滤镜)

    CSS滤镜是一种通过改变图像的色彩、亮度、对比度、饱和度等特性来实现视觉效果的技术。以下是CSS滤镜示范和源代码的完整攻略。 什么是CSS滤镜? CSS滤镜是一种用于HTML元素的效果,可以对元素进行颜色、亮度、对比度、饱和度等方面的修改。这意味着你可以创建各种各样的视觉效果,也包括黑白或灰度效果、模糊效果等。 如何在CSS中实现滤镜效果? 在CSS中,你可…

    css 2023年6月9日
    00
  • js实现的简单图片浮动效果完整实例

    JS实现简单图片浮动效果的完整攻略 HTML和CSS准备 首先,我们需要准备HTML和CSS代码,以便在页面中添加图片并设置其样式。 示例代码如下: <!DOCTYPE html> <html> <head> <title>JS实现图片浮动效果</title> <style type=&quo…

    css 2023年6月10日
    00
  • vue 1.0 结合animate.css定义动画效果

    下面是“vue 1.0 结合animate.css定义动画效果”的完整攻略: 1. 安装animate.css 首先需要安装animate.css,可以通过npm或者cdn方式引入: NPM 安装 npm install animate.css –save CDN 引入 <link rel="stylesheet" href=&q…

    css 2023年6月10日
    00
  • 用CSS3将你的设计带入下个高度

    下面是用CSS3将设计带入下一个高度的完整攻略: 1. 背景特效 通过CSS3的背景特效,可以让网页的背景变得生动丰富,增强页面的视觉效果。其中比较常用的几种背景特效包括: 1.1 线性渐变背景 使用CSS3的background-image属性,可以为网页添加线性渐变背景。以下是一个简单的实例: .background { background-image…

    css 2023年6月9日
    00
  • Chrome的最小字体12px限制最终解决办法

    Chrome的最小字体12px限制最终解决办法 问题描述 在最新版本的Chrome浏览器中,存在一个最小字体12px的限制,在CSS中设置小于12px的字号时,会被自动替换为12px的字号。这个限制对于一些网站设计有一定影响,需要找到解决办法。 解决办法 Chrome的最小字体12px限制,主要是出于用户体验和防止欺诈等目的而设定。但是在某些情况下,这个限制…

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