• 技术文章 >web前端 >js教程

    Vue.js组件库事件系统的设计过程(代码)

    不言不言2018-09-10 17:19:46原创772
    本篇文章给大家带来的内容是关于Vue.js组件库事件系统的设计过程(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    我们拿 input-number 为例:

    @ 是 v-on 指令的简写,用来绑定事件监听器:

    <InputNumber @on-change="change" :max="10" :min="1" v-model="value1">
    </InputNumber>

    我们使用组件的时候,会注册了一个自定义的事件:

    methods: {
        change (v) {
            console.log(v)
        }
    }

    在组件内部触发的方式也很简单:

    调用了 $emit 来触发当前实例上的事件,事件名为 on-change
    this.$emit('on-change', val);

    那思路来了,如果 InputNumber 外层嵌套在了某一个 FormItem 组件里面,事件之间的互相调用也是类似的,只是多了个假设:

    嵌套关系,可能有多级父子

    elementiview 多设计了一个 mixins,里面提供了一个方法:dispatch

    它接受 3 个参数:

    dispatch(componentName, eventName, params) {
    }

    比如类似 input-number,很多这种表单内嵌的组件,都会设计和 FormItem 的互动:

    this.dispatch('FormItem', 'on-form-change', val);

    我们在设计 FormItem组件的时候,注意:

    export default {
        name: 'FormItem'
    }

    然后注册一个自定义事件,方式也是一样的:

    <Form-item @on-form-change="test">
    </Form-item>

    我们来看一下 dispatch 函数的内部:

    思路是一层一层往上找父元素:

    var parent = this.$parent || this.$root;

    获取父组件的 name:

    var name = parent.$options.name;

    开始循环判断:

    while (parent && (!name || name !== componentName)) {
        // ...
    }

    比如上面的input-number 内部调用了 dispatch,传入了参数,就是一直找父元素 nameFormItem

    在 while 的内部:

    接着找它的父示例,然后获取 name

    parent = parent.$parent;
    if (parent) {
        name = parent.$options.name;
    }

    最终如果找到了:

    和最开始触发自定义事件是一样的:$emit

    if (parent) {
        parent.$emit.apply(parent, [eventName].concat(params));
    }

    相关推荐:

    Vue.js组件的通信之子组件向父组件的通信(代码)

    Vue.js移动端组件库使用方法

    以上就是Vue.js组件库事件系统的设计过程(代码)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:基于vue双向绑定实现的动态列表+动态样式(代码) 下一篇:HTTP协议中的并发限制及队首阻塞问题
    20期PHP线上班

    相关文章推荐

    精选22门好课,价值3725元,开通VIP免费学习!• 用于web应用数据管理和应用程序通讯的jQuery组件库• MintUI基于Vue.js移动端组件库详解• 在Vue 2.0模块中前端UI组件库应如何使用• Vue.js移动端组件库使用方法• 使用React如何进行组件库的开发• Vue的UI组件库自定义动态组件
    1/1

    PHP中文网