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 相关文章推荐
FormValid0.5版本发布,带ajax自定义验证例子
Aug 17 Javascript
jquery中的sortable排序之后的保存状态的解决方法
Jan 28 Javascript
JavaScript Memoization 让函数也有记忆功能
Oct 27 Javascript
javascript中方便增删改cookie的一个类
Oct 11 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
js操作模态窗口及父子窗口间相互传值示例
Jun 09 Javascript
jquery实现全选、反选、获得所有选中的checkbox
Sep 13 Javascript
js字符串引用的两种方式(必看)
Sep 18 Javascript
vue使用Axios做ajax请求详解
Jun 07 Javascript
Vuex利用state保存新闻数据实例
Jun 28 Javascript
Vue.js递归组件实现组织架构树和选人功能
Jul 04 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
May 20 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数组交集的优化代码分析
2011/03/06 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
js获取div高度的代码
2008/08/09 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
Python爬取京东的商品分类与链接
2016/08/26 Python
Python 判断奇数偶数的方法
2018/12/20 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
html5与css3小应用
2013/04/03 HTML / CSS
金蝶的一道SQL笔试题
2012/12/18 面试题
Unix如何添加新的用户
2014/08/20 面试题
水污染治理专业毕业生推荐信
2013/11/14 职场文书
理货员的岗位职责
2013/11/23 职场文书
班组长安全职责
2014/01/05 职场文书
自我鉴定写作要点
2014/01/17 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
前台岗位职责范本
2015/04/16 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书