eventBus的一些使用

146 阅读2分钟

都是一些个人总结,希望对你有些帮助, 代码的测试环境在vue手脚架创建的项目中测试的

eventBus

它其实是一个js文件,这个js文件中写的是一个空的vue实例(代码如下)。也叫事件总线。我们可以将兄弟组件和嵌套比较深得事件放到这里面。

import Vue from "vue";

export default new Vue()

有了一个空的容器,我们在需要传值的两个组件里引入这个文件。

import bus from'@/utils/eventBus'

我们用click事件来发射事件,这是一种比较好理解的方式

数据源的组件需要向 EventBus 发送事件,事件里可以包含数据。

发送事件的语法:bus.$emit('事件名称(sun)',数据) 这个时候我们在eventBus里面会有一个名字为sun的事件(这里有一个细节,这个事件的存入在整个项目中会一直存在再这个容器里,如果不做特出处理的化)

需要数据的组件要监听EventBus里面的事件

监听事件的语法:bus.$on('事件名称(sun)',函数) 这个监听一般放在组件的created钩子函数内(这个钩子函数可以当成组个组件刚创建就会执行的一个函数)。

bus.$emit('sun',this.tasks)

vue的事件不止有click一种

我们尝试换成input这个触发机制,当我们输入每一个字符都会触发一次事件的监听对cpu资源造成很大的浪费 keyup事件也是同样的效果

bus.$on('sun',end()=>{....})

vue它提供了一个短暂的缓存空间,如果这个组件用v-show隐藏了,或者放入了缓存空间,那么监听函数sun的机制是一直存在的,会造成资源的浪费。为了避免在监听时,事件被反复触发,通常需要在页面销毁时移除事件监听。或者在开发过程中,由于热更新,事件可能会被多次绑定监听,这时页需要移除事件监听。(代码如下) 销毁监听的语法:bus.$off('事件名称sun')

destroyed(){
        bus.$off('sun')
    }

我们一般会再destroyed钩子函数(我们销毁一个组件的时候会触发的函数,我们常用来销毁一些监听事件及定时函数)内销毁这个监听事件,以免产生不必要的操作。

再还没有学会vuex的数据共享的时候 嵌套多层的组件需要传值,我们可以通过eventBus这个事件总线发射事件,然后监听事件。注意我们这里计时销毁监听,不然这个监听会一直存在。