如果使用过 element-ui 组件库的人都知道,Form 表单由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据。用法如下:

<template><el-form :model="form" :rules="rules" ref="form"><el-form-item label="用户名" prop="username"><el-input v-model="form.username"></el-input></el-form-item><el-form-item label="密码" prop="password"><el-input v-model="form.password"></el-input></el-form-item><el-form-item><button @click="validate">确认提交</button></el-form-item></el-form>
</template>
<script>
import Form from "./components/ElForm.vue";
import FormItem from "./components/ElFormItem.vue";
import Input from "./components/ElInput.vue";
export default {components: {"el-form": Form,"el-form-item": FormItem,"el-input": Input,},data() {return {form: {username: "",password: "",},rules: {username: [{ required: true, message: "请输入用户名" }],password: [{ required: true, message: "请输入密码" }],},};},methods: {validate() {// form组件中校验是通过this.$refs.form.validate((valid) => {if (valid) {alert("校验通过");} else {alert("校验不通过");}});},},
};
</script>

今天讲解 el-form,el-form-item,el-input 的基本实现原理。掌握 el-form 组件的设计思想。

你将学会组件之间的数据通信,eventBus、children、provide。

el-form 组件

<template><form onsubmit="return false"><slot></slot></form>
</template>
<script>
export default {provide() {return {form: this,};},props: {model: {type: Object,},rules: {type: Object,},},methods: {// 在form组件中检查所有的formItem是否全部通过校验validate(cb) {cb(this.$children.every((child) => child.validateStatus !== "error"));},},
};
</script>

el-form-item 组件

<template><div><label v-if="label">{{ label }}</label><slot></slot><!-- 有错误 显示错误提示信息 --><div v-if="validateStatus === 'error'">{{ validateContent }}</div></div>
</template>
<script>
import Vue from "vue";
Vue.prototype.$bus = new Vue();
export default {props: {label: String,prop: String,},inject: ["form"], // 注入父级的实例data() {return {validateStatus: "", // 当前表单是否通过校验validateContent: "", // 当前校验后的信息};},methods: {validate(value) {let rules = this.form.rules[this.prop]; // 获取当前对应的规则rules.forEach((rule) => {// 如果必填 并且没有值,那就出错if (rule.required && !value) {this.validateStatus = "error";this.validateContent = rule.message;} else {this.validateStatus = "";this.validateContent = "";}});},},mounted() {this.$bus.$on("input", (data) => {if (this._uid === data.id) {// 说明更改的是当前自己的输入框this.validate(data.value);}});},
};
</script>

el-input 组件

<template><input type="text" :value="inputValue" @input="handleInput" />
</template>
<script>
export default {props: {value: String,},data() {return { inputValue: this.value };},methods: {handleInput(e) {// 更新数据this.inputValue = e.target.value;this.$bus.$emit("input", {id: this.$parent && this.$parent._uid, // 为了标识是哪个输入框value: this.inputValue,}); // 发射输入事件},},
};
</script>

表单校验这里也只是简单的判断,但是 Element 官网使用的是第三方的 npm 包。更多高级用法可参考 async-validator。

上面演示的代码是 vue2 版本,vue3 已经不在提供 eventBus 了,没有 $on 这个 API 了,推荐使用第三方的 npm 包 mitt 编写,源码也是这样的。

element-ui 组件库 el-form 实现相关推荐

  1. Element UI 组件库分析和二次开发(一)

    我的本地开发环境:M1 芯片Mac,node v12.22.10. 一.Element UI 组件库二次开发的大致流程 1. 从 Element 官方 clone 一份 dev 源码到本地 2. 安装 ...

  2. Element ui 组件库 使用技巧。

    按需引入 babel文件 配置. 配置 babel.config.js文件 可以创建 一个js 特意来存放我们需要的 element 组件. 在main.js 文件中 全局引入 上面存放 组件的 js ...

  3. 16款优秀的Vue UI组件库推荐

    16款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可. 在公司的Web前端项目开发中,多个项目采用 ...

  4. vant引入组件报错_强烈推荐优秀的Vue UI组件库

    在我们实际开发中常常因为项目周期短不得不引入一些UI框架来辅助开发 那常见的比较好的UI框架有那些呢(基于VUE) Element UI组件库 (pc端) Element,一套为开发者.设计师和产品经 ...

  5. 17款优秀的Vue UI组件库汇总

    17款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可. 在公司的Web前端项目开发中,多个项目采用 ...

  6. 2022-04-05 学习记录--React-React UI组件库-ant-design(蚂蚁金服)—— 按需引入样式 + 自定义主题

    一.流行的开源React UI组件库 流行的开源React UI组件库 material-ui(国外) 1.官网:http://www.material-ui.com/#/ 2.github:http ...

  7. Vue UI组件库总结推荐

    基于Vue的Quasar Framework 介绍 这个框架UI组件很全面,准备下次使用这个框架了 基于Vue的Quasar Framework 中文网 http://www.quasarchs.co ...

  8. 优秀的Vue UI组件库

    Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正 ...

  9. 你知道这些吗?8款优秀的Vue UI组件库推荐,都能打开呦

    Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可. 在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入 ...

  10. Vue UI组件库(Element UI库)

    1 移动端常用 UI 组件库 1. Vant Vant 4 - 轻量.可定制的移动端组件库 (vant-ui.github.io)  2. Cube UI cube-ui Document (didi ...

最新文章

  1. 机器学习系列22:异常检测
  2. 任正非:进军高端市场的同时,华为要防范未来竞争者从低端崛起
  3. css clearfix(针对火狐height:auto无效解决方案)
  4. JS怎样捕获浏览器关闭时间弹出自定义对话框
  5. airflow使用_使用AirFlow,SAS Viya和Docker像Pro一样自动化ML模型
  6. P1963 [NOI2009]变换序列
  7. python2和3_python2和python3的区别
  8. 2020年边缘计算最新前沿报告:如何与核心云、5G、AI协同?如何打造新业态和部署运营?...
  9. Android学习笔记(一)——控件布局常用属性
  10. Netty工作笔记0064---WebSocket长连接开发3
  11. CMOS checksum error-Defaults loaded 故障解决办法
  12. CF 559B Equivalent Strings 分治05 A题
  13. matlab tic和toc单位,matlab toc tic 的用法
  14. Make sure ‘SystemCfg‘ is registered using qRegisterMetaType
  15. OneHotEncoder简单用法
  16. Spark ML 构建回归模型
  17. php strpos注意问题坑,strpos函数的坑
  18. 不是maf格式的somatic突变数据就没办法读入到maftools了么
  19. oracle权限with admin option和with grant option的用法
  20. 计算机在小学教育教学中的优劣,计算机在小学教学中的应用探析

热门文章

  1. Docker、CentOS 8遭弃用,GPT-3、M1芯片撼动技术圈,盘点2020影响开发者的十大事件!
  2. 如何让 AI 产生意识?
  3. 大场面试必问:秒杀90%Java面试者,后悔没有早点知道!
  4. 何时不应该使用 Rails?
  5. 用 C++ 跟你聊聊“桥接模式” | 原力计划
  6. 如何让 PPT 像 PyeCharts 一样炫酷?
  7. 入选 CVPR 2020的旷视论文,到底写了啥?
  8. 绝了!RNN 还会写藏头诗!
  9. GitHub 标星 11000+,阿里开源的微服务组件如何连续 10 年扛住双十一大促?
  10. 近十年数据库流行趋势纵览!存储计算分离、ACID 全面回归......