为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

智慧大石 2021-10-29 16:12:08
当单击父组件中的图标/按钮时,我基本上需要能够在一个或多个组件(通过 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}我能够通过 unsing 一组 props 来获得一些工作,但是当数组更改时每个组件都会收到通知,所以这不是很干净。我已经搜索了 Google 和 StackOverflow 并在 Svelte Discord 频道中询问了这个问题,但目前没有运气。这似乎是一个如此简单的要求,但几天后我仍然卡住了,因此非常感谢有关如何将事件传递到动态组件的任何建议。
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

你可以做这样的:


<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}

不过,将事件作为数据传递会有点不寻常。更习惯的做法是在父组件中设置一些状态以响应事件,并将该状态向下传递。


或者,如果子组件确实需要自己响应事件,您可以采用这种方法......


<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>


查看完整回答
反对 回复 2021-10-29
  • 1 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信