跳到主要内容位置

2 分钟掌握 Svelte

Svelte 是一个除了 Vue 和 React 之外的,另一种比较热门的前端框架,整体语法风格更偏向于 Vue。

使用 Svelte 编写的应用程序会把代码直接编译成原生的 JavaScript,不依赖任何运行环境(no svelte.js),而它也不依赖于虚拟 DOM 而是直接去修改真实的 DOM,因此性能更高,且最终生成的项目体积更小,

Svelte 的响应性代码也更直观,直接定义普通的 JavaScript 变量,对它进行修改就能反应到页面上。

语法

创建项目,使用 svelte 和 vite:

npm create vite@latest

或者使用官方的 sveltekit 脚手架,因为sveltekit 脚手架应用架构不适合入门,这里就演示了:

npm create svelte@latest myapp

Svelte 的核心也是组件,组件的定义和 Vue 十分类似,使用 script 标签编写组件逻辑,style 标签编写样式,不同的是,svelte 不需要 template 标签来包裹组件模板,直接编写 html 代码就可以:

<script>
</script>

<button>
</button>

<style>
</style>

在 script 中,使用 let 定义的变量可以直接在 html 中使用大括号来访问它的值:

<script>
let count = 0;
</script>

<button>
count is {count}
</button>

注册事件,可以使用 on: 指令,然后加上 html 原生事件的名字去掉 on 之后的部分,之后在 script 定义事件处理函数:

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

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

使用 let 定义的变量是响应性的,如果修改了它的值,在模板中使用它的地方也会更新:

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

如果有子组件需要接收 props,那么可以在子组件中使用 export 导出对应的变量,变量值则是 props 的默认值:

export let count = 0;

之后在父组件中,传递同名的 props 即可:

<ShowCount {count} />

svelte 模板支持常见的指令,根据条件或循环展示内容,使用 #each 指令可以遍历数组展示一组 html 标签:

<script>
export let count = 0;
let arr = [1, 2, 3, 4, 5];
</script>
// as 后为数组元素,也支持访问索引,使用第二个参数即可:a, i
{#each arr as a}
<p>
{a}
</p>
{/each}

使用 #if 指令可以根据条件展示标签:

{#if count > 5}
计数大于了 5
{/if}

Svelte 组件也支持生命周期,使用 onMount 可以在组件加载时触发一些操作,如果 onMount 返回了一个函数,那么可以在组件卸载时触发一些操作:

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

onMount(() => {
count += 3;
return () => {
count = 0;
};
});
</script>

当应用程序规模越来越大,需要嵌套多层组件并传递数据时,可以使用 context API 来避面层层传递 props。在需要提供数据的上层组件中,调用 setContext() 传递 context 的 key 和 value:

setContext("count", count);

然后在需要访问值的下层组件中使用 getContext 传递对应的 key 即可:

<script>
import { getContext } from "svelte";
let countFromContext = getContext("count");
</script>

<p>Context 中的 count: {countFromContext}</p>

要注意的是,使用 context 传递的数据是非响应性的,上层组件的修改并不会更新到下层组件中。要传递响应性的数据,可以使用 store,使用 writable 函数可以定义一个 store:

import { writable } from "svelte/store";

export const count = writable(0);

之后在组件中,可以使用 $ 加上 store 的名字来访问它的值,或者叫订阅,因为它还会随着 store 值的变化而更新:

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

要修改 store 的值,可以调用 store 的 update 函数:

<script>
import { setContext } from "svelte";
import { count } from "./stores";

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

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

小结

好了,这个就是 svelte 的 2 分钟介绍,你学会了吗?如果有帮助请三连并关注,想学更多的开发知识,可以在评论区留言,感谢观看!

提示

一系列的课程让你成为高级前端工程师。课程覆盖工作中所有常用的知识点和背后的使用逻辑,示例全部都为工作项目简化而来,学完即可直接上手开发!

即使你已经是高级前端工程师,在课程里也可能会发现新的知识点和技巧,让你的工作更加轻松!

《React 完全指南》课程,包含 React、React Router 和 Redux 详细介绍,所有示例改编自真实工作代码。点击查看详情。

《Vue 3.x 全家桶完全指南与实战》课程,包括 Vue 3.x、TypeScript、Vue Router 4.x、Vuex 4.x 所有初级到高级的语法特性详解,让你完全胜任 Vue 前端开发的工作。点击查看详情。

《React即时通信UI实战》课程,利用 Storybook、Styled-components、React-Spring 打造属于自己的组件库。

《JavaScript 基础语法详解》本人所著图书,包含 JavaScript 全面的语法知识和新特性, 可在京东、当当、淘宝等各大电商购买