Vue.js 3 this.$root.$on 不是函数

Čam*_*amo 5 javascript events vue.js vue-component vuejs3

我有一个触发this.$root.$emit('some-root-event')类似的组件

clickHandler: function() {
    this.$root.$emit("some-root-event", "aaaaaaaaaaaaaaaaaaaaaa");
    console.log('About $root.$emit')
}
Run Code Online (Sandbox Code Playgroud)

里面的另一个组件应该捕获这个事件,但抛出一个错误:

this.$root.$on 不是函数

第二个组件的代码看起来像

mounted() {
    this.$root.$on("some-root-event", (data) => {
        console.log("About listener catch $root some-root-event"); console.log(data)
    })
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我了解问题出在哪里吗?

Bou*_*him 20

根据Vue.js 3 中的RFC,$on他们删除了,$once$off实例方法:

他们的动机

$dispatchVue 1.x 实现了与AngularJS 类似的组件事件系统,$broadcast树中的组件可以通过在树上上下发送事件来进行通信。在 Vue 2 中,我们删除$dispatch$broadcast支持更多状态驱动的数据流(props down,events up)。使用 Vue 2 的 API,$emit可用于触发由父组件(在模板或渲染函数中)以声明方式附加的事件处理程序,但也可用于触发通过事件发射器 API($on 和$off)强制附加的处理程序$once。这实际上是一个重载:完整的事件发射器 API 不是典型的组件间数据流的一部分。它们很少被使用,并且实际上没有充分的理由让它们通过组件实例公开。因此,该 RFC 建议删除$on,$off$once实例方法

  • 谢谢,您能为那些从 Vue2 迁移到 Vue3 的人解释一下 `this.$root.$on` / `this.$root.$off` 的替代方案是什么吗? (12认同)
  • 您可以在这里找到迁移策略:https://v3-migration.vuejs.org/writing-changes/events-api.html#_2-x-syntax (2认同)