文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何手写El-Form表单组件

2024-12-03 00:09

关注

前言

在刚入行时候,只会知道如何使用表单组件,在后面一两年工作中也没有什么技术积累成为一个工具人,操作最多的就是ctrl+c和ctrl+v,在去年进了一家新公司,这家公司以前旧项目代码经过太多人的手,代码已经快不成人样了,难以维护,技术人员已经跑的差不多了,我进去好在让我们负责新的项目开发,要不然可能第二天就看不到我了,哈哈。项目主要面向于小程序和H5端,网上的UI库很难满足产品后续规划需求开发,只好开始研究组件原理及封装组件。

最近又个项目让我有开始接触element-ui,想到当初对el-form表单有一些困惑,查看一下源码和一些技术文章,对el-form有一些新的认识。

Form 表单

下面是一份el-form示例代码

  1.  
  2.  
  3.  

首先要清楚一下组件的使用方式

el-form接收model和rule两个prop

el-form-item接收的prop属性,对应form组件的model数据中某个key值,如果rule刚好有key,给定的条件下去如失去焦点验证规则匹不匹配。

最终得到类似这样代码结构

  1.  

手写表单组件

组件中嵌套组件,主要是通过slot插槽,可以将组件拼接成上面代码结构。代码如下

el-form

  1.  
  2.  

 

el-form-item

  1.  
  2.  

el-input

  1.  
  2.  

 接下来就要考虑到组件中的通讯。由于组件中有可能嵌套很多的组件,如果单纯通过$parent和$children查找出来的父级组件,不一定是el-form组件。

两个问题:

解决第一问题,可以通过provide与inject实现。解决第二问题,就要讲到dispatch派发和broadcast广播

provide与inject

通过provide将当前表单实例传递到所有后代组件中,后代通过inject接受传递的值。

el-form

  1.  
  2.  

el-form-item

  1.  
  2.  

provide中this指el-form组件,this.elForm就能得到el-form组件中的数据和方法。

dispatch和broadcast广播

$dispatch与$broadcast是一种有历史的组件通信方式,因为他们是Vue1.0提供的一种方式,在Vue2.0中废弃了。

$dispatch: $dispatch会向上触发一个事件,同时传递要触发的祖先组件的名称与参数,当事件向上传递到对应的组件上时会触发组件上的事件侦听器,同时传播会停止。

$broadcast: $broadcast会向所有的后代组件传播一个事件,同时传递要触发的后代组件的名称与参数,当事件传递到对应的后代组件时,会触发组件上的事件侦听器,同时传播会停止(因为向下传递是树形的,所以只会停止其中一个叶子分支的传递)

$dispatch

  1.  
  2.     dispatch(componentName, eventName, params) { 
  3.         let parent = this.$parent || this.$root;//$parent 找到最近的父节点 $root 根节点 
  4.         let name = parent.$options.name; // 获取当前组件实例的name 
  5.         // 如果当前有节点 && 当前没名称 且 当前名称等于需要传进来的名称的时候就去查找当前的节点 
  6.         // 循环出当前名称的一样的组件实例 
  7.         while (parent && (!name||name!==componentName)) { 
  8.             parent = parent.$parent; 
  9.             if (parent) { 
  10.                 name = parent.$options.name
  11.             } 
  12.         } 
  13.         // 有节点表示当前找到了name一样的实例 
  14.         if (parent) { 
  15.             parent.$emit.apply(parent,[eventName].concat(params)) 
  16.         } 
  17.     }, 

$broadcast

  1.  
  2. broadcast(componentName, eventName, params) { 
  3. // 循环子节点找到名称一样的子节点 否则 递归 当前子节点 
  4. this.$children.map(child=>{ 
  5.     if (componentName===child.$options.name) { 
  6.         child.$emit.apply(child,[eventName].concat(params)) 
  7.     }else { 
  8.         broadcast.apply(child,[componentName,eventName].concat(params)) 
  9.     } 
  10. }) 

验证表单

async-validator是一个表单的异步验证的第三方库,也是element-ui 中的form组件所使用的验证方式。 

el-form-item

  1.  
  2.  

 

来源:前端有道内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯