You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Svelte中如何动态渲染同一组件的多个实例?

如何在Svelte中动态添加Star组件到Sky容器并设置随机位置

嘿,这问题我熟!在Svelte里动态创建组件其实很简单,用官方提供的组件实例化API就能搞定,结合你已经写的随机坐标逻辑,咱们一步步来:

第一步:让Star组件支持接收位置参数

首先你的Star.svelte需要能接收x和y这两个坐标参数,用来控制自身定位。修改Star组件代码:

<script>
  // 定义可外部传入的props,设置默认值防止未传参出错
  export let x = 0;
  export let y = 0;
</script>

<!-- 用绝对定位把星星放在指定坐标 -->
<div style="position: absolute; left: {x}px; top: {y}px;">
  ⭐
</div>

第二步:修改App.svelte的按钮点击逻辑

你已经算出了随机坐标,现在只需要用Svelte的组件构造函数,把Star组件挂载到Sky容器里,同时把坐标传进去就行。直接调整按钮的回调代码:

<script>
  import Moon from "./Moon.svelte";
  import Star from "./Star.svelte"; // 别忘了导入Star组件
</script>

<!-- 务必给Sky容器加position: relative,不然星星会相对于整个页面定位 -->
<div id="thisSky" style="position: relative; width: 200px; height: 200px; border: 1px solid #ccc;">
  <Moon />
</div>

<button on:click={() => {
  const randomX = Math.floor(Math.random() * 200);
  const randomY = Math.floor(Math.random() * 200);
  
  // 动态创建Star组件实例并挂载到Sky容器
  new Star({
    target: document.getElementById("thisSky"), // 指定挂载的父容器
    props: { x: randomX, y: randomY } // 把随机坐标传给Star组件
  });
}}>Add Stars</button>

可选:把逻辑抽成独立函数

如果觉得按钮回调里代码太挤,也可以像你之前尝试的那样抽成单独函数,代码结构更清晰:

<script>
  import Moon from "./Moon.svelte";
  import Star from "./Star.svelte";

  function addStar() {
    const randomX = Math.floor(Math.random() * 200);
    const randomY = Math.floor(Math.random() * 200);
    
    new Star({
      target: document.querySelector("#thisSky"),
      props: { x: randomX, y: randomY }
    });
  }
</script>

<div id="thisSky" style="position: relative; width: 200px; height: 200px; border: 1px solid #ccc;">
  <Moon />
</div>

<button on:click={addStar}>Add Stars</button>

关键小提醒

一定要给你的Sky容器(#thisSky)加上position: relative;样式,这样Star组件的绝对定位才会相对于Sky容器计算,不然星星会乱跑哦!

内容的提问来源于stack exchange,提问作者Sascha Dörflein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:49:04