我基本上需要能够触发一个或多个组件( 通过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
这似乎是一个简单的要求,但是过了几天,我仍然坚持不懈,因此非常感谢有关如何将事件传递到动态组件中的任何建议。
答案 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>