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 相关文章推荐
漂亮的仿flash菜单,来自蓝色经典
Jun 26 Javascript
探寻JavaScript中this指针指向
Apr 23 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
May 29 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
Jul 27 Javascript
echart简介_动力节点Java学院整理
Aug 11 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
Sep 05 Javascript
vue项目部署到Apache服务器中遇到的问题解决
Aug 24 Javascript
javascript实现计算指定范围内的质数示例
Dec 29 Javascript
javascript中undefined的本质解析
Jul 31 Javascript
详解datagrid使用方法(重要)
Nov 06 Javascript
Selenium执行JavaScript脚本的方法示例
Dec 31 Javascript
使用react+redux实现计数器功能及遇到问题
Jun 02 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
PHP对字符串的递增运算分析
2010/08/08 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
2013/10/15 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
python实现浪漫的烟花秀
2019/01/30 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
对Django中内置的User模型实例详解
2019/08/16 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
python 实现简单的FTP程序
2019/12/27 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
详解python中的闭包
2020/09/07 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
生物制药自我鉴定
2014/01/25 职场文书
人事部专员岗位职责
2014/03/04 职场文书
法定代表人身份证明书
2015/06/18 职场文书
安全生产会议制度
2015/08/06 职场文书
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers