为什么Svelte里直接修改数组元素视图没更新?
大家好,我在用Svelte做搜索框时遇到个奇怪的问题。当输入内容后直接修改数组元素,视图完全没反应…
我照着Vue写法写了这段代码:
<script>
let searchTerm = '';
let results = [];
function handleInput() {
results[0] = 'New Result'; // 直接修改数组元素
if (!searchTerm) results = [];
}
</script>
<input bind:value={searchTerm} on:input={handleInput}>
{#each results as result}
<div>{result}</div>
{/each}
但输入时页面完全没渲染新内容。试过把results整个重新赋值 results = [‘New’] 就能触发,但直接改数组元素就不行。这是Svelte的响应式系统有什么特殊规则吗?
results[0] = 'New Result'这种操作,Svelte根本不知道数组变了,所以不会触发更新。想让视图更新,必须让Svelte“看到”变量被重新赋值。最简单的改法是加一行触发响应式的语句:
或者更干净点,直接用数组解构:
复制过去试试,输入框马上就有反应了。另外建议优先使用
push、splice这类方法配合赋值,比如:记住一句话:在Svelte里,凡是需要触发更新的操作,都得让变量“看起来”被重新赋值过。直接改下标等于偷偷改数据,框架没法监听到。