codecamp

Svelte <svelte:options>

最后, <svelte:options>标签允许你指定编译器选项。

我们以 immutable项为例。在本程序中,<Todo> 在接收新数据时会闪烁,点击某一个 done就会更新todos 数据来切换状态, 就算其他 <Todo> 项没有对DOM进行更改,同样会有闪烁效果出现。

我们可以设置<Todo> 组件,让其期望的数据是不可变(immutable) 的。 这意味着我们承诺永远不会对“todo”的属性进行“变更(mutate )”,而是在内容发生变化时重新创建新的todo对象。

将此代码添加到Todo.svelte 文件内顶部:

<svelte:options immutable={true}/>

您可以根据需要将其简写为 ​<svelte:options immutable/>​ :

现在,当您通过单击todo来切换状态时,仅被更新的组件会闪烁:

该标签可设置的选项有:

  • immutable={true} :你不能使用可变数据,因此编译器可以通过引用简单的对比检查来确定值是否已更改。
  • immutable={false} :默认值。对于可变对象数据变更,Svelte将其保持不变。
  • accessors={true} :为组件的属性添加getter和setter。
  • accessors={false}:默认。
  • namespace="..." :将使用namespace的组件,最常见的是"svg"
  • tag="..." :指定将此组件编译为自定义标签时使用的名称。

有关这些选项的更多信息,请查阅 API reference 。

示例代码

  • App.svelte
<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>

<h2>Todos</h2>
{#each todos as todo}
	<Todo {todo} on:click={() => toggle(todo)}/>
{/each}

  • Todo.svelte

<svelte:options immutable={true}/>

<script>
	import { afterUpdate } from 'svelte';
	import flash from './flash.js';

	export let todo;

	let div;

	afterUpdate(() => {
		flash(div);
	});
</script>

<style>
	div {
		cursor: pointer;
		line-height: 1.5;
	}
</style>

<!-- the text will flash red whenever
     the `todo` object changes -->
<div bind:this={div} on:click>
	{todo.done ? '[[EMOJI:%F0%9F%91%8D]]': ''} {todo.text}
</div>

  • flash.js

export default function flash(element) {
	requestAnimationFrame(() => {
		element.style.transition = 'none';
		element.style.color = 'rgba(255,62,0,1)';
		element.style.backgroundColor = 'rgba(255,62,0,0.2)';

		setTimeout(() => {
			element.style.transition = 'color 1s, background 1s';
			element.style.color = '';
			element.style.backgroundColor = '';
		});
	});
}


Svelte <svelte:head>
Svelte Sharing code
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Svelte module context

Svelte 调试

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }