道招

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的表单校验系列就讲完了。

顺便提一下compositionstartcompositionupdatecompositionend事件。 以一个业务场景举例吧:

比如表单里还可以输入两个字符,但我输入中文用的是拼音,要完成最后两个汉字的输入,需要按很多个字母键,但每一键都会因为input事件而截取value,导致最后两个汉字不能输入。

解决办法,使用composition来处理,有compositionstart和compositionend事件。

当我们打汉字的时候,是属于非直接输入的,这个时候应当是我们按下空格键或者选择某个汉字词后才算真正的输入,使用compositionend事件后取到的值来进行长度判断。

compositionstart事件在用户开始进行非直接输入的时候出触发,在非直接输入结束,也就是在用户点候选词或者点击选定按钮之后,会出发compositionend事件。

el-input处于compositionstart或者compositionupdate事件进行中会用了isOnComposition来标记下,具体是根据最后一个字符来判断的this.isOnComposition = !isKorean(lastCharacter);,如果是compositionstart还会用valueBeforeComposition先存储input里面输入的值。

更新时间:
上一篇:element-ui表单源码解析之el-form-item下一篇:vue里面使用debounce,throttle注意点

相关文章

vue多语言的解决方案不只是 vue-i18n,前端+后端完整解决方案

网上搜很多vue多语言的,一般都是介绍vue-i18n怎么使用,当然这是不错的,但是我们如果只是讲这个的话,只是解决了静态文字的多语言化。 这一部分我们也简单讲一下 npm install 阅读更多…

邮箱收件人组件(vue版)成长历程(一)

前期项目中需要优化原始的收件人、抄送、密送部分,换成更加现代化的样式和用户,当时将这部分抽象成一个组件了,最近的需求是发件人也要使用该组件,鉴于发件人比收件人等需要校验的地方和交互习惯变动点较多,进 阅读更多…

命令式组件Message、Dialog的主流写法分析

这里还是以element-ui为例,那我们就看看里面的Message。 它的dom结构什么的就写在node-modules/element-ui/packages/notification/src/ 阅读更多…

2021年的一点工作总结(一)迁移React技术栈

2021年全年的工作总结起来很简单,算是做苦力的一年吧。。。 2021年春节后就开始邮件项目从Vue迁移到React的工作以及富文本编辑器由wangEditor替换成CKEditor。 其实自己 阅读更多…

Vue在chrome44偶现点击子元素事件无法冒泡

公司的一个项目大致是这样的:一个左侧列表,点击左侧列表的文章标题,右侧展开该文章对应的内容的。 现在的问题出现在极少部分客户有时左侧的标题,无法打开对应的右侧的内容,给人的改进就是‘卡’、点不动、点 阅读更多…

用在线IDE写vue代码

上周末无意中发现了一个新的在线IDE,网址glitch.com,个人感觉很不错,于是顺便关注了下其它的在线IDE,比如codesandbox.io也不错,没有细看,可能自己已经先入为主的喜欢上glit 阅读更多…

关注道招网公众帐号
友情链接
消息推送
道招网关注互联网,分享IT资讯,前沿科技、编程技术,是否允许文章更新后推送通知消息。
允许
不用了