如何从Vue.js功能组件中发出事件?

Har*_*til 12 javascript vue.js vuejs2

作为问题的标题,this功能组件中没有上下文.所以,如果我必须发出一个事件,我该怎么办呢?

例如,在下面的代码片段中:

<template functional>
    <div>
        <some-child @change="$emit('change')"></some-child>
    </div>
</template>
Run Code Online (Sandbox Code Playgroud)

我的功能组件没有this上下文,因此$emit不可用.我怎么能搞砸这个活动?

rol*_*oli 14

子组件

<template functional>
  <button @click="listeners['custom-event']('message from child')">
    Button from child
  </button>
</template>
Run Code Online (Sandbox Code Playgroud)

父组件

<template>
  <div>
    <child-component @custom-event="call_a_method" />
  </div>
</template>
Run Code Online (Sandbox Code Playgroud)

看到它在codeandbox上的作用

您是否要从vue实例发出事件?

export default {
  functional: true,
  render(createElement, { listeners }) {
    return createElement(
      "button",
      {
        on: {
          click: event => {
            const emit_event = listeners.event_from_child;
            emit_event("Hello World!Is this the message we excpected? :/");
          }
        }
      },
      "Pass event to parent"
    );
  }
};
Run Code Online (Sandbox Code Playgroud)

在这里也可以看到一个沙箱示例


Dec*_*oon 11

在将属性和事件传递给子元素/组件的文档中对此进行了解释:

如果您使用基于模板的功能组件,则还必须手动添加属性和侦听器.由于我们可以访问各个上下文内容,因此我们可以使用data.attrs传递任何HTML属性和listeners(别名data.on)来传递任何事件侦听器.

在最基本的级别,您可以委托所有侦听器,如下所示:

<some-child v-on="listeners"></some-child>
Run Code Online (Sandbox Code Playgroud)

如果您只想绑定change侦听器,则可以执行以下操作:

<some-child @change="listeners.change"></some-child>
Run Code Online (Sandbox Code Playgroud)

如果listeners.change未定义/ null(未提供给功能组件),则会失败.

如果你需要处理没有change听众的情况,那么你可以这样做可憎:

<some-child @change="listeners.change || (() => {})"></some-child>
Run Code Online (Sandbox Code Playgroud)

否则你必须通过手工编写渲染函数来解决,因为我认为不可能有条件地将change侦听器分配到<some-child>功能组件的模板中.(或许你可以?我不确定.)