将on:click事件传递到动态创建的<svelte:component />

时间:2019-09-26 05:24:33

标签: javascript html event-handling svelte svelte-component

我基本上需要能够触发一个或多个组件( 通过svelte:component动态添加)时,父级中的图标/按钮 单击组件。例如我需要钩住下面用**表示的部分:-

<script>
 let charts = [
    ChartA,
    ChartB,
    ChartC
  ];
</script>
{#each charts as chart, i}
    <div class="wrapper">
        <div class="icon" on:click={**HowToPassClickEventToComponent**}></div>
        <div class="content">
        <svelte:component this={charts[i]} {**clickedEvent**}/>
        </div>
    </div>
{/each}

我能够通过取消一系列道具来使某些东西起作用,但是每个道具 数组更改时会通知组件,因此这不是很干净。

我已经搜索了Google和StackOverflow,并在Svelte Discord频道中提出了这个问题,但目前还没有运气。

Svelte Repl showing the problem

这似乎是一个简单的要求,但是过了几天,我仍然坚持不懈,因此非常感谢有关如何将事件传递到动态组件中的任何建议。

1 个答案:

答案 0 :(得分:3)

您可以做到like this

<script>
    import ChartA from './ChartA.svelte'
    import ChartB from './ChartB.svelte'
    import ChartC from './ChartC.svelte'
    let charts = [
        ChartA,
        ChartB,
        ChartC
    ];
    let events = [];
</script>

<style>
    .icon{
        width:60px;
        height:30px;
        background-color:grey;
    }
</style>

{#each charts as chart, i}
    <div class="wrapper">
        <div class="icon" on:click={e=>events[i] = e}>Click</div>
        <div class="content">
            <svelte:component this={charts[i]} event={events[i]}/>
        </div>
    </div>
{/each}

虽然将事件作为数据传递会有点不寻常。响应事件的发生,在父组件中设置一些状态,然后将该状态传递给下层对象,这会更加习惯。

Alternatively,如果子组件需要自己响应事件,则可以采用这种方法...

<script>
    import ChartA from './ChartA.svelte'
    import ChartB from './ChartB.svelte'
    import ChartC from './ChartC.svelte'
    let charts = [
        ChartA,
        ChartB,
        ChartC
    ];
    let instances = []; 
</script>

<style>
    .icon{
        width:60px;
        height:30px;
        background-color:grey;
    }
</style>

{#each charts as chart, i}
    <div class="wrapper">
        <div class="icon" on:click={e => instances[i].handle(e)}>Click</div>
        <div class="content">
            <svelte:component
                this={charts[i]}
                bind:this={instances[i]}
            />
        </div>
    </div>
{/each}

...每个子组件都导出一个handle方法:

<script>
    let event;
    export function handle(e){
        event = e;
    };
</script>