не работает изящный пользовательский элемент createEventDispatcher

#javascript #svelte #svelte-component

#javascript #изящный #изящный компонент

Вопрос:

Я пытаюсь использовать createEventDispatcher для перехвата события дочернего компонента из родительского компонента, но, похоже, это не работает. Если я удалю пользовательский элемент, событие диспетчера сработает. Я делаю что-то не так или пользовательский элемент svelte не поддерживает событие диспетчера?

дочерний компонент Inner.svelte

 <svelte:options tag="my-inner"/>
<script>
    import { createEventDispatcher } from 'svelte';

    const dispatch = createEventDispatcher();

    function sayHello() {
        dispatch('message', {
            text: 'Hello!'
        });
    }
</script>

<button on:click={sayHello}>
    Click to say hello
</button>
 

родительский компонент App.svelte

 <svelte:options tag="my-app" />
<script>
    import {} from './Inner.svelte';

    function handleMessage(event) {
        alert(event.detail.text);
    }
</script>
<my-inner on:message={handleMessage}></my-inner>
 

Мой rollup.config.js настройки

     plugins: [
        svelte({
            compilerOptions: {
                customElement: true,
                tag: null
            },
        }),
 

Ответ №1:

Это известная проблема. По крайней мере, в версии 3.32 и ранее события не генерируются из компонента svelte, скомпилированного в пользовательский элемент.

See https://github.com/sveltejs/svelte/issues/3119

В этом потоке обсуждаются различные обходные пути, но это зависит от вашего варианта использования. Кажется, что простой выдает событие :

 import { createEventDispatcher } from 'svelte';
import { get_current_component } from 'svelte/internal';

const component = get_current_component();
const svelteDispatch = createEventDispatcher();

const dispatch = (name, detail) => {
  svelteDispatch(name, detail);
  component.dispatchEvent amp;amp; component.dispatchEvent(new CustomEvent(name, { detail }));
  // or use optional chaining (?.)
  // component?.dispatchEvent(new CustomEvent(name, { detail }));
};