在 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的浮动DIV显示提示信息并自动隐藏
Feb 11 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
Aug 23 Javascript
jQuery中append()方法用法实例
Dec 25 Javascript
vue-router实现组件间的跳转(参数传递)
Nov 07 Javascript
JS实现多物体运动的方法详解
Jan 23 Javascript
jQuery与vue实现拖动验证码功能
Jan 30 jQuery
select2 ajax 设置默认值,初始值的方法
Aug 09 Javascript
微信小程序使用npm支持踩坑
Nov 07 Javascript
基于vue.js组件实现分页效果
Dec 29 Javascript
vue列表单项展开收缩功能之this.$refs的详解
May 05 Javascript
JS实现旋转木马轮播图
Jan 01 Javascript
vue ssr+koa2构建服务端渲染的示例代码
Mar 23 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
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
Python字符遍历的艺术
2008/09/06 Python
python中os模块详解
2016/10/14 Python
Python实现的堆排序算法示例
2018/04/29 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
django框架ModelForm组件用法详解
2019/12/11 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
外贸采购员求职的自我评价
2013/11/26 职场文书
后勤部长岗位职责
2013/12/14 职场文书
运动会入场式解说词
2014/02/18 职场文书
新春文艺演出主持词
2014/03/27 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
使用CSS连接数据库的方式
2022/02/28 HTML / CSS