在 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 表单提交后按钮变灰的实例代码
Aug 16 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
Nov 14 Javascript
JavaScript中的return语句简单介绍
Dec 07 Javascript
js实现键盘自动打字效果
Dec 23 Javascript
JS实现复制内容到剪贴板功能
Feb 05 Javascript
JS作用域链详解
Jun 26 Javascript
node通过express搭建自己的服务器
Sep 30 Javascript
Angular2学习笔记之数据绑定的示例代码
Jan 03 Javascript
vue中v-for通过动态绑定class实现触发效果
Dec 06 Javascript
vue+express+jwt持久化登录的方法
Jun 14 Javascript
Vue v-text指令简单使用方法示例
Sep 19 Javascript
vue 组件销毁并重置的实现
Jan 13 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开发Apache服务器配置
2015/07/15 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
用python处理MS Word的实例讲解
2018/05/08 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
python实现小球弹跳效果
2019/05/10 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
python实现井字棋小游戏
2020/03/04 Python
python使用列表的最佳方案
2020/08/12 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
预备党员党课思想汇报
2014/01/13 职场文书
开学典礼主持词
2014/03/19 职场文书
干部考核评语
2014/04/29 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
协议书格式模板
2016/03/24 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书