Svelte 5 带来了重大更新,使其语法更接近 React,但保持了自身的简洁特色。

状态声明对比

Svelte 5 之前, 创建状态--你可以用let 创建状态变量:

image.png

Svelte 5

image.png

React

image.png

Svelte 的实现更加简洁,无需定义组件名称,代码更加优雅。

副作用处理

状态监听

React:

image.png

Svelte 5 之前,不得不使用一种不自然的$:语法来观察变化,并创建派生状态:

image.png

Svelte 5:

image.png

Svelte 自动追踪依赖,不需要手动声明依赖数组。

派生状态

// React
const doubleCount = useMemo(() => count * 2, [count]);

// Svelte 5
const double = $derived(count * 2);

事件处理

组件事件

// React
function Button({ onClick }) {
  return <button onClick={onClick}>Click me</button>;
}

Svelte 5 之前

image.png

Svelte 5

image.png

自定义事件

// Svelte 5
<script>
  const { onCustomEvent } = $props();
  
  function handleClick() {
    onCustomEvent('hello');
  }
</script>
<button on:click={handleClick}>触发事件</button>

组件属性处理

Props 声明

// React
function Greeting({ name = 'World' }) {
  return <h1>Hello, {name}!</h1>;
}

Svelte 5 之前

image.png

Svelte 5

image.png

实际应用示例

1. 表单处理

// Svelte 5
function Form() {
  const [formData, setFormData] = $state({
    username: '',
    password: ''
  });
  
  const isValid = $derived(
    formData.username.length > 0 && 
    formData.password.length >= 6
  );
  
  $effect(() => {
    if (isValid) {
      console.log('表单验证通过');
    }
  });
  
  return /* ... */;
}

2. 数据加载

function DataLoader() {
  const [data, setData] = $state(null);
  const [loading, setLoading] = $state(true);
  
  $effect(async () => {
    try {
      const response = await fetch('/api/data');
      setData(await response.json());
    } finally {
      setLoading(false);
    }
  });
  
  return /* ... */;
}

核心优势

  1. 更简洁的语法:减少样板代码
  2. 智能依赖追踪:无需手动声明
  3. 更好的性能:保持了 Svelte 的高性能特性
  4. 更低的学习曲线:特别是对 React 开发者

Svelte 5 的这些更新让开发体验更加流畅,同时保持了框架的高性能特性。对于想尝试 Svelte 的 React 开发者来说,现在是最好的时机!🎉

首发于公众号 大迁世界,欢迎关注。📝 每周一篇实用的前端文章 🛠️ 分享值得关注的开发工具 ❓ 有疑问?我来回答

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。


王大冶
68.1k 声望105k 粉丝