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+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
Mar 10 Javascript
JS读取XML文件示例代码
Nov 15 Javascript
JS正则表达式验证数字代码
Jan 28 Javascript
JS动态修改iframe高度和宽度的方法
Apr 01 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 Javascript
JS实现的跨浏览器解析XML文件实例
Jun 21 Javascript
jQuery+Pdo编写login登陆界面
Aug 01 Javascript
第一次记录Bootstrap table学习笔记(1)
May 18 Javascript
vue组件学习教程
Sep 09 Javascript
详解如何提升JSON.stringify()的性能
Jun 12 Javascript
VUE渲染后端返回含有script标签的html字符串示例
Oct 28 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 Javascript
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
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
PHP对象相关知识总结
2017/04/09 PHP
JavaScript中获取元素索引的函数
2010/09/10 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
关于JavaScript中的this指向问题总结篇
2017/07/23 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
Python写的Socks5协议代理服务器
2014/08/06 Python
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
如何基于Python按行合并两个txt
2020/11/03 Python
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
2014年教师培训的自我评价
2014/01/03 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
《三峡》教学反思
2014/03/01 职场文书
《狼》教学反思
2014/03/02 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
2015年爱国卫生工作总结
2015/04/22 职场文书
同学会感言
2015/07/30 职场文书
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL