多多读书
438 字
2 分钟
Svelte 5,Vue 3 升级版?

在六月份发布了 Svelte 4 之后,紧接着 Svelte 5 即将发布。Svelte 5 最重要的更新是使用函数来替代特定符号(如$:letexport)来表示响应式,这使得它的语法与 Vue 3 非常相似。

$state 响应式数据#

使用$state来替代原来的let声明响应式数据。Svelte 团队解释说,随着应用变得越来越复杂,很难区分哪些数据是响应式的,这也会导致项目变得难以维护。

<script>
  // let count = 0; // 旧写法
  let count = $state(0)
  const increment = () => {
    count += 1
  }
</script>

<button on:click="{increment}">count is {count}</button>

这个不如命名为 Vue 3 的$ref,Vue 3 已经废弃了$ref语法糖。在 Vue 中,可以这样写:

<script setup lang="ts">
  import { ref } from 'vue'

  let count = ref(0)
  const increment = () => {
    count.value += 1
  }
</script>

<template>
  <button @click="increment">count is {{count}}</button>
</template>

$derived 计算属性#

$derived用来描述响应式数据的计算逻辑,与 Vue 3 的computed相似,不同的是computed参数是计算函数,$derived参数是计算表达式。

Svelte 5:

// export let width;
// export let height;
let { width, height } = $props() // 替代 `export let`

// $: area = width * height; // 旧写法
const area = $derived(width * height)

Vue 3:

import { computed } from 'vue'

const { width, height } = defineProps(['width', 'height'])
const area = computed(() => width * height)

$effect 侦听器#

当数据发生改变时需要做一下操作就需要用到侦听器,Svelte 5 增加了$effect来表示,这个与 Vue3 的 watchEffect相似。

Svelte 5:

let data = $state(null)

$effect(() => {
  console.log(data)
})

Vue 3:

const data = ref(null)

watchEffect(() => {
  console.log(data.value)
})

看到这里,让人不禁有所感慨。Svelte 和 Vue 的相似之处越来越多,但这也可以看作是一件好事,因为我们不需要再学习一门新的框架了。

Svelte 5,Vue 3 升级版?
https://fuwari.vercel.app/posts/20231017/
作者
我也困了
发布于
2023-10-17
许可协议
CC BY-NC-SA 4.0