vue的根实例上使用$emit/$on的问题
代码是这样的
app.vue
... window.addEventListener('keydown', e => {
const key = e.key
switch (key) {
case 'Enter':
this.$root.$emit('keydown', { key: 'enter' })
break
case 'Tab':
this.$root.$emit('keydown', { key: 'tab' })
break
case 'ArrowUp':
this.$root.$emit('keydown', { key: 'up' })
break
case 'ArrowDown':
this.$root.$emit('keydown', { key: 'down' })
break
default:
}
})
通过插件形式调用挂载的组件(即使用Vue.extend(),然后this.$xxx.show()的形式)
省略main.jsmain.vue如下
...
mounted() {
this.initKeyDown()
},
methods: {
initKeyDown() {
console.log(1)
this.$root.$on('keydown', e => {
console.log(2)
const { key } = e
let focusType = this.$root.focusType
if (key === 'up') {
if (focusType === 'menu-dialog') {
this.hoverIndex = this.hoverIndex === 0 ? 0 : this.tab - 1
}
}
以上的this.$root.$emit和$on在组件中使用是正常的,仅在插件调用的组件中异常。
异常是:
上面代码可以打印出1,但打印不出2,我试着把initKeyDown的调用方法放在show中,也是一样。
不清楚是为什么,有人遇到过吗?是怎么解决呀?谢谢..
21-12-8更新
原因已经找到了,插件调用的组件,this.$root指向的$el不对。
插件调用
标签组件调用
问题未解决。已改用其它全局广播收听方式实现,从而避开了this.$root.$emit/$on的方式
回答:
在case里面加个打印看走不走,不清楚这个key对不对,如果走的话,打印下this,有可能this指的不是一个。
以上是 vue的根实例上使用$emit/$on的问题 的全部内容, 来源链接: utcz.com/p/936639.html