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

Svelte:如何触发子组件中{#each}循环的更新?

解决Svelte中子组件{#each}循环数组更新不生效的问题

问题根源

Svelte的响应式是靠赋值操作触发的。像push()这种只修改数组内容、不改变数组引用的操作,Svelte监测不到,自然不会通知子组件更新。单个变量能正常更新,是因为你对变量做了赋值操作(比如inputValue = ''),触发了响应式机制。

直接有效的解决办法

办法1:push后手动触发响应式

在调用push()之后,给数组重新赋一遍值(哪怕是同一个数组),就能触发Svelte的响应式更新:

function addNote() {
  notes.push(inputValue);
  // 关键:手动触发响应式检测
  notes = notes;
  inputValue = '';
}

办法2:用扩展运算符生成新数组

不用push(),直接通过扩展运算符创建新数组并赋值,天生就能触发响应式:

function addNote() {
  notes = [...notes, inputValue];
  inputValue = '';
}

办法3:用Store管理数组(适合多组件共享数据场景)

如果数组需要在多个组件间共享,用Svelte的writable Store会更省心,它会自动监听数组变化并通知所有订阅的组件:

// 父组件中创建Store
import { writable } from 'svelte/store';
export const notes = writable([]);

// 添加元素时调用update方法
notes.update(n => [...n, inputValue]);

// 子组件中订阅使用Store
import { notes } from './parent.js';

为啥之前的尝试无效?

  • bind:传递的是数组引用,但子组件的{#each}不会主动检测数组内容变化,必须等父组件触发响应式更新才会同步。
  • $: array语句是监听变量的赋值变化,push()没有改变数组的引用,所以这个语句不会触发子组件的重新渲染。

内容的提问来源于stack exchange,提问作者MarkBenson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:45:41