你可以做到这一点像这样 https://svelte.dev/repl/f94bc4f69d2b4629ba4f5052c727b847?version=3.12.1:
<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}
不过,将事件作为数据传递有点不寻常。在父组件中设置某些状态以响应事件并将该状态向下传递会更惯用。
或者 https://svelte.dev/repl/8b97f00e55be46daae9db8db5f0cf973?version=3.12.1,如果子组件do需要对事件本身做出反应,你可以采取这种方法......
<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
method:
<script>
let event;
export function handle(e){
event = e;
};
</script>