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.js
main.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不对。

插件调用
image.png

标签组件调用
image.png

问题未解决。已改用其它全局广播收听方式实现,从而避开了this.$root.$emit/$on的方式

阅读 2.1k
1 个回答

在case里面加个打印看走不走,不清楚这个key对不对,如果走的话,打印下this,有可能this指的不是一个。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题