<svelte:options>
元素允许你指定编译器选项。
我们这里选择 immutable
选项举例。在本例中,每当 <Todo>
组件接收到新数据时都会闪一下。单击任意一个元素的复选框都会变更 done
的状态,从而导致 todos
数组发生更新。这样会导致 其他 <Todo>
组件也发生闪动,尽管它们的 DOM 并没有发生任何变动。
我们可以通过告知 <Todo>
组件接收 不可变 数据来优化这点。这个的意思是,我们保证永远不会 变动 todo
这个属性,而是在每次发生变动的时候创建新的 todo
对象。
将这行添加到 Todo.svelte
顶端:
Todo.svelte
<svelte:options immutable={true} />
如果你喜欢,也可以把这行简写作
<svelte:options immutable/>
。
现在,当你点击复选框时,只有被更新的组件会闪动了。
可以被设定的选项如下:
immutable={true}
— 你永远不会使用可变的数据,因此编译器通过简单的引用对等检查来判断值是否发生变化immutable={false}
— 默认。Svelte 对于可变对象是否发生改变的检查会更保守谨慎一些accessors={true}
— 给组件的属性(props)添加 getter 和 setteraccessors={false}
— 默认namespace="..."
— 该组件被使用的命名空间,通常是"svg"
customElement="..."
— 将该组件编译为自定义元素时使用的名称
查看 API 参考 获取更多关于这些选项的信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<script>
import Todo from './Todo.svelte';
let todos = [
{ id: 1, done: true, text: 'wash the car' },
{ id: 2, done: false, text: 'take the dog for a walk' },
{ id: 3, done: false, text: 'mow the lawn' }
];
function toggle(toggled) {
todos = todos.map((todo) => {
if (todo === toggled) {
// return a new object
return {
id: todo.id,
text: todo.text,
done: !todo.done
};
}
// return the same object
return todo;
});
}
</script>
<div class="centered">
<h1>todos</h1>
<ul class="todos">
{#each todos as todo (todo.id)}
<Todo {todo} on:change={() => toggle(todo)} />
{/each}
</ul>
</div>
<style>
.centered {
max-width: 20em;
margin: 0 auto;
}
</style>