在 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 相关文章推荐
ExtJS 设置级联菜单的默认值
Jun 13 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
Apr 02 Javascript
jQuery如何使用自动触发事件trigger
Nov 29 Javascript
给before和after伪元素设置js效果的方法
Dec 04 Javascript
AngularJS入门教程之AngularJS模型
Apr 18 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
Oct 10 Javascript
js实现右键菜单功能
Nov 28 Javascript
在React中如何优雅的处理事件响应详解
Jul 24 Javascript
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
一秒学会微信小程序制作table表格
Feb 14 Javascript
详解关于html,css,js三者的加载顺序问题
Apr 10 Javascript
vue axios封装及API统一管理的方法
Apr 18 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
19个超实用的PHP代码片段
2014/03/14 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
Python深入学习之闭包
2014/08/31 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
Django中modelform组件实例用法总结
2020/02/10 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
教师个人读书活动总结
2014/07/08 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
农村党支部书记司法四风问题对照检查材料
2014/09/26 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
Python操作CSV格式文件的方法大全
2021/07/15 Python
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL