美文网首页Vue.js
Vue.js 组件库事件系统设计

Vue.js 组件库事件系统设计

作者: dailyvuejs | 来源:发表于2018-09-10 22:41 被阅读1次

我们拿 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 个参数:

  • componentName 组件名
  • eventName 自定义事件名称
  • params 事件传递的参数
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 函数的内部:

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

  • $parent -- 父实例
  • $root -- 组件树的根 Vue 实例
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 组件库事件系统设计

    我们拿 input-number 为例: @ 是 v-on 指令的简写,用来绑定事件监听器: 我们使用组件的时候,...

  • 记录一次vue开发遇到的坑(未完...)

    1. vue.js 组件添加事件 .native 是用来区分组件的事件和组件内部的事件,当然也可以是用的$emit...

  • vue 跳坑指南

    1. vue.js 组件添加事件 .native 是用来区分组件的事件和组件内部的事件,当然也可以是用的$emit...

  • MySql之表设计原则

    1)不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库...

  • ET 功能模块划分

    双端模块 组件系统 对象池 事件系统 Nlog 异步回调 ETTask/ETVoid MongoBson库 Tim...

  • Vue资料总汇

    文档&社区Vue.js官方网站(中文)Vue论坛vue-router组件库 文章《Vue.js:轻量高效的前端组件...

  • Vue学习网站

    Vue.js Vue的一个组件库 Vue-loder

  • Vue.js组件间调用及传值 2020最新更新

    Vue.js中,对于父子组件、平级组件间的事件触发、传值等。 调用 父组件 子组件 子组件调用父组件 子组件 触发...

  • iveiw admin 2.0实战心得

    前言:iview admin是基于Vue.js和iview组件库的开发的后台管理系统,基于它可以快速搭建一套UI简...

  • 中后台体验设计——《搭建设计系统》

    一:什么是设计系统 设计系统是产品开发的系统方法 - 完整的指南,原则,组件库,代码。它是规范多方跨学科合作的一个...

网友评论

    本文标题:Vue.js 组件库事件系统设计

    本文链接:https://www.haomeiwen.com/subject/tenegftx.html