在 Vue.js中优雅地使用全局事件的方法


Posted in Javascript onFebruary 01, 2019

Vue 2.0 版本中取消了 v1 中的 $broadcast 方法,因此要使用全局事件时,不可避免地会使用到 event-bus 之类的方法,本文旨在提出一种不需要用到 event-bus 的全局事件使用方法。

主要思路是将事件全部绑定在 $root 上,并为所有全局事件添加一个前缀防止冲突,再通过向 $options 上注入新的 key 来简化使用方式。

以下为 mixin 文件代码

// event-mixin.js
export default {
 created() {
  if (this.$options.events) {
   Object.keys(this.$options.events).forEach(key => {
    let handler = this.$options.events[key]
    if (typeof handler === 'string') {
     handler = this[handler]
    }
    this[key + '::handler'] = handler.bind(this)
    this.$root.$on('global::' + key, this[key + '::handler'])
   })
  }
 },
 beforeDestroy() {
  if (this.$options.events) {
   Object.keys(this.$options.events).forEach(key => {
    this.$root.$off('global::' + key, this[key + '::handler'])
   })
  }
 }
}

使用前先在 main.js 中调用 mixin

Vue.mixin(require('./event-mixin.js').default)
在各个组件中,向 $root 发送事件即可

// a.vue
export default {
  name: 'a',
  events: {
    'evt.a': 'handlerA',
    'evt.b'() {
      console.log('B triggered')
    }
  },
  methods: {
    handlerA() {
      console.log('A triggered')
    }
  }
}
// b.vue
export default {
  name: 'b',
  events: {
    'evt.b'() {
      console.log('B triggered again')
    }
  }
}
// c.vue
export default {
  name: 'c',
  created() {
    this.$root.$emit('global::evt.a') // 'A triggered'
    this.$root.$emit('global::evt.b', 'data') // 'B triggered', 'B triggered again'
    // 使用以上方式触发,也可以在 mixin 中向实例添加专用触发方法
  }
}

使用这种方法,可以避免新建专门用于传输事件的 vue 实例,编写回调函数时也更容易管理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
写js时遇到的一些小问题
Dec 06 Javascript
js中巧用cssText属性批量操作样式
Mar 13 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
Oct 09 Javascript
js获取上传文件大小示例代码
Apr 10 Javascript
@ResponseBody 和 @RequestBody 注解的区别
Mar 08 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
Sep 28 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
Apr 22 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
Sep 13 Javascript
javascript数组的定义及操作实例
Nov 10 Javascript
vue实现短信验证码输入框
Apr 17 Javascript
原生js实现五子棋游戏
May 28 Javascript
微信小程序实现的动态设置导航栏标题功能示例
Jan 31 #Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
Jan 31 #Javascript
JS基于对象的链表实现与使用方法示例
Jan 31 #Javascript
JS栈stack类的实现与使用方法示例
Jan 31 #Javascript
JQuery中queue方法用法示例
Jan 31 #jQuery
JavaScript两种计时器的实例讲解
Jan 31 #Javascript
JavaScript对JSON数组简单排序操作示例
Jan 31 #Javascript
You might like
PHP脚本的10个技巧(1)
2006/10/09 PHP
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
php 类自动载入的方法
2015/06/03 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
Python的Flask框架中Flask-Admin库的简单入门指引
2015/04/07 Python
python3实现磁盘空间监控
2018/06/21 Python
Python重新加载模块的实现方法
2018/10/16 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
详解pandas赋值失败问题解决
2020/11/29 Python
详解HTML5布局和HTML5标签
2020/10/26 HTML / CSS
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
error和exception有什么区别
2012/10/02 面试题
金融专业应届生求职信
2013/11/02 职场文书
留学推荐信写作指南
2014/01/25 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
班子四风对照检查材料
2014/08/21 职场文书
2014年教研工作总结
2014/12/06 职场文书
员工升职自荐信
2015/03/27 职场文书
特种设备安全管理制度
2015/08/06 职场文书
python如何进行基准测试
2021/04/26 Python
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android