reactivity 于 Svelte (赋值)
reactivity 系统 即反应性或者响应式。
在Vue中是 ref
或者 reactive
,在React中是 useState
。
在Svelte中则十分简洁,终于可以摆脱Hooks了(虽然我也很爱Hooks)
Svelte 的内核是一个强大的 reactivity 系统,能够让 DOM 与你的应用程序状态保持同步,例如,事件响应。
就像这行代码
<button on:click={increment()}></button>
在 increment 函数内部,我们需要做的只是改变 count 的值:
<script>
let count = 1
const increment = () => count+=1
</script>
<button on:click={increment}>
Clicked {count}
</button>
Svelte 用一些工具代码就能知道 DOM 需要更新。
声明reactivity变量
Svelte 的 reactivity 不仅使 DOM 与应用程序的变量保持同步,它还可以使用 reactivity 声明使变量彼此保持同步。
通过这种方法,只要参考值变化了就重新运行此代码
$: isOdd = count % 2 === 1;
虽然看着怪,但其实习惯就好,毕竟语法就是得习惯… , 比起用 computer
/ watch
又或者是写Hooks,其实我还蛮喜欢的,停不下。
<script>
let count = 0
$: isOdd = count % 2 === 1
const increment = () => count++
</script>
<button on:click={increment}>
Clicked {count} is {isOdd ? 'odd' : 'even'}
</button>
reactivity代码语句
Svelte不限于声明响应式值,可以响应式地运行任意语句。
例如,我们可以在count它发生变化时记录它的值:
<script>
let count = 0
$: isOdd = count % 2 === 1
const increment = () => count++
$: console.log('count', count)
</script>
<button on:click={increment}>
Clicked {count} is {isOdd ? 'odd' : 'even'}
</button>
其实怎么写倒是无所谓,$:
后面加语句快就好,直接添加或者当函数$: {}
都行,其实各框架实现响应式原理差不多,之所以Svelte这么独特就取决于,我认为它更像编译器,而不是语言框架或者js库。
reactivity对象
不过我认为语法有点冗余的是,在更新对象的时候需要重新赋值,当然之所以这么设计肯定是有理由的。
例如你需要这样写
<script>
let arr = {
value: [0]
}
function add() {
arr.value.push(1)
arr = arr // !! 重新赋值
}
</script>
或者这样
<script>
let arr = {
value: [0]
}
function add() {
arr = [...arr, 1]
}
</script>
你必须对整个对象重新赋值才会生效,如pop,shift和 ,splice以及对象方法,如Map.set,Set.add等都需要使用后重新赋值才具备响应式。