在 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 相关文章推荐
jquery自动完成插件(autocomplete)应用之PHP版
Dec 15 Javascript
js实现透明度渐变效果的方法
Apr 10 Javascript
Jquery 分页插件之Jquery Pagination
Aug 25 Javascript
jQuery的框架介绍
May 11 Javascript
js仿小米官网图片轮播特效
Sep 29 Javascript
js实现从左向右滑动式轮播图效果
Jul 07 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
Aug 19 jQuery
浅析Vue.js中v-bind v-model的使用和区别
Dec 04 Javascript
详解vue移动端项目代码拆分记录
Mar 15 Javascript
vue+ts下对axios的封装实现
Feb 18 Javascript
javascript+Canvas实现画板功能
Jun 23 Javascript
Openlayers实现距离面积测量
Sep 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调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
php实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
js opener的使用详解
2014/01/11 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
学校体育节班级口号
2015/12/25 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python
React中的Context应用场景分析
2021/06/11 Javascript
使用CSS设置滚动条样式
2022/01/18 HTML / CSS