在 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 相关文章推荐
在textarea中显示html页面的javascript代码
Apr 20 Javascript
jquery如何把数组变为字符串传到服务端并处理
Apr 30 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
Jan 12 Javascript
JS图片等比例缩放方法完整示例
Aug 03 Javascript
AngularJs Injecting Services Into Controllers详解
Sep 02 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
ECMAScript6 新特性范例大全
Mar 24 Javascript
深入理解JavaScript的值传递和引用传递
Oct 24 Javascript
React精髓!一篇全概括小结(急速)
May 23 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
May 23 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
Sep 18 Javascript
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
微信小程序实现的动态设置导航栏标题功能示例
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通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
php中autoload的用法总结
2013/11/08 PHP
PHP APC配置文件2套和参数详解
2014/06/11 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
php session的锁和并发
2016/01/22 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
python为什么会环境变量设置不成功
2020/06/23 Python
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
VC++笔试题
2014/10/13 面试题
利用指针变量实现队列的入队操作
2012/04/07 面试题
党校个人自我鉴定范文
2014/03/28 职场文书
公司合作意向书
2014/04/01 职场文书
羽毛球比赛策划方案
2014/06/13 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
2014年度培训工作总结
2014/11/27 职场文书
旷工辞退通知书
2015/04/17 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
Python编程super应用场景及示例解析
2021/10/05 Python