【Svelte】-(2)reactivity响应式 | 赋值 / reactivity变量 / reactivity代码语句 / reactivity对象

简介: 【Svelte】-(2)reactivity响应式 | 赋值 / reactivity变量 / reactivity代码语句 / reactivity对象

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>

0000.gif

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>

1111.gif

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>

111.gif

其实怎么写倒是无所谓,$: 后面加语句快就好,直接添加或者当函数$: {} 都行,其实各框架实现响应式原理差不多,之所以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等都需要使用后重新赋值才具备响应式。


目录
相关文章
|
7月前
|
JavaScript 前端开发
Vue3 ref响应式变量详解
Vue3 ref响应式变量详解
|
4天前
|
JavaScript 前端开发 API
在VUE3的setup函数中如何引用
在VUE3的setup函数中如何引用
|
5天前
|
JavaScript 测试技术 API
Vue3中定义变量是选择ref还是reactive?
Vue3中定义变量是选择ref还是reactive?
17 2
|
5天前
|
JavaScript
(详细及解决方法)关于Vue.prototype中定义的变量不是响应式
(详细及解决方法)关于Vue.prototype中定义的变量不是响应式
58 0
|
6月前
Vue3.0实现todolist- ref定义单个数据和reactive定义对象类型的数据
Vue3.0实现todolist- ref定义单个数据和reactive定义对象类型的数据
43 1
|
9月前
|
JavaScript
vue自定义指令directives同时传递多个参数
vue自定义指令directives同时传递多个参数
207 0
vue自定义指令directives同时传递多个参数
|
9月前
|
JavaScript
Vue setup语法糖关于父子传参不同之处
Vue setup语法糖关于父子传参不同之处
|
10月前
|
JavaScript
vue如何引用组件
vue如何引用组件
|
11月前
|
JSON JavaScript API
【Vue3 易混淆概念点一】ref、toRef、toRefs、reactive 异同点
【Vue3 易混淆概念点一】ref、toRef、toRefs、reactive 异同点
141 0
|
11月前
vue3语法糖+ts组件传值
vue3语法糖+ts组件传值
89 0