<script>
let name = 'world';
</script>
<input bind:value={name}>
<h1>Hello {name}!</h1>
<script>
let a = '2';
</script>
<label>
<input type=number bind:value={a} min=0 max=10> //need number
<input type=range bind:value={a} min=0 max=10> //need number
</label>
<script>
let html = 'Write some text!
';
</script>
<div contenteditable="true" bind:innerHTML={html}></div>
<pre>{html}</pre>
<style>
[contenteditable] {
padding: 0.5em;
border: 1px solid #eee;
border-radius: 4px;
}
</style>

| 生命周期 | 作用 | 说明 |
|---|---|---|
| onMount | 组件加载 | 在组件加载完成之后执行,类似于window.onload |
| beforeUpdate | 组件更新 | 在组件更新时会执行该钩子函数 |
| afterUpdate | 组件更新 | 组件更新完成时会执行该钩子函数 |
| onDestroy | 组件销毁 | 在组件加载完成之后执行该钩子 |
完整的生命周期:

<script>
import { beforeUpdate, tick } from 'svelte';
beforeUpdate(async () => {
await tick();
console.log('这段代码会在组件状态更新后执行');
});
</script>
类比vuex等其他状态公共管理库的使用场景,Svelte的Stores用于组件间的状态共享,不仅限于父子兄弟组件通信
在Svelte中使用store.js来存储变量,以官网count为例,可以在任意组件中订阅变量变化也可以在任意组建中更新或者设置变量值
更新状态值:count.update(fn) update方法仅适用writable变量
count.update(n=>n+1) //update函数接收一个回调函数,n代表当前的值
设置状态值:count.set(val) set方法仅适用writable变量
count.set(0)
订阅变量变化:count.subscribe(fn)
count.subscribe(value=>{
count_value = value
})
自动订阅:一般subscribe后需要在onDestroy钩子函数中取消订阅,不然会造成内存泄露,但是当订阅了多个store中的属性值时,会显得很复杂,可以使用$来引用store值。参考官方实例
任何以$开头的变量Svelte都将认为他是一个store属性,并且Svelte会阻止使用$创建变量
只读stores:一些不需要在其他地方写入的stores可以使用readable stores。readable()函数第一个参数可以是一个初始值,也可以是null或者undefined。第二个参数是start()函数该函数有set方法。并且返回一个stop函数。在取消订阅时调用stop()
import { readable } from 'svelte/store';
export const time = readable(new Date(), function start(set) {
const interval = setInterval(() => {
set(new Date());
}, 1000);
return function stop() {
clearInterval(interval);
};
});
stores派生:类似于vuex的getter可以依赖其他的stores值输出一个新的派生值。
import { readable, derived } from 'svelte/store';
export const time = readable(new Date(), function start(set) {
const interval = setInterval(() => {
set(new Date());
}, 1000);
return function stop() {
clearInterval(interval);
};
});
const start = new Date();
export const elapsed = derived(
time,
$time => Math.round(($time - start) / 1000)
);
自定义stores:只要一个对象正确的使用 subscribe ,它就是可以称之为store。因此,使用特定语法来创建自定义 stores非常容易。
// stires.js
import { writable } from 'svelte/store';
function createCount() {
const { subscribe, set, update } = writable(0);
return {
subscribe,
increment: () => update(n => n + 1),
decrement: () => update(n => n - 1),
reset: () => set(0)
};
}
export const count = createCount();
//app.svelte
<script>
import { count } from './stores.js';
</script>
<h1>The count is {$count}</h1>
<button on:click={count.increment}>+</button>
<button on:click={count.decrement}>-</button>
<button on:click={count.reset}>reset</button>
绑定store:当stores属性值有writable有可写属性,即可使用bind绑定值
// stores.js
import { writable, derived } from 'svelte/store';
export const name = writable('world');
export const greeting = derived(
name,
$name => `Hello ${$name}!`
);
// app.svelte
<script>
import { name, greeting } from './stores.js';
</script>
<h1>{$greeting}</h1>
<input bind:value={$name}>
<button on:click="{() => $name += '!'}">
Add exclamation mark!
</button>