Vue.js 如何确定父组件中是否捕获了事件

Vue.js 如何确定父组件中是否捕获了事件,vue.js,Vue.js,我有一个通用组件(在多个地方使用),它在动作时发出事件。例如: onClick(value) { this.$emit('on-click', value); //But I want to do this only if there a listener on on-click event // Else this.defaultAction(); // Or if there is no listener in the parent component then do s

我有一个通用组件(在多个地方使用),它在动作时发出事件。例如:

onClick(value) {
   this.$emit('on-click', value); //But I want to do this only if there a listener on on-click event

   // Else
   this.defaultAction(); // Or if there is no listener in the parent component then do some default action.
}

我总是可以传递另一个道具来进行检查,但这可以不用它吗?

您总是可以使用
vm.$listeners
vm
是组件实例)属性来检查是否存在事件处理程序。有关更多详细信息,请参阅。(同样,这也是在Vue JSX和React JSX中以JSX方式进行操作的方式。)

但请注意,这是在Vue.js中考虑它的一种方式

问题不在于是否应该添加额外的道具来表示是否存在侦听器。问题在于抽象。有时,你让父母做这项工作,有时让孩子做这项工作。简言之,您的工作流是零碎的,用户界面不是一个良好的状态函数的味道是显而易见的


要么在父级中同时执行if/else场景(即相同的抽象级别),并强制始终提供侦听器,要么始终在子组件中执行。

您不认为这是多余的吗?这将调用在数组中注册的侦听器,因此检查是否有侦听器,然后调用将加倍所需的工作。因此,您认为为我的用例添加一个道具将是更好的选择吗?有没有一个简单的方法可以做到这一点?没错,但在我的例子中,子组件是非常通用的,我不想更改所有其他使用它的组件。并且只有少数组件需要根据事件执行某些特定操作。@Neha在这种情况下,引入HOC-高阶组件。子组件上的第三个组件封装了此行为。所以家长->学童->孩子。您的孩子和主要家长都不应该包含这种横切逻辑。