手写实现el-form系列组件的核心逻辑 -- 练习组件通信

简介: 手写实现el-form系列组件的核心逻辑 -- 练习组件通信

手写实现el-form系列组件的核心逻辑 -- 练习组件通信


以前觉得element-ui肯定特别难写,最近在看组件通信,就试试写下el-form,当做练习了,这样以后自己也能试着看懂/开发高阶组件。

本文,一步步来,读者如果有耐心的话,最好也自己手敲一遍。

搭个架子

为了快捷方便,用vue create创建个项目,因为喜欢pug,,装个npm i pug pug-plain-loader -D

先看看官网,关于el-form使用的demo,然后将重点复制到App.vue,再新建相应的组件文件。

网络异常,图片无法展示
|

显示输入框

观察App.vue

  • el-form起码有属性modelrules,还有个方法validate
  • 因为el-form-item写在其内部,所以也肯定有slot
  • 同理,el-form-item起码有属性labelprop,和slot
  • el-input可以v-model,而v-modelvalueinput的语法糖

网络异常,图片无法展示
|

组件相互获取属性和事件

输入的时候,应该要判断输入值是不是有效。

输入是在el-input那边,验证是在el-input-item那边,那么就需要在el-input调用el-input-item的验证方法

但是呢,el-input-item必须知道规则和值才能验证,换言之,需要知道el-form的信息。

先考虑el-input-item怎么拿到el-form的属性

这两,这个demo里是父子组件的关系,但实际上,不一定,但起码是 前辈和后代的关系。

之前总结过,vue组件通信方式

组件内部嵌套层级不确定,后代组件想要祖先组件数据的话,可考虑provide/inject

网络异常,图片无法展示
|

再考虑el-input怎么调用el-input-item的方法

同理,这两,这个demo里是父子组件的关系,但实际上,不一定,但起码是 前辈和后代的关系。

这里虽然也可用provide,但是可以试试$parent,毕竟一个el-input-item通常只有一个el-input

$parent很多时候需要用到递归,这里抛砖引玉下。

网络异常,图片无法展示
|

验证单个表单元素

这里引入async-validator,之前写过一个大概怎么使用

el-form-item里已经知道prop/rule,所以引入之后,就很简单了,这边加了一个显示错误信息的属性。

网络异常,图片无法展示
|

这样输入的时候,能实时验证。

当用户在App.vue那边elForm.validate()的时候,el-form里的validate是对所有表单元素的validate进行了遍历,如果都是true,那就返回true,否则就是false

所有表单元素,其实就是el-form-item,综合组件通信方式,果断还是用下$children,这里也一样要递归拿到el-form-item

网络异常,图片无法展示
|
网络异常,图片无法展示
|

至此,el-form的核心思路就完成了,重点是知道各种通信方式的方法和使用思路。

代码

github的代码这边用分支进行阶段操作,需要的话,可以练习下。

  • 搭个架子 - git checkout init
  • 显示输入框 - git checkout show-input
  • 拿到el-form实例 - git checkout provide

顺手写了个el-menu系列组件,实现核心逻辑,用到了递归组件,有兴趣可以看看

目录
相关文章
|
安全 网络安全 API
Hotmail邮箱设置Exchange的方法步骤
如何使用Exchange协议设置Hotmail邮箱:在邮件客户端(如Outlook)中添加新账户,选择Exchange服务,输入邮箱全址(@hotmail.com)和服务器地址(outlook.office365.com),启用SSL加密,完成设置后即可在各设备同步邮件、日历和联系人。AokSend提供触发式验证码发信服务,支持SMTP/API接口,高触达,独立IP和服务器。
|
机器学习/深度学习 存储 监控
「Arm Arch」 初识 Arm(上)
「Arm Arch」 初识 Arm(上)
1189 1
Java 将Map的toString格式字符串转为 Map
Java 将Map的toString格式字符串转为 Map
1512 0
Java 将Map的toString格式字符串转为 Map
|
Oracle 关系型数据库 MySQL
如何卸载Linux上的MySQL8.0
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。 本片文章为大家介绍如何卸载MySQL
1125 0
|
消息中间件 JavaScript 小程序
SpringBoot 实现 MySQL 百万级数据量导出并避免 OOM 的解决方案
SpringBoot 实现 MySQL 百万级数据量导出并避免 OOM 的解决方案
|
12月前
|
SQL 监控 Go
Golang Agent 可观测性的全面升级与新特性介绍
本文将逐个介绍 Golang Agent 的新增功能。
543 118
|
存储 JavaScript 前端开发
vue2知识点:箭头函数和普通函数的this指向问题
vue2知识点:箭头函数和普通函数的this指向问题
186 18
|
SQL 人工智能 机器人
AskYourDatabase - 和你的数据库对话
在日益增长的需求下,AI与SQL数据库的有效集成成为关键技术。本文聚焦三大核心点:一是明确应用场景,例如采用AskYourDatabase快速部署SQL聊天机器人;二是选用GPT-4级模型以保障高质量体验;三是高效检索数据库模式,确保在有限上下文中提供精准信息。此外,利用函数调用与代码解释功能生成及执行SQL查询,并实施严格的数据访问控制以保障安全性。通过这些方法,可顺利实现AI与SQL数据库的成功集成。
AskYourDatabase - 和你的数据库对话
|
存储 Oracle 关系型数据库
OceanBase有什么优势?
【8月更文挑战第12天】OceanBase有什么优势?
706 3
|
数据可视化 Python
NumPy 泊松分布模拟与 Seaborn 可视化技巧
泊松分布是描述单位时间间隔内随机事件发生次数的离散概率分布,参数λ表示平均速率。公式为 P(k) = e^(-λ) (λ^k) / k!。NumPy 的 `random.poisson()` 可生成泊松分布数据。当 λ 很大时,泊松分布近似正态分布。练习包括模拟顾客到达、比较不同 λ 下的分布及模拟电话呼叫中心。使用 Seaborn 可进行可视化。关注公众号 `Let us Coding` 获取更多文章。
355 1