438 字
2 分钟
Svelte 5,Vue 3 升级版?
在六月份发布了 Svelte 4 之后,紧接着 Svelte 5 即将发布。Svelte 5 最重要的更新是使用函数来替代特定符号(如$:
、let
、export
)来表示响应式,这使得它的语法与 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 的相似之处越来越多,但这也可以看作是一件好事,因为我们不需要再学习一门新的框架了。