动态显示导入组件的多个副本

Dynamically display multiple copies of an imported component

如何在 Svelte 中动态显示同一个组件的多个副本?

例子:

在我的 App.svelte 中,我有一个名为 Sky 的容器 div。

我展示了一个从单独的文件中导入并以传统方式调用的 Moon 组件:

import Moon from "./Moon.svelte"
... 
<Moon></Moon>

现在我想以同样的方式添加星星,通过导入一个星星组件并在随机位置显示它。我添加了一个“添加星星”按钮并计算了随机数,但我不知道如何调用该组件并将其添加到 Sky 容器 div:

<button on:click={()=> {
    randomX = Math.floor(Math.random()*200);
    randomY = Math.floor(Math.random()*200);
    let sky = document.getElementById("thisSky");
    //Add star to DOM at random left and top position... 
    }}>
    Add Stars
</button>

解法:

我添加了这个功能:

export function addStar() {
   new Star({
    target:     document.querySelector('#sky')
            })
    }

它搜索父组件并将其设置为Star组件的目标。

见 sky.svlete 于:

https://svelte.dev/repl/6c81da4202644303b435327ecbabf82e?version=3.43.1

虽然您的回答有效,但通常来说这是一个不好的模式。在 Svelte 中,你应该尝试让你的 DOM 代表某种 'state' 并避免任何直接的 DOM 操作,就像你在这里所做的那样。

要做到这一点,Svelte-way 是拥有一个星星数组并将一个新星星推送到该数组,然后使用一个 each 块来渲染所有星星:

<script>
 import Star from './Star.svelte';
 let stars = []
 export function addStar() {
   stars = [...stars, {}];
 }
</script>

<div>
  {#each stars as star}
    <Star {...star} />
  {/each}
  <slot />
</div>

通过这种方式,您还可以进一步扩展并让 addStar 实际接收星星的位置并将其传递给组件本身。

它还允许您删除或替换星星,这是您的解决方案无法实现的。