Skip to main content

因为 Svelte 的响应是由赋值触发的,所以使用 pushsplice 这样的数组方法不会自动触发更新。比如,尽管我们在 addNumber 函数内调用了 numbers.push(...),但点击 Add a number 按钮什么都不会发生。

其中一个解决这个问题的办法是写一个冗余的赋值:

App.svelte
function addNumber() {
	numbers.push(numbers.length + 1);
	numbers = numbers;
}

但是还有一个更常用的办法是这样:

App.svelte
function addNumber() {
	numbers = [...numbers, numbers.length + 1];
}

你可以用类似的模式替换 popshiftunshiftsplice

对数组或者对象的 属性 (properties)的赋值也可以触发更新,比如 obj.foo += 1 或者 array[i] = x 等。

App.svelte
function addNumber() {
	numbers[numbers.length] = numbers.length + 1;
}

一条简单的经验法则:要更新的值的名字必须出现在赋值的左边才行。比如说下面这个……

const obj = { foo: { bar: 1 } };
const foo = obj.foo;
foo.bar = 2;

……就不会触发 obj.foo.bar 的更新,除非你接一条 obj = obj

Next: 属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
	let numbers = [1, 2, 3, 4];
 
	function addNumber() {
		numbers.push(numbers.length + 1);
	}
 
	$: sum = numbers.reduce((total, currentNumber) => total + currentNumber, 0);
</script>
 
<p>{numbers.join(' + ')} = {sum}</p>
 
<button on:click={addNumber}>
	Add a number
</button>
 
initialising