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 相关文章推荐
国外Lightbox v2.03.3 最新版 下载
Oct 17 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
Apr 24 Javascript
js 中的switch表达式使用示例
Jun 03 Javascript
对JavaScript客户端应用编程的一些建议
Jun 24 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
Apr 20 Javascript
jQuery实现简单倒计时功能的方法
Jul 04 Javascript
JavaScript方法_动力节点Java学院整理
Jun 28 Javascript
关于定制FileField中的上传文件名称问题
Aug 22 Javascript
最基础的vue.js双向绑定操作
Aug 23 Javascript
vue如何获取自定义元素属性参数值的方法
May 14 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
Nov 20 Javascript
Node.js 深度调试方法解析
Jul 28 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
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
php强制下载文件函数
2016/08/24 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
批处理与python代码混合编程的方法
2016/05/19 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
Django视图类型总结
2021/02/17 Python
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
比较基础的php面试题及答案-填空题
2014/04/26 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
医院实习介绍信
2014/01/12 职场文书
绩效工资实施方案
2014/03/15 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
详细介绍python类及类的用法
2021/05/31 Python
图文详解nginx日志切割的实现
2022/01/18 Servers
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL