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 相关文章推荐
Javascript 圆角div的实现代码
Oct 15 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
Dec 02 Javascript
jquery的ajax异步请求接收返回json数据实例
Jun 16 Javascript
JS HTML5拖拽上传图片预览
Jul 18 Javascript
angular.js之路由的选择方法
Sep 24 Javascript
微信小程序 开发经验整理
Feb 15 Javascript
jQuery查找dom的几种方法效率详解
May 17 jQuery
JS原生轮播图的简单实现(推荐)
Jul 22 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
微信小程序实现发送验证码按钮效果
Dec 20 Javascript
Node.js的进程管理的深入理解
Jan 09 Javascript
ES6 Symbol在对象中的作用实例分析
Jun 06 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中函数前加&amp;符号的作用分解
2014/07/08 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
2011/03/25 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
python连接数据库的方法
2017/10/19 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
Python类super()及私有属性原理解析
2020/06/15 Python
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
一套PHP的笔试题
2013/05/31 面试题
中科软测试工程师面试题
2012/06/16 面试题
行政专员的岗位职责
2014/03/10 职场文书
2014年创先争优活动总结
2014/05/04 职场文书
商务经理岗位职责
2014/08/03 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
个人年终总结范文
2015/03/09 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers