Svelte - 从组件脚本转发事件

Svelte - Forwarding event from component scripting

我想知道如何使用 Svelte 转发来自函数的事件。

例如,我有一个 App.svelte 和一个 Component.svelte 文件。 Component.svelte是一个按钮组件。我想像这样处理 on:click 事件:

<script>
   function handle(e){ /** Do things */ -  /** Forward Event */ }
</script>

<button on:click={handle}/>

所以我也可以从 App.svelte 文件中获取事件

<script>
   import Button from './component.svelte'

   function handle(e){ /** Do something */ }
</script>

<div>
   <Button on:click={handle}/>
</div>

我知道您可以在 component.svelte 文件中转发事件,只需填写 on:click 属性而不指定函数来调用。但就我而言,我需要在我的组件内部进行一些内部逻辑。或者我真的需要为此创建自定义事件处理程序吗?

感谢您的帮助:)

不知道我理解的对不对。您可以在您的函数中处理您的自定义逻辑,然后只需调度 click 转发。

在你的组件中:

<script>
  import { createEventDispatcher } from 'svelte'
  const dispatch = createEventDispatcher()
  function handle(e){
    console.log(”comp”)
    dispatch('click', e)
  }
</script>
<button on:click={handle}>test</button>

您正在寻找的是 createEventDispatcher 它允许您 'manually' 触发事件。所以你会做的是:

import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();

function handle(e) {
 // do stuff
 dispatch('my-event', data);
}

现在您可以使用 on:my-event 收听此事件(请注意,这很可能是 on:click 或其他),传入此事件的 data 可以访问为ev.detail

Or do I really need to create custom event handler for that ?

不,如果您只想听点击,但您希望在组件内部执行逻辑并将点击传递给 parent,则不需要自定义事件。

Svelte 允许您添加任意数量的 on:click。因此,其中一个 on:click 可以为空,并将点击处理程序传递给 parent,另一个可以处理组件的内部 function/logic。

<button on:click={internalFunction} on:click>Something</button>

这里有一个 REPL 显示它有效,我通常使用它来避免 createEventDispatcher 的样板,因为我需要知道的只是两个组件中的单击。当然,如果您需要单击以在 child 中执行某些操作,然后发生其他一些事情,然后 parent 会收到通知,那么您将需要分派该事件,但这适用于您的示例。