将 on:click 事件传递给动态创建的 <svelte:component/>
Passing on:click event into dynamically created <svelte:component/>
我基本上需要能够在一个或多个组件中触发某些东西(即
正在通过 svelte:component) 动态添加,当父级中有 icon/button 时
组件被点击。例如我需要钩住下面用**表示的部分:-
<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 和 Whosebug,并在 Svelte Discord 频道中提出了这个问题,但目前没有成功。
Svelte Repl showing the problem
这似乎是一个简单的要求,但几天后我仍然卡住了,所以非常感谢任何关于如何将事件传递到动态组件的建议。
你可以的 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,如果子组件 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
方法:
<script>
let event;
export function handle(e){
event = e;
};
</script>
我基本上需要能够在一个或多个组件中触发某些东西(即 正在通过 svelte:component) 动态添加,当父级中有 icon/button 时 组件被点击。例如我需要钩住下面用**表示的部分:-
<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 和 Whosebug,并在 Svelte Discord 频道中提出了这个问题,但目前没有成功。
Svelte Repl showing the problem
这似乎是一个简单的要求,但几天后我仍然卡住了,所以非常感谢任何关于如何将事件传递到动态组件的建议。
你可以的 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,如果子组件 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
方法:
<script>
let event;
export function handle(e){
event = e;
};
</script>