跳转到内容

Svelte基础

来自代码酷
Admin留言 | 贡献2025年4月30日 (三) 19:08的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

Svelte基础[编辑 | 编辑源代码]

Svelte 是一种现代的前端框架,与其他流行的框架(如React、Vue或Angular)不同,它采用了一种独特的编译时方法。Svelte在构建时将组件转换为高效的原生JavaScript代码,而不是在运行时进行虚拟DOM操作。这使得Svelte应用程序通常具有更小的体积和更高的性能。本指南将介绍Svelte的核心概念、语法和实际应用,适合初学者和希望深入了解Svelte的程序员。

Svelte简介[编辑 | 编辑源代码]

Svelte由Rich Harris于2016年创建,其核心理念是“编译时框架”。与React或Vue不同,Svelte在构建时将组件编译为高效的JavaScript代码,而不是在浏览器中运行一个庞大的框架库。这意味着:

  • 更小的包体积:无需加载框架运行时,减少了初始加载时间。
  • 更高的性能:直接操作DOM,避免了虚拟DOM的开销。
  • 更简单的语法:接近原生HTML、CSS和JavaScript的写法,降低了学习成本。

Svelte适用于构建交互式用户界面,从小型组件到完整的单页应用(SPA)均可胜任。

核心概念[编辑 | 编辑源代码]

1. 组件结构[编辑 | 编辑源代码]

Svelte组件以.svelte为扩展名,包含三个部分:

  • 脚本(Script):定义组件的逻辑。
  • 样式(Style):定义组件的样式(默认作用域仅限于当前组件)。
  • 模板(Template):定义组件的HTML结构。

以下是一个简单的Svelte组件示例:

<script>
    let name = "World";
</script>

<style>
    h1 {
        color: blue;
    }
</style>

<h1>Hello {name}!</h1>

输出

Hello World!

2. 响应式声明[编辑 | 编辑源代码]

Svelte使用赋值操作符(=)实现响应式数据绑定。当数据变化时,UI自动更新。

<script>
    let count = 0;

    function increment() {
        count += 1;
    }
</script>

<button on:click={increment}>
    Clicked {count} {count === 1 ? 'time' : 'times'}
</button>

输出

Clicked 0 times

(点击按钮后,数字会递增)

3. 条件与循环[编辑 | 编辑源代码]

Svelte使用{#if}{#each}处理条件渲染和列表渲染。

<script>
    let show = true;
    let items = ["Apple", "Banana", "Cherry"];
</script>

{#if show}
    <p>This is visible!</p>
{/if}

<ul>
    {#each items as item}
        <li>{item}</li>
    {/each}
</ul>

输出

This is visible!
• Apple
• Banana
• Cherry

4. 事件处理[编辑 | 编辑源代码]

Svelte使用on:指令绑定事件。

<script>
    function handleClick() {
        alert("Button clicked!");
    }
</script>

<button on:click={handleClick}>
    Click Me
</button>

5. 双向绑定[编辑 | 编辑源代码]

Svelte通过bind:指令实现双向数据绑定。

<script>
    let name = "";
</script>

<input bind:value={name} placeholder="Enter your name">
<p>Hello {name || 'stranger'}!</p>

输出

(输入框输入内容后,下方文本会实时更新)

实际案例:待办事项应用[编辑 | 编辑源代码]

以下是一个简单的待办事项应用示例,展示Svelte的实际应用:

<script>
    let todos = [];
    let newTodo = "";

    function addTodo() {
        if (newTodo.trim()) {
            todos = [...todos, { text: newTodo, done: false }];
            newTodo = "";
        }
    }

    function toggleDone(todo) {
        todo.done = !todo.done;
        todos = todos; // 触发响应式更新
    }
</script>

<style>
    .done {
        text-decoration: line-through;
        color: gray;
    }
</style>

<input bind:value={newTodo} placeholder="Add a new task">
<button on:click={addTodo}>Add</button>

<ul>
    {#each todos as todo (todo.text)}
        <li class:done={todo.done} on:click={() => toggleDone(todo)}>
            {todo.text}
        </li>
    {/each}
</ul>

功能说明

  • 用户可以在输入框中添加新任务。
  • 点击任务可以切换完成状态(显示为删除线)。
  • 任务列表自动更新。

Svelte与其他框架对比[编辑 | 编辑源代码]

以下是一个简单的对比表:

特性 Svelte React Vue
编译方式 编译时 运行时 运行时 + 编译时
虚拟DOM
语法复杂度
包大小

进阶主题[编辑 | 编辑源代码]

1. 状态管理[编辑 | 编辑源代码]

Svelte提供writablereadable存储来实现全局状态管理。

<script>
    import { writable } from 'svelte/store';

    const count = writable(0);

    function increment() {
        count.update(n => n + 1);
    }
</script>

<button on:click={increment}>
    Count: {$count}
</button>

2. 动画支持[编辑 | 编辑源代码]

Svelte内置动画支持,例如fadeslide等。

<script>
    import { fade } from 'svelte/transition';
    let visible = true;
</script>

<button on:click={() => visible = !visible}>
    Toggle
</button>

{#if visible}
    <p transition:fade>Fade in/out</p>
{/if}

3. 生命周期钩子[编辑 | 编辑源代码]

Svelte提供生命周期函数如onMountonDestroy等。

<script>
    import { onMount } from 'svelte';

    onMount(() => {
        console.log("Component mounted");
        return () => console.log("Component destroyed");
    });
</script>

总结[编辑 | 编辑源代码]

Svelte是一种创新的前端框架,通过编译时优化提供了高性能和小体积的优势。其简洁的语法和直观的响应式系统使其成为初学者和高级开发者的理想选择。通过学习Svelte,你可以快速构建高效、交互式的Web应用程序。