持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天
多层组件的事件提交
在进行项目开发时,有时会遇到这种情况:一个页面组件内用到两个单独的组件A和B,其中一个单独的组件A内又有一个小组件C,而这个小组件需要将事件提交给页面组件,然后调用组件A中的方法,这是我们如果用emit一层一层来提交,显然过于繁琐了,这时候我们就要改变思路。
思路一-vuex变量监听: 就是通过vuex来实现状态检测,当我们需要调用组件A的方法时,通过小组件C来更改vuex中定义的变量,同时,当页面组件监听到vuex中对应状态的改变,就可以响应地调用组件A中的方法
思路二-总线: 在计算机基础中我们学过总线的概念,与在这里的原理一样,一条总线贯穿始终,连接多个组件,相差多层的组件通过这条总线来进行互通,简化通讯的过程
//通过总线提交
this.$bus.$emit('emitEvents')
//监听总线(一般在生命周期中定义)
this.$bus.$on('emitEvents', fun)
//在main.js中定义总线
Vue.prototype.$bus = new Vue()
但在实际应用中,弹出报错找不到对应方法,最后发现问题是在提交事件时,组件A还未挂载成功,所以切记我们要对其进行settimeout延迟处理,之后再提交事件,或者在A组件的方法体中根据某些属性来判断当前实例是否存在,若存在则证明挂载成功,再执行方法,我这里使用后者
//组件A方法体中,很妙的逻辑短路写法,简单易懂
//this.prop使用特定的属性,以判断组件是否创建
//this.fun判断该方法是否存在
this.prop && this.fun && dosth