本文介绍
点赞 + 重视 + 保藏 = 学会了
Svelte 是我用过最爽的结构,就算 Vue 和 React 再强壮,生态再好,我仍是更喜爱 Svelte,由于它开发起来真的很爽。
其实在好久之前我就留意到 Svelte ,但一直没把这个结构放在心上。
由于我之前的作业首要运用 Vue,偶然也会接触到一些 React 项目,但彻底没遇到过运用 Svelte 的项。
直到 Vite 的呈现,我才开端开端注重 Svelte。
从 Vite文档 里能够看到它支撑这些模板:
JavaScript | TypeScript |
---|---|
vanilla | vanilla-ts |
vue | vue-ts |
react | react-ts |
preact | preact-ts |
lit | lit-ts |
svelte | svelte-ts |
能让祖师爷也注重的结构,不简略不简略~
我喜爱用 Demo 的办法学习新技能,Svelte 官方入门教程 就供给了这种办法。
这是我觉得入门比较舒服且便利日后查找的学习办法。
尽管 Svelte 官方入门教程 现已给出许多比方,并且 Svelte中文网 也有对应的翻译,但有些翻译看上去是机译,并且部分案例或许不太合适新手学习~
本文的目的是把 Svelte 的学习流程梳理出来,让第一次接触 Svelte 的工友能顺畅上手。
本文合适人群:有 HTML
、CSS
、JS
根底,知道并现已装置了 Node
。
假如你是打算从0开端学习前端,那本文暂时还不合适你阅读。
Svelte 简介
Svelte 是一个构建 web 运用程序的东西。
传统结构如 React 和 Vue 在浏览器中需求做许多的作业,而 Svelte 将这些作业放到构建运用程序的编译阶段来处理。
需求留意,Svelte 是一款编译器。它能够将依照规定语法编写的代码打包成浏览器能运转的项目。
和其他前端结构相同,相同也是运用 HTML
、CSS
和 JavaScript
进行开发。
作者
在学习 Svelte 之前先了解一下它的父亲(作者)。
Svelte 的作者叫 Rich Harris ,正在吃东西的这位便是他。
或许国内大大都工友对他不是很熟悉(我也彻底不熟),但应该听过 Rollup 。
没错,他也是 Rollup 的爸爸。
他在开发 Svelte 之前还开发过 Ractive.js ,听说 Vue 的部分完成也是受到了 Ractive 的启发。
关于 Rich Harris 的介绍还有许多,我搜到的资料上这样介绍到:
- 大学专业是学哲学的
- 在纽约时报调查组作业的图形修正,身兼记者和开发者职位
还有更多关于他和 Svelte 的介绍,能够看看 《Svelte – The magical disappearing UI framework – Interview with Rich Harris》
Svelte 的优势
Svelte 翻译成中文便是“修长”的意思,侧面标明它打包出来的包十分小。
Svelte 首要优势有以下几点。
1. 编译器
在打开Svelte官网时就能看到这样的介绍。
Svelte 是一种全新的构建用户界面的办法。传统结构如 React 和 Vue 在浏览器中需求做许多的作业,而 Svelte 将这些作业放到构建运用程序的编译阶段来处理。
Svelte 组件需求在 .svelte
后缀的文件中编写,Svelte 会将编写好的代码翻编译 JS
和 CSS
代码。
2. 打包体积更小
Svelte 在打包会将引用到的代码打包起来,而没引用过的代码将会被过滤掉,打包时不会加入进来。
在 《A RealWorld Comparison of Front-End Frameworks with Benchmarks (2019 update)》 陈述中,对干流结构进行了比照。
在经过 gzip
紧缩后生成的包巨细,从陈述中能够看出,Svelte 打包出来的体积甩开 Vue、React 和 Angular 几条街。
这是由于经过 Svelte 编译的代码,仅保存引用到的部分。
3. 不运用 Virtual DOM
Virtual DOM
便是 虚拟DOM,是用 JS 目标描述 DOM 节点的数据,由 React 团队推广出来的。
虚拟DOM 是前端的网红,因此也有许多开发者开端研讨和搞辩论赛。
网上有一张图比照了 Svelte 和 React 在数据驱动视图的流程
其实首要比照了运用虚拟DOM和直接操作实在DOM的区别。
在 React 中完成数据驱动视图大概流程是这样的:
数据产生改动 -> 经过diff算法判别要更新哪些节点 -> 找到要更新的节点 -> 更新实在DOM
Vue 的数据更新原理其实也差不多,仅仅完成办法和运用语法会有所不同。
diff算法 会依据数据更新前和更新后生成的虚拟DOM进行比照,只要两个版本的虚拟DOM存在差异时,才会更新对应的实在DOM。
运用虚拟DOM比照的办法会比直接比照实在DOM的效率高。
并且实在DOM身上挂载的特点和办法十分多,运用虚拟DOM的办法去描述DOM节点树会显得更轻便。
但这也意味着每次数据产生改动时都要先创立一个虚拟DOM,并运用 diff算法 将新虚拟DOM与旧虚拟DOM进行比对,这个步骤会耗费一点功用和需求一点履行时刻。
而 Svelte 在未运用虚拟DOM的状况下完成了呼应式规划。
我以粗犷的办法了解:Svelte 会监听顶层组件所有变量,一旦某个变量产生改动,就更新运用过该变量的组件。这就仅仅只需更新受影响的那部分DOM元素,而不需求整个组件更新。
综上所述,在我的了解力,虚拟DOM的思维很优异,也是顺应时代的产品,但虚拟DOM并不是最快的,JS 直接操作 DOM 才是最快。
《Virtual DOM is pure overhead》 是 Svelte 官网上的一篇博客,专门讨论虚拟DOM。有爱好的工友能够看看~
4. 更天然的呼应式
这也是我刚接触 Svelte 时马上喜爱上的理由。
这里说的呼应式规划是只关于数据的呼应,而不是像 Bootstrap 的呼应式布局。
现在盛行的前端结构根本都运用 数据驱动视图 这个概念,像 Vue 和 React 这些结构,都有呼应式数据的概念。
但 Vue 和 React 在数据呼应方面仍是有点“不那么天然”,我简略举几个比方:
-
在 React 中,假如需求更新数据并在视图中呼应,需求运用
setState
办法更新数据。 -
在 Vue2 中,呼应式数据要放在
data
里,在methods
中运用this.xxx
来更新数据。 -
在 Vue3 的 Composition API 语法中,需求运用
ref
或许reactive
等办法包裹数据,运用xxx.value
等办法修正数据。
上面这几种状况,感觉多少都增加了点东西才能完成呼应式数据功用(至少在一般开发者开发时是这样)。
在 Svelte 的理念中,呼应式应该给开发者一种无感体会,比方在 Excel 中,当我规定 C1 单元格的值是 A1 + B1 的和,设置好规矩后,用户只需求修正 A1 和 B1 即可,C1 会主动呼应,而不需再做其他操作。
在这方面,Svelte 我认为在现阶段是做得最天然的。
<h1>{name}</h1>
<script>
let name = '雷猴'
setTimeout(() => {
name = '鲨鱼辣椒'
}, 1000)
</script>
上面的代码中,1秒后修正 name
的值,并更新视图。
从代码就能看出,在运用 Svelte 开发项目时,开发者一般无需运用额外的办法就能做到和 Vue、React 的呼应式效果。
假如你对 Svelte 呼应式原理感爱好,引荐阅读 FESKY 的 《Svelte 呼应式原理分析 —— 从头思考 Reactivity》
也能够看看 《Rethinking reactivity》,看看官方对 reactivity 的思考。
5. 功用强
Stefan Krause 给出一份 功用测验陈述(点击可检查) 比照里多个抢手结构的功用。从 Svelte 的功用测验成果能够看出,Svelte 是适当优异的。
6. 内存优化
功用测验陈述(点击可检查) 也列出不同结构的内存占用程度,Svelte 对内存的办理做到十分极致,占用的内存也是十分小,这对于装备不高的设备来说是件好事。
第5和6点,由于测验陈述比较长,我没截图放进文中。咱们有爱好能够点开链接检查测验陈述。
7. 更重视无障碍体会
在运用 Svelte 开发时会 主动对无障碍拜访方面的体会进行检测,比方 img
元素没有增加 alt
特点,Svelte 会向你发出一条警告。无障碍体会对特别人事来说是很有帮助的,比方当你在 img
标签中设置好 alt
特点值,运用有声浏览器会把 alt
的内容读出来。
在此我还要引荐2本关于规划体会的书。
- 《点石成金:访客至上的Web和移动可用性规划秘笈》
- 《包容性Web规划》
它们的封面长分别这个姿态
Svelte 的优势必定还有许多,但由于我开发经验不足,只能总结出以上这些了。假如你对 Svelte 有更多了解,欢迎在评论区补充~
Svelte 的不足
- Svelte 对 IE 是十分不友好的,但我并不把这放在眼里。假如想兼容 IE 我仍是引荐运用 jQuery。
- Svelte 的生态不行丰富。由于是“新宠”,生态方面必定是不如 Vue 和 React 的。
与 Svelte 相关的库
Sapper
Sapper 官网地址
Sapper 是构建在 Svelte 上的结构,Sapper 供给了页面路由、布局模板、SSR等功用。
Svelte Native
Svelte Native 官网地址
Svelte Native 是建立在 NativeScript 之上的产品,能够开发安卓和iOS运用,是一个跨端技能。
有点相似于 React Native 和 Weex 之类的东西。
svelte-gl
svelte-gl 库房
svelte-gl 还没正式发布,但这是个很有趣的东西,它和 three.js 相似,专门做 3D运用的。
尽管现在 github 上的 Star 还不是许多,但也能够写些 demo 玩玩。
创立项目
在开端之前,你需求在电脑上装置 Node 环境。
修正东西我运用了 VS Code
,一同装置了 Svelte for VS Code 扩展插件 。
运用 Svelte 前,必须有一个开发环境。
创立或运用开发环境有以下几种办法:
REPL
-
Rollup
版 -
Webpack
版 -
Parcel
版 -
Vite
版
本文运用的是 Vite
创立项目,但上面列出的所有办法我都会逐个说说。
REPL
REPL
是 Svelte 供给的一个线上环境,打开 Svelte 官网 能够看到顶部导航栏上面有个 REPL 的选项。点击该选项就能够跳转到 Svelte 线上开发环境了。
REPL
是 read(读取)
、evaluate(履行)
、print(打印)
和 loop(循环)
这几个单词的缩写。
假如你仅仅想测验 Svelte 的某些功用或许测验小型代码,能够运用这款线上东西。
REPL
还供给了多组件开发,按左上角的 +号
能够创立新组件。组件的内容稍后会说到。
界面右侧,顶部有3个选项:
-
Result
: 运转成果。 -
JS output
: Svelte 编译后的JS
代码。 -
CSS output
: Svelte 编译后的CSS
代码。
在 REPL
界面右上角还有一个下载按钮。
当你在线上环境写好代码,能够点击下载按钮把项目保存到本地,下载的文件是一个 zip
,需求自己手动解压。
然后运用以下命令初始化项目并运转即可。
# 1、初始化项目
npm install
# 2、运转项目
npm run dev
# 3、在浏览器拜访 http://localhost:5000
运转成果:
Rollup 版
Svelte 官方也供给了一个命令,能够下载 Svelte 项目到本地。
命令最后需求输入你的项目名称。
# 1、下载模板
npx degit sveltejs/template 项目名称
# 2、装置依靠
npm install
# 3、运转项目
npm run dev
# 4、在浏览器拜访 http://localhost:8080
运转成果:
这是官方供给的创立项目办法,这个项目是运用 Rollup 打包的。
Rollup 和 Svelte 都是同一个作者(Rich Harris )开发的,用回自家东西很正常。
Webpack 版
假如你不想运用 Rollup 打包项目,能够测验运用 Webpack。
# 1、下载模板
npx degit sveltejs/template-webpack 项目名称
# 2、装置依靠
npm install
# 3、运转项目
npm run dev
# 4、在浏览器拜访 http://localhost:8080/
运转成果:
Parcel 版
我并 不引荐运用 该办法创立项目,由于 Svelte 并没有供给运用 Parcel 打包东西的模板。但 GitHub 上有第三方的解决方案(点击拜访库房)。
将 DeMoorJasper/parcel-plugin-svelte 的代码下载下来。
# 1、进入 `packages/svelte-3-example` 目录
# 2、装置依靠
npm install
# 3、运转项目
npm run start
# 4、在浏览器拜访 http://localhost:1234/
运转成果:
Vite 版
本文接下来所有比方都是运用 Vite 创立 Svelte 项目进行开发的。
运用 Vite 创立项目的原因是:快!
# 1、下载模板的命令
npm init vite@latest
# 2、输入项目名
# 3、挑选 Svelte 模板(我没选ts)
# 4、进入项目并装置依靠
npm install
# 5、运转项目
npm run dev
# 6、在浏览器拜访 http://127.0.0.1:5173/
运转成果:
本文运用 Vite 创立项目,目录结构和 Rollup版 创立出来的项目结构略微有点不同,但开发逻辑是相同的。
起步
index.html
、src/main.js
和 src/App.svelte
这三个是最首要的文件。
index.html
是项目运转的进口文件,它里边引用了 src/main.js
文件。
src/main.js
里引进了 src/App.svelte
组件,并运用以下代码将 src/App.svelte
的内容烘托到 #app
元素里。
const app = new App({
target: document.getElementById('app')
})
target
指明方针元素。
咱们大部分代码都是写在 .svelte
后缀的文件里。
.svelte
文件首要保安 多个 HTML 元素
、1个 script 元素
和 1个 style 元素
。这3类元素都是可选的。
咱们首要的作业目录是 src
目录。
为了减轻学习难度,咱们先做这几步操作。
1、清空全局款式
假如你运用 Rollup版 创立项目,不需求做这一步。
在运用 Vite 创立的 Svelte 项目中,找到 src/app.css
文件,并把里边的内容清空掉。
2、改造 src/App.svelte
将 src/App.svelte
文件改成以下内容
<script>
let name = '雷猴'
function handleClick() {
name = '鲨鱼辣椒'
}
</script>
<div>Hello {name}</div>
<button on:click={handleClick}>改名</button>
此刻点击按钮,页面上的 “雷猴” 就会变成 “鲨鱼辣椒”
上面的代码其实和 Vue 有点像。
-
变量和办法都写在
<script>
标签里。 -
在
HTML
中运用{}
能够绑定变量和办法。 -
经过
on:click
能够绑定点击事情。
只需写以上代码,Svelte 就会主动帮咱们做数据呼应的操作。一旦数据产生改动,视图也会主动改动。
是不是十分简略!
根底模板语法
Svelte 的模板语法其实和 Vue 是有点像的。假如你之前现已运用过 Vue,那本节学起来就十分简略。
插值
在 “起步章节” 现已运用过 插值 了。在 Svelte 中,运用 {}
大括号将 script
里的数据绑定到 HTML
中。
<script>
let name = '雷猴'
</script>
<div>{name}</div>
此刻页面上就会呈现 name
的值。
这种语法和 Vue 是有点像的,Vue 运用双大括号的办法 {{}}
绑定数据。Svelte 就少一对括号。
表达式
在 HTML
中除了能够绑定变量外,还能够绑定表达式。
<script>
let name = '雷猴'
function sayHi() {
return `${name} 世界!`
}
let a = 1
let b = 2
let state = false
</script>
<div>{sayHi()}</div>
<div>{a} + {b} = {a + b}</div>
<div>{state ? '雷猴' : '鲨鱼辣椒'}</div>
特点绑定
HTML
的特点需求动态绑定数据时,也是运用 {}
语法。
<script>
let name = '雷猴'
</script>
<div title={name}>Hello</div>
当鼠标放到 div
标签上时,会呈现 title
里的提示信息。
烘托 HTML 标签 @html
假如仅仅运用插值的办法烘托带有 HTML
标签的内容,Svelte 会主动转义 <
、>
之类的标签。
<script>
let h1El = '<h1 style="color: pink;">雷猴</h1>'
</script>
<div>{h1El}</div>
这种状况大都呈现在烘托富文本。
在 Vue 中有 v-html
办法,它能够将 HTML
标签烘托出来。在 Svelte 中也有这个办法,在插值前面运用 @html
符号一下即可。
<script>
let h1El = '<h1 style="color: pink;">雷猴</h1>'
</script>
<div>{@html h1El}</div>
但此办法有或许遭受 XSS
进犯。
我在 《NodeJS 避免xss进犯》 中简略演示过 XSS
进犯,有爱好的能够看看。
款式绑定
在日常开发中,给 HTML
标签设置款式首要经过 行内 style
和 class
特点。
根底的 HTML
写法和原生的相同,这里不过多解说。
下面首要讲动态设置款式,也便是将 JS
里的变量或许表达式绑定到 style
或许 class
里。
行内款式 style
<script>
let color = 'red'
setTimeout(() => {
color = 'blue'
}, 1000)
</script>
<div style="color: {color}">雷猴</div>
1秒后,文字从红色变成蓝色。
绑定 class
<script>
let foo = true
setTimeout(() => {
foo = false
}, 1000)
</script>
<div class:active={foo}>雷猴</div>
<style>
.active {
color: red;
}
</style>
在 HTML
里能够运用 class:xxx
动态设置要激活的类。这里的 xxx
是对应的类名。
语法是 class:xxx={state}
,当 state
为 true
时,这个款式就会被激活运用。
条件烘托 #if
运用 {#if}
开头,{/if}
结尾。
根底条件判别
{#if 条件判别}
...
{/if}
举个比方
<script>
let state = true
setTimeout(() => {
state = false
}, 1000)
</script>
{#if state}
<div>雷猴</div>
{/if}
1秒后改动状态
两种条件
{#if 条件判别}
...
{:else}
...
{/if}
举个比方
<script>
let state = true
setTimeout(() => {
state = false
}, 1000)
</script>
{#if state}
<div>雷猴</div>
{:else}
<div>鲨鱼辣椒</div>
{/if}
多种条件
{#if 条件判别}
...
{:else if 条件判别}
...
{/if}
举个比方
<script>
let count = 1
setInterval(() => {
count++
}, 1000)
</script>
{#if count === 1}
<div>雷猴</div>
{:else if count === 2}
<div>鲨鱼辣椒</div>
{:else}
<div>甲由恶霸</div>
{/if}
条件烘托的用法比较简略,只要 JS
根底就能看得懂。
列表烘托 #each
假如你有一堆数据需求展示出来,能够运用 #each
办法。
运用 {#each}
开头,{/each}
结尾。
遍历数组
{#each expression as name}
...
{/each}
举个比方
<script>
let list = ['a', 'b', 'c', 'd', 'e', 'f']
</script>
<ul>
{#each list as item}
<li>{item}</li>
{/each}
</ul>
要留意,Svelte 和 Vue 的遍历在写法上有点不同。
Vue的办法是:
<div v-for="元素 in 源数据">
<span>{{元素}}</span>
</div>
Svelte的办法是:
<div>
{#each 源数据 as 元素}
<span>{元素}</span>
{/each}
</div>
遍历数组(带下标)
<script>
let list = ['a', 'b', 'c', 'd', 'e', 'f']
</script>
<ul>
{#each list as item, index}
<li>{index} -- {item}</li>
{/each}
</ul>
留意:as 后边首先跟着元素,然后才是下标。并且元素和下标不需求用括号括起来。
假如元素是目标,能够解构
<script>
let list = [
{name: '雷猴'},
{name: '鲨鱼辣椒'}
]
</script>
<ul>
{#each list as {name}}
<li>{name}</li>
{/each}
</ul>
默许内容
假如源数据没有内容,是空数组的状况下,还能够组合 {:else}
一同运用。
<script>
let list = []
</script>
<div>
{#each list as {name}}
<div>{name}</div>
{:else}
<div>暂无数据</div>
{/each}
</div>
事情绑定 on:event
运用 on:
指令监听 DOM
事情,on:
后边跟随事情类型
语法:
on:事情类型={事情名}
举个比方,点击按钮时在控制台输出 “雷猴”。
<script>
function sayHi() {
console.log('雷猴')
}
</script>
<button on:click={sayHi}>打招呼</button>
绑定其他事情(比方change等)也是相同的道理。
事情修饰符
假如你只期望某些事情只履行一次,或许取消默许行为,或许阻挠冒泡等,能够运用事情修饰符。
语法:
on:事情类型|修饰符={事情名}
举个比方,我期望点击事情只能履行一次,之后再点击都无效,能够运用官方供给的 once
修饰符。
<script>
function sayHi() {
console.log('雷猴')
}
</script>
<button on:click|once={sayHi}>打招呼</button>
从上图能够看出,多次点击都仅仅输出1次“雷猴”。
除了 once
之外,还有以下这些修饰符能够用:
-
preventDefault
:制止默许事情。在程序运转之前调用event.preventDefault()
-
stopPropagation
:调用event.stopPropagation()
, 避免事情抵达下一个标签 -
passive
:改进了 touch/wheel 事情的翻滚表现(Svelte会在合适的当地主动加上它) -
capture
:表明在 capture阶段而不是bubbling触发其程序 -
once
:程序运转一次后删去自身
串联修饰符
修饰符还能够串联起来运用,比方 on:click|once|capture={...}
但需求留意,有些特别的标签运用修饰符会呈现“意想不到”的成果,比方 <a>
标签。
<script>
function toLearn() {
console.log('还在思考要不要学Canvas')
}
</script>
<a
href="https:///post/7116784455561248775"
on:click|once|preventDefault={toLearn}
>去学习Canvas ?</a>
本来是想给 <a>
标签绑定一个点击事情,第一次点击时在控制台输出一句话,并且制止 <a>
标签的默许事情。
所以运用了 once
和 preventDefault
修饰符。
但实际上并非如此。上面的代码意思是 once
设定了只履行一次 toLearn
事情,并且只要一次 preventDefault
是有效的。
只要点击时就不触发 toLearn
了,并且 preventDefault
也会失效。所以再次点击时,<a>
元素就会触发自身的跳转功用。
数据绑定 bind
数据绑定通常会和表单元素结合运用。
bind
能够做到双向数据绑定的效果。我觉得 Svelte 里的 bind
有点像 Vue 的 v-model
。
语法:
bind:property={variable}
input 单行输入框
<script>
let msg = 'hello'
function print() {
console.log(msg)
}
</script>
<input type="text" value={msg} />
<button on:click={print}>打印</button>
假如仅仅运用 value={msg}
的写法,input
默许值是 hello
,当输入框的值产生改动时,并没有把内容反响回 msg
变量里。
此刻就需求运用 bind
了。
<!-- 省略部分代码 -->
<input type="text" bind:value={msg} />
textarea 多行文本框
多行文本框相同绑定在 value
特点上。
<script>
let msg = 'hello'
</script>
<textarea type="text" bind:value={msg} />
<p>{msg}</p>
input range 规模挑选
由于都是 input
元素,仅仅 type
不同而已。所以规模挑选元素相同需求绑定 value
。
<script>
let val = 3
</script>
<input type="range" bind:value={val} min=0 max=10 />
<p>{val}</p>
radio 单选
单选框通常是成组呈现的,所以要绑定一个特别的值 bind:grout={variable}
<script>
let selected = '2'
</script>
<input type="radio" bind:group={selected} value="1" />
<input type="radio" bind:group={selected} value="2" />
<input type="radio" bind:group={selected} value="3" />
<p>{selected}</p>
checkbox 复选框
<script>
let roles = []
</script>
<input type="checkbox" bind:group={roles} value="雷猴" />
<input type="checkbox" bind:group={roles} value="鲨鱼辣椒" />
<input type="checkbox" bind:group={roles} value="甲由恶霸" />
<input type="checkbox" bind:group={roles} value="蝎子莱莱" />
<p>{roles}</p>
select 挑选器
<script>
let selected = 'a'
</script>
<select bind:value={selected}>
<option value='a'>a</option>
<option value='b'>b</option>
<option value='c'>c</option>
</select>
<span>{selected}</span>
select multiple 挑选器
multiple
和 checkbox
有点像。
<script>
let selected = []
</script>
<select multiple bind:value={selected}>
<option value="雷猴">雷猴</option>
<option value="鲨鱼辣椒">鲨鱼辣椒</option>
<option value="甲由恶霸">甲由恶霸</option>
<option value="蝎子莱莱">蝎子莱莱</option>
</select>
<span>{selected}</span>
简写形式
假如 bind
绑定的特点和在 JS
里声明的变量名相同,那能够直接绑定
<script>
let value = 'hello'
</script>
<input type="text" bind:value />
<p>{value}</p>
这个比方中,bind:value
绑定的特点是 value
,而在 JS
中声明的变量名也叫 value
,此刻就能够运用简写的办法。
$: 声明反响性
经过运用
$:
JS label 语法作为前缀。能够让任何坐落 top-level 的语句(即不在块或函数内部)具有反响性。每当它们依靠的值产生更改时,它们都会在 component 更新之前当即运转。
上面这段解说是官方文档的解说。
$:
在文档中称为 Reactivity
,中文文档成它为 反响功用力
。
但我运用 $:
时,觉得这个功用有点像 Vue 的 computed
。
$:
能够监听表达式内部的改动然后做出呼应。
<script>
let count = 0;
$: doubled = count * 2;
function handleClick() {
count += 1;
}
</script>
<button on:click={handleClick}>
点击加1
</button>
<p>{count} 翻倍后 {doubled}</p>
运用 $:
声明的 double
会主动依据 count
的值改动而改动。
假如将以上代码中 $:
改成 let
或许 var
声明 count
,那么 count
将失掉呼应性。
这样看来,真的和 Vue 的 computed
的效果有那么一点像。
异步烘托 #await
Svelte 供给异步烘托标签,能够提高用户体会。
语法:
{#await expression}
...
{:then name}
...
{:catch name}
...
{/await}
以 #await
开端,以 /await
结束。
:then
代表成功成果,:catch
代表失败成果。
expression
是判别体,要求回来一个 Promise
。
其实用法和 #if ... :else if ... /if
有那么一丢丢像。
举个比方
<script>
const api = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('恳求成功,数据是xxxxx')
}, 1000)
})
</script>
{#await api}
<span>Loading...</span>
{:then response}
<span>{response}</span>
{:catch error}
<span>{error}</span>
{/await}
假如将上面的 resolve
改成 reject
就会走 :catch
分支。
根底组件
在 Svelte 中,创立组件只需求创立一个 .svelte
为后缀的文件即可。
经过 import
引进子组件。
比方,在 src
目录下有 App.svelte
和 Phone.svelte
两个组件。
App.svelte
是父级,想要引进 Phone.svelte
并在 HTML
中运用。
App.svelte
<script>
import Phone from './Phone.svelte'
</script>
<div>子组件 Phone 的内容:</div>
<Phone />
Phone.svelte
<div>电话:13266668888</div>
组件通讯
组件通讯首要是 父子组件 之间的数据交游。
父传子
比方上面的比方,手机号期望从 App.svelte
组件往 Phone.svelte
里传。
能够在 Phone.svelte
中声明一个变量,并公开该变量。
App.svelte
就能够运用对应的特点把值传入。
App.svelte
<script>
import Phone from './Phone.svelte'
</script>
<div>子组件 Phone 的内容:</div>
<Phone number="88888888" />
Phone.svelte
<script>
export let number = '13266668888'
</script>
<div>电话:{number}</div>
假如此刻 App.svelte
组件没有传值进来,Phone.svelte
就会运用默许值。
子传父
假如想在子组件中修正父组件的内容,需求把修正的办法界说在父组件中,并把该办法传给子组件调用。
一同需求在子组件中引进 createEventDispatcher
办法。
App.svelte
<script>
import Phone from './Phone.svelte'
function print(data) {
console.log(`手机号: ${data.detail}`)
}
</script>
<div>子组件 Phone 的内容:</div>
<Phone on:printPhone={print} />
Phone.svelte
<script>
import { createEventDispatcher } from 'svelte'
const dispatch = createEventDispatcher()
function printPhone() {
dispatch('printPhone', '13288888888')
}
</script>
<button on:click={printPhone}>输出手机号</button>
父组件承受参数是一个目标,子组件传过来的值都会放在 detail
特点里。
插槽 slot
和 Vue 相同,Svelte 也有组件插槽。
在子组件中运用 <slot>
标签,能够接收父组件传进来的 HTML
内容。
App.svelte
<script>
import Phone from './Phone.svelte'
</script>
<div>子组件 Phone 的内容:</div>
<Phone>
<div>电话:</div>
<div>13288889999</div>
</Phone>
Phone.svelte
<style>
.box {
width: 100px;
border: 1px solid #aaa;
border-radius: 8px;
box-shadow: 2px 2px 8px rgba(0,0,0,0.1);
padding: 1em;
margin: 1em 0;
}
</style>
<div class="box">
<slot>默许值</slot>
</div>
生命周期
生命周期是指项目运转时,指定时期会主动履行的办法。
Svelte 中首要有以下几个生命周期:
-
onMount
: 组件挂载时调用。 -
onDestroy
: 组件销毁时履行。 -
beforeUpdate
: 在数据更新前履行。 -
afterUpdate
: 在数据更新完成后履行。 -
tick
: DOM元素更新完成后履行。
以上生命周期都是需求从 svelte
里引进的。
用 onMount
举个比方
<script>
import { onMount } from 'svelte'
let title = 'Hello world'
onMount(() => {
console.log('onMount')
setTimeout(() => title = '雷猴', 1000)
})
</script>
<h1>{title}</h1>
在组件加载完1秒后,改动 title
的值。
onDestroy
、beforeUpdate
和 afterUpdate
都和 onMount
的用法差不多,仅仅履行的时刻条件不同。你能够自己创立个项目试试看。
tick
是比较特别的,tick
和 Vue 的 nextTick
差不多。
在 Svelte 中,tick
的运用语法如下:
import { tick } from 'svelte'
await tick()
// 其他操作
总结
本文首要解说了 Svelte 的根底用法,但 Svelte 的内容和 API
远不止此。它还有许多高档的用法以及供给了过渡动画功用等,这些都会放在高档篇解说。
Svelte 是一个 Web
运用的构建东西,它打包出来的项目体积比较小,功用强,不运用虚拟DOM。
但 Svelte
的兼容性和周边生态相比起 Vue
和 React
会差一点。
所以日常项目中需求依据 Svelte 的优缺点进行取舍。
引荐阅读
引荐书本
- 《点石成金:访客至上的Web和移动可用性规划秘笈》
- 《包容性Web规划》
引荐文章
- 《Canvas 从入门到劝朋友放弃(图解版)》
- 《SVG 从入门到懊悔,怎样不早点学起来(图解版)》
- 《Fabric.js 从入门到膨胀》
- 《Vue3 过10种组件通讯办法》
- 《CSS也能用数字命名?》
点赞 + 重视 + 保藏 = 学会了