vue3实现H5表单验证组件的示例

 更新时间:2023年04月17日 11:19:33   作者:黄景圣  
本文主要介绍了vue3实现H5表单验证组件的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

效果图

描述

基于vue.js,不依赖其他插件或库实现;基础功能使用保持和 element-ui 一致,内部实现做了一些移动端差异的调整。

当前构建平台使用 uni-app 官方脚手架构建,因为当下移动端大多情况就h5微信小程序两种,所以一套代码跑多端十分适合技术选型。

功能预览

代码地址 vue2

实现思路

核心api:使用 provideinject ,对应<form><form-item>

  • <form>组件中,内部用一个变量(数组)去将所有<form-item>实例储存起来,同时把要传递的数据通过provide暴露出去;<form-item>组件则在内部用inject去接收父组件提供过来的数据,最后把自身的属性和方法提交到父组件去。

  • <form>中要做的事情就只有监听绑定的数据,然后做调用对应<form-item>的各种验证方法;所以任何的验证状态都写在了<form-item>中,包括样式的展示;由于可以拿到父组件绑定的数据,对于一些常见样式设置自然就可以用computed去优先拿取自身组件prop值或者父组件绑定的prop值;对应的,通过父组件绑定的表单数据,就可以和自身prop去验证当前项了,最后由父组件去调用对应方法即可,当然,自身组件也可以调用。

  • 因为vue3中移除了自定义派发事件$on$off$emit,所以这里改用uni.$onuni.$offuni.$emit来代替;不同的是,这个事件派发机制是全局的,不是跟随组件唯一性,所以在添加、移除事件时,需要在事件名称设置一个唯一值使用;这里我在<form>组件中定义一个变量,每次调用时都累加1,然后设为事件名称再传递到<form-item>内部,这样就可以保证<form><form-item>的确定性了。

与element-ui表单组件差异

  • 表单验证不再设置输入框和任何表单表单的样式,而是通过自定义修改样式去显示验证提示;这十分有利于移动端穷出不尽的UI设计稿的变化,例如同一个表单,有两种不同样式的输入框;同时不影响和其他样式库的使用,因为表单验证的<form-item>不会影响到插槽内的任何元素。

  • 表单校验数据选项只保留4个字段(见下面),因为移除了对表单组件的验证状态,所以trigger这个事件设置也不需要了;pattern则换成了reg,注意的是,在微信小程序中,任何组件的传参都会被过滤剩下基础json类型,所以这个reg在小程序环境中使用时,要在末尾加上.toString()validator同理。

/** 表单规则类型 */
export interface TheFormRulesItem {
  /** 是否必填项 */
  required?: boolean
  /** 提示字段 */
  message?: string
  /** 指定类型 */
  type?: "number" | "array"
  /**
   * 自定义的校验规则(正则)
   * - 考虑到微信一些特殊的抽风机制,在微信小程序中,除`number|string|object|undefined|null`这几个基础类型外,其他类型是会被过滤掉,所以这里在写正则的时候,在末尾加上`.toString()`即可
   */
  reg?: string // | RegExp
}

/** 表单规则类型 */
export type TheFormRules = { [key: string]: Array<TheFormRulesItem> };
  • 不知道大家在以往的长表单验证中,有没有遇到过点击验证之后,因为页面过长,所以不知道那个表单项校验不通过,从而需要翻阅定位到对应项;为了优化以往表单验证的体验,这里加入了验证之后,滚动到对应位置的操作,更加符合移动端的用户体验。

  • 表单验证的触发机制:都知道element-ui的触发机制是通过指定trigger来选择触发的时机,那这里我去掉之后,就意味着没有这些操作去触发了;而我选择的是主动调用validatevalidateField这些验证方法时去触发实时验证,当验证不通过时,把不通过的用变量储存起来,然后每次数据变动时去校验,等到验证通过了,则移除实时验证项;这样相比于element-ui绑定事件实时去验证会节省很多代码调用和运行的机制,同时代码可以做到更高校和精简。

非uni-app平台的移植

除了更换标签之外,几乎不用做任何的修改就可以复制粘贴到其他项目中去,唯一要修改的就是自定义事件uni.$onuni.$offuni.$emit;这里可以自己实现,又或者用其他库去代替,js实现自定义事件派发代码如下:

function moduleEvent() {
  /** 
  * 事件集合对象
  * @type {{[key: string]: Array<Function>}}
  */
  const eventInfo = {};

  return {
    /**
     * 添加事件
     * @param {string} name 事件名
     * @param {Function} fn 事件执行的函数
     */
    on(name, fn) {
      if (!eventInfo.hasOwnProperty(name)) {
        eventInfo[name] = [];
      }
      if (!eventInfo[name].some(item => item === fn)) {
        eventInfo[name].push(fn);
      }
    },

    /**
     * 解绑事件
     * @param {string} name 事件名
     * @param {Function} fn 事件绑定的函数
     */
    off(name, fn) {
      const fns = eventInfo[name];
      if (fns && fns.length > 0 && fn) {
        for (let i = 0; i < fns.length; i++) {
          const item = fns[i];
          if (item === fn) {
            fns.splice(i, 1);
            break;
          }
        }
      } else {
        console.log("[moduleEvent] => 没有要解绑的事件");
      }
    },

    /**
     * 调用事件
     * @param {string} name 事件名
     * @param {any} params 事件携带参数
     */
    dispatch(name, params) {
      const fns = eventInfo[name];
      if (fns && fns.length > 0) {
        for (let i = 0; i < fns.length; i++) {
          const fn = fns[i];
          fn(params);
        }
      } else {
        console.log("[moduleEvent] => 没有要执行的事件");
      }
    },
  }
}

调用moduleEvent()之后,用变量调用即可,注意当前变量要作为内存常驻使用;

到此这篇关于vue3实现H5表单验证组件的示例的文章就介绍到这了,更多相关vue3 H5表单验证组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue3基于rem比例H5缩放方案示例详解

    Vue3基于rem比例H5缩放方案示例详解

    这篇文章主要为大家介绍了Vue3基于rem比例H5缩放方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Vue使用axios图片上传遇到的问题

    Vue使用axios图片上传遇到的问题

    后端写个上传图片的接口可不是很简单,只需要让这个字段限制为图片格式,后台做个保存的逻辑就完事了,前端处理还要牵扯到请求头,数据格式的处理等等问题,按照老传统把图片按照字符串往接口put发现返回的全是400错误,直到我知道了前端的FormData方法!
    2021-05-05
  • vue微信分享出来的链接点开是首页问题的解决方法

    vue微信分享出来的链接点开是首页问题的解决方法

    这篇文章主要为大家详细介绍了vue微信分享出来的链接点开是首页问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 使用Vue3和Vite实现对低版本浏览器的兼容

    使用Vue3和Vite实现对低版本浏览器的兼容

    在使用Vite和Vue3构建的JavaScript项目中,确保对低版本浏览器的兼容性是一个重要的考虑因素,以下是一些具体的解决方案和步骤,可以帮助你实现这一目标,需要的朋友可以参考下
    2024-11-11
  • web开发中如何优雅的解决"重复请求"问题

    web开发中如何优雅的解决"重复请求"问题

    在我们的日常开发当中,很多时候会出现短时间内重复请求的情况,如果没有妥当地处理后果很严重,这篇文章主要给大家介绍了关于web开发中如何优雅的解决重复请求问题的相关资料,需要的朋友可以参考下
    2022-05-05
  • echarts 使用formatter 修改鼠标悬浮事件信息操作

    echarts 使用formatter 修改鼠标悬浮事件信息操作

    这篇文章主要介绍了echarts 使用formatter 修改鼠标悬浮事件信息操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Vue框架下引入ActiveX控件的问题解决

    Vue框架下引入ActiveX控件的问题解决

    这篇文章主要介绍了Vue框架下引入ActiveX控件的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • el-table 选中行与复选框相互联动的实现步骤

    el-table 选中行与复选框相互联动的实现步骤

    这篇文章主要介绍了el-table 选中行与复选框相互联动,分为两步,第一步点击行时触发复选框的选择或取消,第二步点击复选框时触发相应行的变化,本文通过实例代码给大家详细讲解,需要的朋友可以参考下
    2022-10-10
  • Vue开发之watch监听数组、对象、变量操作分析

    Vue开发之watch监听数组、对象、变量操作分析

    这篇文章主要介绍了Vue开发之watch监听数组、对象、变量操作,结合实例形式分析了vue.js使用Watch针对数组、对象、变量监听相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • vue实现在线预览office文件的示例代码

    vue实现在线预览office文件的示例代码

    本文主要介绍了vue实现在线预览office文件,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论