在 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去空格处理方法
Nov 18 Javascript
当鼠标移动时出现特效的JQuery代码
Nov 08 Javascript
javascript日期操作详解(脚本之家整理)
Sep 05 Javascript
详解Webwork中Action 调用的方法
Feb 02 Javascript
理解Javascript图片预加载
Feb 23 Javascript
静态页面实现 include 引入公用代码的示例
Sep 25 Javascript
vue mint-ui学习笔记之picker的使用
Oct 11 Javascript
在vue里面设置全局变量或数据的方法
Mar 09 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
Jun 05 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
Aug 27 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
Nov 05 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
Nov 04 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中var_dump方法的使用详解
2013/06/24 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
Javascript的闭包
2009/12/31 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
js实现select下拉框选择
2020/01/11 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
盘点提高 Python 代码效率的方法
2014/07/03 Python
python内存管理分析
2015/04/08 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
如何基于python操作excel并获取内容
2019/12/24 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
使用pytorch完成kaggle猫狗图像识别方式
2020/01/10 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
python如何实现递归转非递归
2021/02/25 Python
一些Unix笔试题和面试题
2013/01/22 面试题
办公自动化毕业生求职信
2014/03/09 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
二年级数学教学反思
2016/02/16 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript
一文搞懂Java中的注解和反射
2022/06/21 Java/Android