Можно ли создать компонент и программно подключить к нему прослушиватели событий?
Я знаю, что это легко возможно для реквизита, использующего <svelte:component/>
, с расширением { ...props }
. Интересно, можно ли добиться чего-то подобного для присоединения слушателей событий.
Например, в следующем примере я хотел бы программно присоединить on:message
к A
и on:count
к B
:
<!-- App.svelte -->
<script>
import A from './A.svelte';
import B from './B.svelte';
let message = 'Hi there ?';
let count = 0;
const components = [{
component: A,
props: { message },
listeners: { message: (m) => { console.log(`They say "${m}"`); } }
}, {
component: B,
props: { count },
listeners: { click: () => { count++; } }
}];
</script>
{#each components as component}
<div><svelte:component this={component.component} { ...component.props }/></div>
{/each}
<div>
<p>They say "{message}"!</p>
<p>They clicked {count} times!</p>
</div>
<!-- A.svelte -->
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
export let message = '';
function changeHandler(e) { dispatch('message', message); }
</script>
<input on:change={changeHandler} on:value={message} value={message} />
<!-- B.svelte -->
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
export let count = 0;
function clickHandler() { dispatch('count', count); }
</script>
<button on:click={clickHandler}>Click me</button>
Вот демонстрационная версия: https://svelte.dev/repl/af1bd30ab75b43f19b72a306340b7282?version=3.18.2
То есть, я надеюсь, что есть способ расширить массив components
до
<A message={message} on:message={e => { message = e.detail; }}/>
<B count={count} on:count={e => { count = e.detail; }}/>