element-ui源码详细分析以及在其中可以学到的东西整理。(有问题欢迎指正与讨论)
首先看生命周期做了什么
1 | created() { |
外层DIV绑定的一些class
插槽及一些props传入的参数控制外层样式
1 | <div :class="[ |
实例属性$slots用来访问被插槽分发的内容
- vm.$slots.foo 访问具名插槽foo
- vm.$slots.default 没有被包含在具名插槽中的节点
有多个条件 class 时:
- 可以用数组结合对象的写法
内层input结构
1 | <!-- 输入框结构 --> |
前置后置内容及插槽:基本上都是通过props接收的变量或者插槽控制样式及位置偏移,这里我就先“…”了
中文输入法相关的事件
- compositionstart
- compositionupdate
- compositionend
首先会看到input上绑定了这三个事件(在下孤陋寡闻没有见过),于是尝试一下触发时机
根据上图可以看到
- 输入到input框触发input事件
- 失去焦点后内容有改变触发change事件
- 识别到你开始使用中文输入法触发compositionstart 事件
- 未输入结束但还在输入中触发compositionupdate 事件
- 输入完成(也就是我们回车或者选择了对应的文字插入到输入框的时刻)触发compositionend事件。
查阅资料后发现,这三个事件不仅包括中文输入法还包括语音识别。
下面是MDN上的解释
类似于
keydown
事件,但是该事件仅在若干可见字符的输入之前,而这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词
那么问题来了 为什么要使用这几个事件呢
因为input组件常常跟form表单一起出现,需要做表单验证
为了解决中文输入法输入内容时还没将中文插入到输入框就验证的问题
我们希望中文输入完成以后才验证
不曾用过的属性
特指本渣눈.눈
- $attrs: 获取到子组件props没有注册的,除了style和class以外所有父组件的属性。(感觉好强!)
- tabindex: 原生属性, 元素的 tab 键控制次序(具体的自行查阅)
- readonly :原生属性,只读。(true时input框不可修改)
- autoComplete:原生属性 当用户在字段开始键入时,浏览器基于之前键入过的值,是否显示出在字段中填写的选项。
- aria-label:原生属性,tab到输入框时,读屏软件就会读出相应label里的文本。
内层textarea 结构
1 | <!-- 文本域结构 --> |
绑定的事件及属性与input差不多,区别是textarea动态控制高度的style
textarea 高度自适应
props
- autosize 自适应高度的配置
- resize 是否缩放
1 | computed: { |
calcTextareaHeight 是calcTextareaHeight.js里的方法,计算文本域高度及设置样式
我就直接贴代码和分析的注释了
1 | let hiddenTextarea; |
需要注意的一些点
form组件中嵌套input组件时样式也会受form一些注入属性的控制。
1 | // 接收form组件注入的属性 |
size(input的大小)
this.elFormItem.validateState: 与表单验证关联 ,控制表单验证时icon的样式(红x之类的)
1 | computed: { |
props的validateEvent属性:时间选择器会传入false其他默认true (意思大概true是需要做校验),以下是用到validateEvent的methods
1 |
|
dispatch这个方法开始我以为是触发vuex的方法结果是mixin里的
路径: src/mixins/emitter.js
1 | // 接收组件名,事件名,参数 |
导入的Migrating
迭代api友好提示 方便由于用了移除的api报错 找出问题在哪 参见methos中getMigratingConfig事件及src/mixins/migrating.js
疑问
1 | // 判断韩文的方法(不清楚为什么) |