點燈坊

失くすものさえない今が強くなるチャンスよ

Svelte 之 Reactive Statement

Sam Xiao's Avatar 2019-11-26

Svelte 支援類似 Vue 的 watch,只要加上 $ Label 即可,Svelte Compiler 會幫你產生相對應的 Code。

Version

macOS Catalina 10.15.1
WebStorm 2019.2.4
Svelte 3.0.0

Reactive Statement

<script>
let firstName = ''
let lastName = ''

$: fullName = `${firstName} ${lastName}`

$: if (firstName === 'Sam') firstName = 'Mr.' + firstName
</script>

First name:<input type="text" bind:value={ firstName }>
Last name:<input type="text" bind:value={ lastName }>
<p>{ fullName }</p>

Reactivity 除了用在 variable 外,也可用在 statement,只要 statement 內的 variable 改變,該 statement 就會被 trigger 執行,相當於 Vue 的 watch

Svelte 借用了目前 ECMAScript 較少用的 label 語法,只要加上 $ label,之後的 statement 會自動成為可 watch 的 statement。

react001

<script>
let firstName = ''
let lastName = ''

$: fullName = `${firstName} ${lastName}`

$: {
  if (firstName === 'Sam')
    firstName = 'Mr.' + firstName
}
</script>

First name:<input type="text" bind:value={ firstName }>
Last name:<input type="text" bind:value={ lastName }>
<p>{ fullName }</p>

若 statement 多行,只要使用 {} 刮起來即可。

Conclusion

  • $: 乍看之下很怪,事實上完全合乎 ECMAScript 語法,只是 Svelte 將這個罕用功能重新拿來使用,只要 Svelte compilter 看到 $:,就會幫你產生 watch 相對應功能的 code

Reference

Svelte, Reactive Statements