element-ui表单源码解析之el-input
element-ui表单源码解析之el-input
关于表单校验el-input做的主要工作就是跟el-form-item交互,把input的相关事件发送给el-form-item,上一篇已经讲到在el-form-item的mounted的生命周期里面有如下代码的
this.$on('el.form.blur', this.onFieldBlur);
this.$on('el.form.change', this.onFieldChange);
我们在el-input里面依然可以看到inject,鉴于有很多单独使用el-input的地方,所以也给了默认值。
inject: {
elForm: {
default: ''
elFormItem: {
default: ''
看看computed
其实这里面的比较简单,基本都是控制状态和样式的,有些状态是由el-form或者el-form-item控制的。
watch
直接监听父级传入的value,根据value来设置组件内保存的currentValue。
看看 methods
focus() {
(this.$refs.input || this.$refs.textarea).focus();
blur() {
(this.$refs.input || this.$refs.textarea).blur();
select() {
(this.$refs.input || this.$refs.textarea).select();
handleFocus(event) {
this.focused = true;
this.$emit('focus', event);
handleBlur(event) {
this.focused = false;
this.$emit('blur', event);
if (this.validateEvent) {
this.dispatch('ElFormItem', 'el.form.blur', [this.currentValue]);
handleInput(event) {
const value = event.target.value;
this.setCurrentValue(value);
if (this.isOnComposition) return;
this.$emit('input', value);
handleChange(event) {
this.$emit('change', event.target.value);
handleComposition(event) {
if (event.type === 'compositionend') {
this.isOnComposition = false;
this.currentValue = this.valueBeforeComposition;
this.valueBeforeComposition = null;
this.handleInput(event);
} else {
const text = event.target.value;
const lastCharacter = text[text.length - 1] || '';
this.isOnComposition = !isKorean(lastCharacter);
if (this.isOnComposition && event.type === 'compositionstart') {
this.valueBeforeComposition = text;
属性validateEvent
默认是true
, 调用dispatch向上发送事件,如果存在父组件el-form-item的话,就能直接$emit对应的事件了。
在此,element-ui的表单校验系列就讲完了。
顺便提一下compositionstart
,compositionupdate
,compositionend
事件。
以一个业务场景举例吧:
比如表单里还可以输入两个字符,但我输入中文用的是拼音,要完成最后两个汉字的输入,需要按很多个字母键,但每一键都会因为input事件而截取value,导致最后两个汉字不能输入。
解决办法,使用composition来处理,有compositionstart和compositionend事件。
当我们打汉字的时候,是属于非直接输入的,这个时候应当是我们按下空格键或者选择某个汉字词后才算真正的输入,使用compositionend事件后取到的值来进行长度判断。
compositionstart事件在用户开始进行非直接输入的时候出触发,在非直接输入结束,也就是在用户点候选词或者点击选定按钮之后,会出发compositionend事件。
el-input处于compositionstart
或者compositionupdate
事件进行中会用了isOnComposition
来标记下,具体是根据最后一个字符来判断的this.isOnComposition = !isKorean(lastCharacter);
,如果是compositionstart
还会用valueBeforeComposition
先存储input里面输入的值。
- Web前端
分类:
更新时间:
相关文章
相关文章
邮箱收件人组件(vue版)成长历程(一)
邮箱收件人组件(vue版)成长历程(一)
前期项目中需要优化原始的收件人、抄送、密送部分,换成更加现代化的样式和用户,当时将这部分抽象成一个组件了,最近的需求是发件人也要使用该组件,鉴于发件人比收件人等需要校验的地方和交互习惯变动点较多,进
阅读更多…
element-ui合并单元格使用详解
element-ui合并单元格使用详解
最近做的一个叫组合商品的项目,里面需要用到饿了么的合并单元格。
看了看官方的示例,发现所谓的单元格跟我之前的认知不一样,比如有两个组合A、B,其中A是由a1和a2组合在一起(即A = [a1,
阅读更多…
element-ui表单源码解析之el-form-item
element-ui表单源码解析之el-form-item
上一篇看了el-form,功能比较简单,现在来看看el-form-item
<!--el-form-item源码-->
<template>
<div cla
阅读更多…
从vuecli3学习webpack记录(零)整体流程
从vuecli3学习webpack记录(零)整体流程
今天看了下自己之前写的从vuecli3学习webpack记录系列,感觉自己居然没有在一开始的时候把vuecli的 npm run serve 的整体流程在一篇文章里面完整的讲完,可能是因为打字打的手
阅读更多…
命令式组件Message、Dialog的主流写法分析
命令式组件Message、Dialog的主流写法分析
这里还是以element-ui为例,那我们就看看里面的Message。
它的dom结构什么的就写在node-modules/element-ui/packages/notification/src/
阅读更多…
vue实现自定义组件的v-model双向数据绑定
vue实现自定义组件的v-model双向数据绑定
一般来说我们用v-model是在input中
常见用法如下
<input type="text" v-model="username"> 用户名:{{username}}
其
阅读更多…