Vue中如何进行表单自定义验证

news2024/11/15 14:02:38

Vue中如何进行表单自定义验证

在Vue应用中,表单验证是非常重要的一部分。Vue提供了一些内置的验证规则,比如requiredminmax等。但是有时候我们需要对表单进行自定义验证,以满足特定的业务需求。本文将介绍如何在Vue中进行表单自定义验证。

在这里插入图片描述

基本用法

在Vue中,我们可以使用v-model指令来绑定表单数据,使用v-ifv-show等指令来控制表单的显示和隐藏,使用v-bindv-on等指令来绑定表单的属性和事件。但是Vue并没有提供内置的自定义验证规则,我们需要自己来实现它。

为了实现自定义验证规则,我们需要在表单元素上绑定一个自定义指令,用来处理验证逻辑。在自定义指令中,我们可以使用binding.value来获取指令的值,使用el.value来获取表单元素的值,使用binding.arg来获取指令的参数。

下面以一个简单的表单为例来演示如何实现自定义验证规则。

<template>
  <div>
    <label>用户名:</label>
    <input type="text" v-model="username" v-custom-validator:username.required="true">
    <div v-show="usernameError">{{ usernameErrorMessage }}</div>
    <label>密码:</label>
    <input type="password" v-model="password" v-custom-validator:password.required="true" v-custom-validator:password.minlength="6">
    <div v-show="passwordError">{{ passwordErrorMessage }}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: '',
      password: '',
      usernameError: false,
      passwordError: false,
      usernameErrorMessage: '',
      passwordErrorMessage: ''
    }
  },
  directives: {
    'custom-validator': {
      bind(el, binding) {
        const validator = binding.arg;
        const value = binding.value;
        const input = el;

        const checkValidity = () => {
          const isValid = validate(input.value, validator, value);
          if (isValid) {
            input.setCustomValidity('');
          } else {
            input.setCustomValidity(getErrorMessage(validator, value));
          }
        };

        input.addEventListener('input', checkValidity);
        input.addEventListener('blur', checkValidity);
      }
    }
  }
};

function validate(value, validator, arg) {
  switch (validator) {
    case 'required':
      return value.trim() !== '';
    case 'minlength':
      return value.trim().length >= arg;
    default:
      return true;
  }
}

function getErrorMessage(validator, arg) {
  switch (validator) {
    case 'required':
      return '该字段为必填项';
    case 'minlength':
      return `该字段长度不能少于${arg}个字符`;
    default:
      return '';
  }
}
</script>

在上述例子中,我们自定义了一个名为custom-validator的指令,并且在模板中绑定它到用户名和密码的输入框上。在指令中,我们获取了指令的参数validator和值value,以及表单元素input。接着,我们定义了一个checkValidity方法,并将它绑定到表单元素的inputblur事件上。在checkValidity方法中,我们使用validate方法来验证输入框的值是否符合规则。如果符合规则,我们将input元素的自定义验证信息设置为空字符串,否则将其设置为错误信息。最后,我们在模板中使用v-show指令来控制错误信息的显示和隐藏。

组合验证规则

有时候,我们需要对表单进行组合验证,比如需要同时验证用户名和密码是否符合要求。为了实现组合验证规则,我们可以在checkValidity方法中添加一个新的参数,用来表示组合验证规则。然后,在validate方法中,我们可以根据组合验证规则来判断是否需要进行组合验证。最后,我们在模板中使用computed属性来计算表单是否通过了组合验证,并使用v-show指令来控制错误信息的显示和隐藏。

下面以一个组合验证规则的例子来演示如何实现组合验证规则。

<template>
  <div>
    <label>用户名:</label>
    <input type="text" v-model="username" v-custom-validator:username.required="true" v-custom-validator:username.minlength="6">
    <div v-show="usernameError">{{ usernameErrorMessage }}</div>
    <label>密码:</label>
    <input type="password" v-model="password" v-custom-validator:password.required="true" v-custom-validator:password.minlength="6">
    <div v-show="passwordError">{{ passwordErrorMessage }}</div>
    <button @click="submit" :disabled="isSubmitDisabled">提交</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: '',
      password: '',
      usernameError: false,
      passwordError: false,
      usernameErrorMessage: '',
      passwordErrorMessage: ''
    }
  },
  directives: {
    'custom-validator': {
      bind(el, binding) {
        const validator = binding.arg;
        const value = binding.value;
        const input = el;

        const checkValidity = (combineValidator) => {
          const isValid = validate(input.value, validator, value, combineValidator);
          if (isValid) {
            input.setCustomValidity('');
          } else {
            input.setCustomValidity(getErrorMessage(validator, value));
          }
        };

        input.addEventListener('input', () => checkValidity(false));
        input.addEventListener('blur', () => checkValidity(false));
        input.addEventListener('change', () => checkValidity(true));
      }
    }
  },
  computed: {
    isSubmitDisabled() {
      return this.usernameError || this.passwordError;
    }
  },
  methods: {
    submit() {
      // 提交表单
    }
  }
};

function validate(value, validator, arg, combineValidator) {
  switch (validator) {
    case 'required':
      return value.trim() !== '';
    case 'minlength':
      return value.trim().length >= arg;
    default:
      if (combineValidator) {
        return validate(value, 'required', true) && validate(value, 'minlength', arg);
      }
      return true;
  }
}

function getErrorMessage(validator, arg) {
  switch (validator) {
    case 'required':
      return '该字段为必填项';
    case 'minlength':
      return `该字段长度不能少于${arg}个字符`;
    default:
      return '';
  }
}
</script>

在上述例子中,我们在表单元素的change事件上添加了一个组合验证规则的判断。如果用户点击提交按钮之前,表单元素的值都符合规则,则表单可以提交。否则,提交按钮将被禁用。在validate方法中,我们添加了一个新的参数combineValidator,用来表示是否需要进行组合验证。如果需要进行组合验证,我们将根据组合验证规则来判断是否符合要求。最后,我们使用computed属性来计算表单是否通过了组合验证,并在模板中使用v-show指令来控制错误信息的显示和隐藏。

总结

本文介绍了如何在Vue中进行表单自定义验证。我们使用自定义指令来处理验证逻辑,使用validate方法来验证输入框的值是否符合规则,使用getErrorMessage方法来获取错误信息。同时,我们还演示了如何实现组合验证规则,以及如何使用computed属性来计算表单是否通过了组合验证。希望本文能够帮助你更好地理解Vue中的表单自定义验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十章 数学相关

第十章 数学相关 第一节 集合 真题&#xff08;2010-53&#xff09;-数学相关-集合-画饼集能力-朴素逻辑 53.参加某国际学术研讨会的 60 名学者中&#xff0c;亚裔学者 31 人&#xff0c;博士 33 人&#xff0c;非亚裔学者中无博士学位的 4 人。根据上述陈述&#xff0c;参…

Java16:集合

一&#xff1a;Collecction接口 1.单列集合框架结构 》Collection接口&#xff1a;单列集合&#xff0c;用来存储一个一个的对象 》 List接口&#xff1a;存储有序的&#xff0c;可重复的数据---》动态数组&#xff0c;实现类&#xff1a;ArrayList&#xff0c;LinkedList,…

【深蓝学院】手写VIO第3章--基于优化的 IMU 与视觉信息融合--作业

0. 题目 1. T1 T1.1 绘制阻尼因子曲线 将尝试次数和lambda保存为csv&#xff0c;绘制成曲线如下图 iter, lambda 1, 0.002000 2, 0.008000 3, 0.064000 4, 1.024000 5, 32.768000 6, 2097.152000 7, 699.050667 8, 1398.101333 9, 5592.405333 10, 1864.135111 11, 1242.7567…

【书影观后感 十四】左晖-做难而正确的事

距离上一本完整读完的书《李自成》及据此而作的读后感【书影观后感 十三】甲申三百七十八年祭已经接近一年时间了&#xff0c;最近心血来潮读了李翔的访谈形式系列《详谈》的第一本《左晖-做难而正确的事》。 虽然这本薄薄的书只有171页&#xff0c;访谈的形式也看似比较随意…

因果推断18--估计个体治疗效果:泛化界和算法CRF(个人笔记)

目录 1. 介绍 2. 相关工作 3.估计ITE&#xff1a;误差界 4. 估计ITE的算法 5.实验 5.1. 模拟结果&#xff1a;IHDP 5.2. 现实世界的结果&#xff1a;工作 5.3. 结果 6.结论 参考 英文题目&#xff1a;Estimating individual treatment effect: generalization bounds…

【Python plotly】零基础也能轻松掌握的学习路线与参考资料

Python plotly是一个优秀的数据可视化工具&#xff0c;通过使用Python语言和Plotly的图表支持库&#xff0c;可以轻松地创建交互式和动态图表&#xff0c;Python plotly的可视化效果美观且易于实现。 学习路线&#xff1a; Python基础语法和Numpy、Pandas基础学习 Python是一…

碳排放预测模型 | Python实现基于LSTM长短期记忆神经网络的碳排放预测模型(预测未来发展趋势)

文章目录 效果一览文章概述研究内容环境准备源码设计学习总结参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于LSTM长短期记忆神经网络的碳排放预测模型(预测未来发展趋势) 研究内容 这是数据集的链接:https://github.com/owid/co2-data/blob/master/owid-co2-da…

windows一键安装redis3.2.100

下载 下载地址:https://gitcode.net/zengliguang/windows_redis_offline_install.git 使用git进行进行clone下载 在电脑桌面或者其他文件夹下 &#xff0c;鼠标右键点击 选择git clone &#xff0c;下图中url为下载地址&#xff0c;Directory为本地存储路径&#xff0c;点击…

ORB_SLAM3 闭环检测

ORB SLAM3系统初始化ORB SLAM3 构建FrameORB_SLAM3 单目初始化ORB_SLAM3 双目匹配ORB_SLAM3_IMU预积分理论推导(预积分项)ORB_SLAM3_IMU预积分理论推导(噪声分析)ORB_SLAM3_IMU预积分理论推导(更新)ORB_SLAM3_IMU预积分理论推导(残差)ORB_SLAM3_优化方法 Pose优化ORB_SLAM3 闭环…

【量化交易笔记】8.基于深度学习(LSTM)预测股票价格

前言 前一章节&#xff0c;已作随机森林来预测股票价格&#xff0c;也是一种比较常见的方法&#xff0c;本章基于深度学习算法来处理时间序列&#xff0c;来预测股票未来的价格。LSTM是一种特殊类型的循环神经网络&#xff08;RNN&#xff09;&#xff0c;在自然语言处理和时间…

【C语言之函数栈帧】(动态图—巨细)一文带你了解局部变量随机值及栈区上的函数调用

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 局部变量为什么是随机值?函数是如何调用的&#xff1f; ✉️ 该篇将使用该编译器&#xff0c;通过介绍栈帧的创建和销毁来深入了解局…

计算机网络开荒3-传输层

文章目录 一、传输层概述1.1 网络层 vs 传输层 二、多路复用 多路分用三、UDP3.1 RDT3.1.1 Rdt3.1.1.1 Rdt1.03.1.1.2 Rdt2.03.1.1.3 Rdt2.13.1.1.4 Rdt2.23.11.5 Rdt 3.0 四、滑动窗口协议4.1 流水线机制4.1.2 滑动窗口协议GBNSR 五、TCP5.1 可靠数据传输5.1.1 RTT和超时 5.2 …

Vue中如何进行图表绘制

Vue中如何进行图表绘制 数据可视化是Web应用中非常重要的一部分&#xff0c;其中图表绘制是其中的重要环节。Vue作为一款流行的前端框架&#xff0c;提供了很多优秀的图表库&#xff0c;以满足不同业务场景下的需求。本文将介绍如何在Vue中进行图表绘制&#xff0c;包括使用Vu…

MM32F3273G8P火龙果开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置

MM32F3273G8P火龙果开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置 1、Systick寄存器 Systick是ARM内核的一个外设&#xff0c;所以在不同芯片的代码上移植比较方便&#xff0c;他总共有4个寄存器&#xff0c; 从Systick定义中可以看到&#xff1a; typedef struct {__I…

一文看懂Java中的锁

阅读本文你可以获得 Synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock、Condition、Semaphore、CountDownLatch、CyclicBarrier、JMM、Volatile、Happens-Before。 全文共16000字左右&#xff08;包含示例代码&#xff09;、欢迎收藏、在看、转发分批食用 一…

基于粒子群优化算法的配电网光伏储能双层优化配置模型[IEEE33节点](选址定容)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【MySQL 数据库】11、学习 MySQL 中的【锁】

目录 一、锁的概述与分类二、全局锁&#xff08;全库数据备份&#xff09;三、表级锁(1) 表锁(2) 元数据锁&#xff08;Meta Data Lock&#xff09;(3) 意向锁 四、行级锁(1) 行锁(2) 间隙锁&临键锁 一、锁的概述与分类 锁是计算机协调多个进程或线程并发访问某一资源的机…

Whistle(基于 Node 实现的跨平台抓包调试工具)的使用

Whistle(基于 Node 实现的跨平台抓包调试工具)的使用 基于Node实现的跨平台抓包调试工具 可以劫持网络请求&#xff0c;并进行请求和响应的修改&#xff0c;来提高我们的开发调试效率 1.一键安装(装包/证书) npm i -g whistle && w2 start --init 证书的问题 安装…

[论文阅读] (31)李沐老师视频学习——4.研究的艺术·理由、论据和担保

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

5.2 清洗数据

5.2 清洗数据 5.2.1 检测与处理重复值1、记录重复 drop_duplicates()2、特征重复 equals() 5.2.2 检测与处理缺失值 isnull()、notnull()1、 删除法 dropna()2、替换法 fillna()3、 插值法 5.2.3 检测与处理异常值1、3σ原则2、箱线图 5.2.4 任务实现&#xff08;wei&#xff0…