都是一些个人总结,希望对你有些帮助, 代码的测试环境在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这个事件总线发射事件,然后监听事件。注意我们这里计时销毁监听,不然这个监听会一直存在。