Vue实现boradcast和dispatch的示例


Posted in Javascript onNovember 13, 2020

这篇内容主要是学习掘金小册vue组件精讲的一个案例,自己做下笔记,以免日后忘记。

1.mixins(混入)

我所理解的mixins就是共享,就好比面向对象里面的原型prototype那种感觉的东西,把相同的逻辑抽离出来便于维护。

先来看下src目录结构

src                    
├─ components       
│  ├─ A             
│  │  └─ index.vue  
│  ├─ B             
│  │  └─ index.vue  
├─ minixs           
│  ├─ emitter.js     //这个是要混入的js     
├─ store            
│  └─ index.js      
├─ views               
│  └─ Home.vue      
├─ App.vue          
└─ main.js  

2.emitter.js

//从外层向内层
function broadcast(componentName,eventName,params){
    this.$children.forEach(child=> {
        const name = child.$options.name;
        if(name === componentName)
        {
            child.$emit.call(child,eventName,params)
        }else
        {
            broadcast.call(child,componentName,eventName,params)
        }
    });
}

export default {
    data(){
        return{}
    },
    methods: {
        dispatch(conponentName,eventName,params){
            let parent = this.$parent || this.$root;
            let name = parent.$options.name;
            while(parent && (!name || name !==conponentName))
            {
                parent = parent.$parent;
                if(parent)
                {
                    name = parent.$options.name;
                }
            }
            if(parent)
            {
                parent.$emit.call(parent,eventName,params)
            }
        },
        broadcast(componentName, eventName, params){
            broadcast.call(this, componentName, eventName, params);
        }
    }
}

methods 里定义的 dispatch 和 broadcast 方法会被混合到组件里,自然就可以用 this.dispatch 和 this.broadcast 来使用。

这两个方法都接收了三个参数,第一个是组件的 name 值,用于向上或向下递归遍历来寻找对应的组件,第二个和第三个就是上文分析的自定义事件名称和要传递的数据。

可以看到,在 dispatch 里,通过 while 语句,不断向上遍历更新当前组件(即上下文为当前调用该方法的组件)的父组件实例(变量 parent 即为父组件实例),直到匹配到定义的 componentName 与某个上级组件的 name 选项一致时,结束循环,并在找到的组件实例上,调用 $emit 方法来触发自定义事件 eventName。broadcast 方法与之类似,只不过是向下遍历寻找。

3.具体的使用

A是B的父组件

//?组件A
<template>
<div class="main">
    <button class="btn" @click="handleClick">父组件A---触发事件</button>
    <B></B>
</div>
</template>

<script>
import B from '../B';
import emitter from '@/minixs/emitter';
export default {
    name: 'A',
    data() {
        return {};
    },
    //测试dispatch
    created() {
        this.$on('on-message', this.showMessage);
    },
    mixins: [emitter],
    components: {
        B,
    },
    methods: {
      //broadcast测试
        handleClick() {
            this.broadcast('B', 'on-click', 'Hello Vue.js');
        },
        showMessage(msg) {
            alert(msg);
        },
    },
};
</script>
<template>
<div class="b">
    我是子组件B
    <button @click="dispatchtest">dispatch发射~!?</button>
</div>
</template>

<script>
import emitter from '@/minixs/emitter';
export default {
    name: "B",
    mixins: [emitter],
    created() {
        this.$on('on-click', this.showMessage);
    },
    methods: {
        showMessage(text) {
            window.alert(text);
        },
      //dispatch派发测试
        dispatchtest() {
            this.dispatch("A", "on-message", "我就是全宇宙最善良的仔~!")
        }
    }
}
</script>

效果图:

Vue实现boradcast和dispatch的示例

Vue实现boradcast和dispatch的示例

以上就是Vue实现boradcast和dispatch的示例的详细内容,更多关于Vue实现boradcast和dispatch的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js处理表格对table进行修饰
May 26 Javascript
js实现点击添加一个input节点
Dec 05 Javascript
jQuery+Ajax实现无刷新操作
Jan 04 Javascript
jQuery简单创建节点的方法
Sep 09 Javascript
jQuery设计思想
Mar 07 Javascript
基于JavaScript实现焦点图轮播效果
Mar 27 Javascript
Vue中父组件向子组件通信的方法
Jul 11 Javascript
动态统计当前输入内容的字节、字符数的实例详解
Oct 27 Javascript
vue-element-admin 菜单标签失效的解决方式
Nov 12 Javascript
js实现简单的日历显示效果函数示例
Nov 25 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
Jul 20 Javascript
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
Vue 列表页带参数进详情页的操作(router-link)
Nov 13 #Javascript
Vue 3.0中jsx语法的使用
Nov 13 #Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
Nov 13 #Javascript
解决iView Table组件宽度只变大不变小的问题
Nov 13 #Javascript
PHP 502bad gateway原因及解决方案
Nov 13 #Javascript
解决iview table组件里的 固定列 表格不自适应的问题
Nov 13 #Javascript
Flexible.js可伸缩布局实现方法详解
Nov 13 #Javascript
You might like
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
PHP动态创建Web站点的方法
2011/08/14 PHP
jQuery+php简单实现全选删除的方法
2016/11/28 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
Python内建模块struct实例详解
2018/02/02 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
Python 远程开关机的方法
2020/11/18 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
毕业生文员求职信
2013/11/03 职场文书
合作协议书
2014/04/23 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
出纳工作检讨书
2014/10/18 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏