Vue3+TS实现自定义input组件的验证功能

简介: 关于input的组件,其中有一个必不可少的属性就是输入验证,这篇文章教大家如何给自己定义的input组件添加验证,以邮箱输入框为例,大家学会了可以自行拓展

前言

关于input的组件,其中有一个必不可少的属性就是输入验证,这篇文章教大家如何给自己定义的input组件添加验证,以邮箱输入框为例,大家学会了可以自行拓展

创建组件

  1. 新建一个组件,创建基本代码

这里定义的emailReg是邮箱规范验证的正则表达式

<template>
  <h1>
  </h1>
</template>
<script lang="ts">
import { defineComponent, reactive, PropType } from 'vue'
const emailReg = /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
export default defineComponent
    setup() {
    
    }
</script>
  1. 定义interface,这里type我就写required和email两种,后续属性可以自己扩展。message为string类型。定义RulesProp并将它导出
interface RuleProp {
  type: 'required' | 'email'
  message: string
}
export type RulesProp = RuleProp[]
  1. 然后开始定义props:第一个属性rules,array类型,这里使用as进行类型断言为上面的RulesProp类型
props: {
    rules: Array as PropType<RulesProp>
  },
  1. 下面就在setup中创建响应式对象和回调:
setup(props, context) {
    const inputRef = reactive({
      val: '',
      error: false,
      message: ''
    })
    const validateInput = () => {
      
          }
          return passed
        })
        inputRef.error = !allPassed
      }
    }
  1. 写 validateInput 这个函数,就是表单验证的流程:

    • 先判断props.rules是否存在,因为rules是一个数组,所以我们这里使用数组上的every方法来进行验证流程(该方法会返回一个布尔值,只有每一项都是true的时候才会通过,只要有一个false就返回false。)
    • 在every创建一个临时变量passed = true,也就是每一个rule的临时变量
    • 规则在以后可能会有多种为方便扩展,所以这里采用switch case的结构
    • 第一个case是required,输入框的值不为空则可以通过
    • 第二个case是email,判断它是否符合我们上面写的邮箱判断正则
const validateInput = () => {
      if (props.rules) { // 判断props.rules是否存在
        const allPassed = props.rules.every(rule => { // 使用every方法
          let passed = true // 创建临时变量
          inputRef.message = rule.message
          switch (rule.type) {
            case 'required':
              passed = (inputRef.val.trim() !== '')// trim是去掉左右空格
              break
            case 'email':
              passed = emailReg.test(inputRef.val)
              break
            default:
              break
          }
          return passed
        })
        inputRef.error = !allPassed  // 用来显示错误信息
      }
    }

App.vue

  1. 先导入刚刚写的组件并在components中注册
import ValidateInput, { RulesProp } from './components/VaildateInput.vue'
  1. 在setup中创建一个emailRules,里面两条属性,第一个required是不能为空的,email是必须为邮箱格式。最后然后return导出
const emailRules: RulesProp = [
      { type: 'required', message: '电子邮箱地址不能为空' },
      { type: 'email', message: '请输入正确的电子邮箱格式' }
    ]
  1. 然后就页面渲染,大家可以随意,我这里采用的是bootstrap的样式,附上代码:

下面class="form-text"的div是用来展示错误信息的,v-if绑定emailRef.error,判断不通过就会显示错误的信息emailRef.message

<div class="mb-3">
      <label for="for-label">邮箱地址</label>
      <validate-input :rules="emailRules"></validate-input>
</div>
<div class="form-group">
      <label for="exampleInputEmail1">邮箱地址</label>
      <input
      type="email" class="form-control"
      id="exampleInputEmail1" placeholder="Email"
      v-model="emailRef.val"
      @blur="validateEmail"
      >
       <div class="form-text" v-if="emailRef.error">{{emailRef.message}}</div>
</div>

效果展示

不输入信息时:
在这里插入图片描述
输入信息不符合邮箱规范时:
在这里插入图片描述

关于input的校验规则还可以有很多能拓展的地方,大家可以自己去完善

相关文章
|
20天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
124 64
|
20天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
28 8
|
20天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
24天前
|
存储 JavaScript 前端开发
介绍一下Vue的核心功能
介绍一下Vue的核心功能
|
24天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
26天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
27天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
31 1
vue学习第一章
|
27天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
25 1
vue学习第三章
|
27天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
27天前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
23 1
vue学习第7章(循环)