【一文搞定Svelte】超详细的Svelte保姆级上手教程!

2023-11-03

目录

Svelte框架是什么?

Svelte使用

一、项目搭建

1. SvelteKit搭建

2. Vite搭建

二、.svelte组件

1. 组件构成

2. 组件引用

三、语法

1. {} 包裹js表达式

2. on: 事件绑定

3. $ 响应

4. 逻辑块

5. 组件属性

6. store状态管理


Svelte框架是什么?

 翻译过来:Svelte 是一种构建 Web 应用程序的新方法。它是一个编译器,可以获取声明性组件并将它们转换为高效的 JavaScript,从而彻底更新 DOM。

简单来说就是:Svelte是一种现代的前端框架,它用于构建交互性的用户界面。但它与传统的前端框架不同,Svelte在构建过程中将组件转换为高效的JavaScript代码,而不是在运行时维护虚拟DOM(无虚拟DOM)。这种编译型的方式使得Svelte具有更高的性能和更小的包大小。

Svelte框架的主要特点有:

  1. 编译型:与传统的前端框架不同,Svelte在构建应用程序时并不依赖于运行时库。相反,它将组件代码在构建阶段转换为高效的、原生的JavaScript代码。这意味着在运行时,Svelte不需要额外的框架代码,所以它的包大小更小,加载速度更快。

  2. 响应式:Svelte的组件支持响应式声明。你只需要在组件内部声明一个变量并进行赋值,Svelte会自动追踪它的变化,并更新相关的视图。这使得开发人员能够以简洁的方式处理状态管理,而无需使用像Redux或Vuex这样的附加库。

  3. 组件化:Svelte鼓励使用组件化的开发方式。你可以创建可重用的组件,并在应用程序中组合它们,以构建复杂的用户界面。Svelte的组件是基于HTML、CSS和JavaScript的,使得开发人员能够将各个方面的组件化整合到一个文件中,使代码更加模块化和可维护。

  4. 轻量快速:由于Svelte在构建时生成高效的JavaScript代码,它的包大小较小,而加载和运行时性能也更好。这使得Svelte适用于构建轻量级、高性能的Web应用程序。

Svelte使用

一、项目搭建

两种方式,一种是通过官方推荐的SvelteKit搭建,它是Svelte 团队的官方应用程序框架。一种是Vite搭建。

1. SvelteKit搭建

pnpm create svelte@latest myapp
cd myapp
pnpm install
pnpm dev

根据出来的提示按照自己的项目需求选择就可以了。依次是 项目模板 ——> 是否要ts ——> 是否要Eslint、Prettier等。其中第一个项目模板的解释:

  1. SvelteKit demo app:这是一个SvelteKit示例应用程序模板,展示了SvelteKit的一些特性。它包含一个单词猜测游戏的演示,而且可以在没有JavaScript的情况下运行。

  2. Skeleton project:这是一个Svelte项目的骨架模板,提供了一个基本的项目结构和配置文件。你可以在此基础上快速开始开发自己的Svelte应用程序,根据需要添加所需的功能。

  3. Library project:这是一个用于创建Svelte库的模板。如果你想要构建可供其他项目使用的可重用组件或功能模块,可以选择这个模板。它提供了一个初始的项目结构和配置,使得开发和打包Svelte库变得更加简便。

一般来说,我们开发的话选择第二个或者第三个,内容自己填充。

 选择第二个模板(骨架模板)进去后安装运行:

2. Vite搭建

pnpm create vite

选择svelte模板就行了:

 进去安装后运行:

 个人倾向于第一种,因为自带路由。如果是Vite搭建的话需要安装路由插件。(路由此文不讲,如有需要另开一文)。

另:如果你的编辑器是VS Vode,安装插件Svelte for VS Code,可以为Svelte 组件提供语法突出显示和丰富的智能感知。

二、.svelte组件

1. 组件构成

<script>
  // js逻辑部分
</script>

<!-- html标签 -->
<!-- 和vue不同,不需要template标签,直接写 -->
<h1>Test</h1>
<p>other</p>

<style>
  /* 组件样式 */
</style>

所有三个部分——脚本、样式和标记——都是可选的。不是非要都写上。

2. 组件引用

跟vue、react框架一样,引入后像标签一样使用。

<script>
	import Resetter from './Resetter.svelte';
</script>

<Resetter />

三、语法

1. {} 包裹js表达式

svelte可以通过在{}里面可以放置js表达式,比如变量。由于svelte 采用的是编译方式——只要在 javascript 里有对变量赋值,就会自动触发数据的响应式。不需要多余的 api 调用。

  • 标签内容里
<script>
	let name = 'world';
</script>

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

  • 如果直接渲染成html文件使用{@html }
<script>
	let string = `here's some <strong>HTML!!!</strong>`;
</script>

<p>{@html string}</p>
  • 属性里
<script>
	let src = '/tutorial/image.gif';
	let name = 'Rick Astley';
</script>

<!-- 如果属性和变量名相同可以缩写为 src={src} -->
<img {src} alt="{name} dancing" />

2. on: 事件绑定

svelte的事件绑定通过 on:eventname 实现。后面也可以跟实现修饰符,这一点跟vue一致。

<script>
	let count = 0;

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

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

3. $ 响应

svelte的 $ 语法很强大,它可以实现类似于vue的computed的功能,更是可以实现整个语句/逻辑块的响应。只要 $ 后跟的代码里面所含的变量更改,那么它的逻辑也会执行。常用场景:

  • 声明计算属性

使用 $ 声明的变量,会根据它依赖的变量进行响应式的更改。如果反应式语句完全包含对未声明变量的赋值,Svelte 将自动注入 let 声明。

<script>
	let count = 1;

	$: doubled = count * 2;
	$: quadrupled = doubled * 2;

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

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

<p>{count} * 2 = {doubled}</p>
<p>{doubled} * 2 = {quadrupled}</p>

  • 声明响应式的任意语句/逻辑块

svelte的 $ 符号不仅限于声明反应性值(计算属性),还可以反应性地运行任意语句/逻辑块。例如,只要 count 的值发生变化,$ 后面的代码就会执行。

①单个语句:

let count = 0;

$: console.log(`the count is ${count}`);

②逻辑块

$: {
	console.log(`the count is ${count}`);
	console.log(`this will also be logged whenever count changes`);
}

③条件性的运行

只有当 count 大于等于10,后面的逻辑才执行。

$: if (count >= 10) {
	alert('count is dangerously high!');
	count = 0;
}

4. 逻辑块

  •  if

有条件呈现的内容可以包装在 if 块中。

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

{#if count > 10}
	<p>{count} is greater than 10</p>
{/if}

可以选择以 {:else} 子句结尾。

<script>
	let user = { loggedIn: false };

	function toggle() {
		user.loggedIn = !user.loggedIn;
	}
</script>

{#if user.loggedIn}
	<button on:click={toggle}> Log out </button>
{:else}
	<button on:click={toggle}> Log in </button>
{/if}

也可以使用 {:else if expression} 添加附加条件。

{#if porridge.temperature > 100}
  <p>too hot!</p>
{:else if 80 > porridge.temperature}
  <p>too cold!</p>
{:else}
  <p>just right!</p>
{/if}
  • each

可以使用each 块来循环渲染列表。

<h1>Shopping list</h1>
<ul>
  {#each items as item}
    <li>{item.name} x {item.qty}</li>
  {/each}
</ul>

后面还可以跟index、key等。

5. 组件属性

在 Svelte 中,通过 export 关键字来实现接受父组件传来的属性。

父组件:

<script>
	import Nested from './Nested.svelte';
</script>

<Nested answer={42} />

子组件:

<script>
	export let answer;
</script>

<p>The answer is {answer}</p>

6. store状态管理

svelte的状态管理是自带的,不需要像vue或者react那样额外安装pinia或者redux等库。

svelte/store 模块导出用于创建可读、可写和派生存储的函数。直接引入使用即可。其中最常用的函数writable。使用该函数创建出来的值具有可以从“外部”组件设置的值——具有附加的 set 和 update 方法的对象。

以下这个例子很好的演示了平时项目里的使用。

store.svelte: 从svelte/store模块引入writable函数并使用创建一个count。

import { writable } from 'svelte/store';

export const count = writable(0); 

app.js:引入创建好的count,并使用subscribe订阅进行想要的操作。

<script>
	import { count } from './stores.js';
	import Incrementer from './Incrementer.svelte';
	import Decrementer from './Decrementer.svelte';
	import Resetter from './Resetter.svelte';

	let count_value;

	count.subscribe((value) => {
		count_value = value;
	});
</script>

<h1>The count is {count_value}</h1>

<Incrementer />
<Decrementer />
<Resetter />

Decrementer.svelte: 使用 update 方法对 count - 1

<script>
	import { count } from './stores.js';

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

<button on:click={decrement}>
	-
</button>

Incrementer.svelte:使用 update 方法对 count + 1

<script>
	import { count } from './stores.js';

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

<button on:click={increment}>
	+
</button>

Resetter.svelte:使用 set 方法对 count 直接赋值

<script>
	import { count } from './stores.js';

	function reset() {
		count.set(0);
	}
</script>

<button on:click={reset}>
	reset
</button>

 以上写法可行。但这样看着是不是很麻烦?每次使用需要subscribe方法来订阅,set或者update方法来更改。并且还新增多余的变量count_value。基于此,svelte提供了更简介的解决方案——$自动订阅。

<script>
	import { count } from './stores.js';
</script>

<h1 on:click={() => $count + 1}>The count is {$count}</h1>

使用 $ 进行了自动订阅,无需使用subscribe方法,修改也不需要使用set或者update方法。

当然,store状态管理模块不止writable(可写的,有update和set方法,并且可以在store.js文件外设置值)函数,还有readable(可读的,只能在store.js文件内改变值)、derived(衍生的,可理解为计算属性)、readonly(只读的,没有update和set方法)。

更多可见:Introduction • Docs • Svelte

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【一文搞定Svelte】超详细的Svelte保姆级上手教程! 的相关文章

  • 了解设置 JQuery 变量

    了解设置 JQuery 变量 最近 我通过在 StackOverflow 上遇到的另一个问题寻找帮助 了解到如何设置 JQuery 变量 如下所示 您可以通过简单地调用变量来创建输入字段 并且锚变量似乎也定义了样式 var clicked
  • Android 设备上的 PhoneGap 蓝牙插件

    我一直在尝试让 PhoneGap 工作的蓝牙插件 但我似乎不知道哪里出了问题 首先 我的测试设备是 Galaxy S3 GT 19305T 应用程序是使用PhoneGap CLI http docs phonegap com en 3 0
  • 从数据 URI 解码 QR 码

    我尝试从数据 uri 中解码二维码 var dataUri data image gif base64 R0lGODdh9gD2AIAAAAAAAP ywAAAAA9gD2AAAC decodeQrCode dataUri cb 我已经尝试
  • 为什么 JavaScript base-36 转换看起来不明确

    我目前正在编写一段使用 Base 36 编码的 JavaScript 我遇到了这个问题 parseInt welcomeback 36 toString 36 看来要回归了 welcomebacg 我在 Chrome 开发者控制台和 Nod
  • 使用模数按字母顺序对列表进行排序

    我在获取元素列表并按字母顺序对它们进行排序方面没有任何问题 但我很难理解如何使用模数来做到这一点 更新 这是按我的方式工作的代码 但是 我更喜欢下面提供的答案的可重用性 因此接受了该答案
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • Meteor:应用程序无法在 0.9.1.1 版本上运行

    出现类似错误 Error TypeError undefined is not a function evaluating Template create anonymous function iron dynamic template j
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • Node.js:如何在检索数据(块)时关闭响应/请求

    我正在用 node js 构建一个应用程序 它加载多个页面并分析内容 因为 node js 发送块 所以我可以分析这些块 如果一个块包含例如索引 nofollow 我想关闭该连接并继续其余部分 var host example com to
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • 如何使用tampermonkey模拟react应用程序中的点击?

    我正在尝试使用 Tampermonkey 脚本模拟对 React 元素的点击 不幸的是 由于 React 有自己的影子 DOM 所以天真的方法使用document querySelector 不工作 我遇到了一些需要修改 React 组件本
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • 如何更改此 jquery 插件的时区/时间戳?

    我正在使用这个名为 timeago 的插件 在这里找到 timeago yarp com 它工作得很好 只是它在似乎不同的时区运行 我住在美国东部 费城时区 当我将准确的 EST 时间放入 timeago 插件时 比如 2011 05 28
  • 如何仅在最后一个
  • 处给出透明六边形角度?
  • 我必须制作这样的菜单 替代文本 http shup com Shup 330421 1104422739 My Desktop png http shup com Shup 330421 1104422739 My Desktop png
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中

随机推荐

  • 全卷积网络(FCN)与图像分割

    从图像分类到图像分割 卷积神经网络 CNN 自2012年以来 在图像分类和图像检测等方面取得了巨大的成就和广泛的应用 CNN的强大之处在于它的多层结构能自动学习特征 并且可以学习到多个层次的特征 较浅的卷积层感知域较小 学习到一些局部区域的
  • CentOs7 修复 引导启动

    一 修复MBR MBR Master Boot Record主引导记录 硬盘的0柱面 0磁头 1扇区称为主引导扇区 其中446Byte是bootloader 64Byte为Partition table 剩下的2Byte为magic num
  • 配置hadoop各个节点之间免密码登录实践笔记

    前言 最近在搭建Hadoop环境需要设置无密码登陆 所谓无密码登陆其实是指通过证书认证的方式登陆 使用一种被称为 公私钥 认证的方式来进行ssh登录 在linux系统中 ssh是远程登录的默认工具 因为该工具的协议使用了RSA DSA的加密
  • 使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比)

    使用Python OpenCV缩放照片 忽略宽高比 保持宽高比 1 效果图 1 1 保持宽高比效果图 1 2 忽略宽高比效果图 1 3 opencv各插值效果图 2 原理 3 源码 参考 这篇博客将介绍如何使用OpenCV调整图像大小 调整
  • EEPROM的学习和使用方法

    EEPROM的学习和使用方法 https blog csdn net bornpride article details 87894400 一 概述 在实际的应用中 保存在单片机RAM中的数据 掉电后就丢失了 保存在单片机的FLASH中的数
  • 使用 K-means 算法进行客户分类

    本文为 AI 研习社编译的技术博客 原标题 Customer segmentation using Machine Learning K Means Clustering 翻译 吕鑫灿 就2 校对 就2 整理 志豪 原文链接 http ww
  • 快上车!第十七届全国大学生智能汽车竞赛百度创意组来啦

    全国大学生智能汽车竞赛 是教育部倡导的大学生科技A类竞赛 是2021年全国普通高校大学生竞赛榜单内竞赛 中国高等教育学会将其列为含金量最高的大学生竞赛之一 在全国数百所高校的支持下 全国大学生智能汽车竞赛至今已成功举办了十六届 参赛学生总规
  • 安装pytorch_geometric

    前些时候了解了python下的 dgl库来进行图谱的计算 最近看到pytorch geometric 比dgl快很多 于是打起了pytorch geometric的主意 然而pytorch geometric 并没有dgl 安装这么方便 大
  • gcc与glibc关系

    gcc与glibc关系 glibc是什么 以及与gcc的关系 glibc是gnu发布的libc库 也即c运行库 glibc是linux 系统中最底层的api 应用程序开发接口 几乎其它任何的运行库都会倚赖于glibc glibc除了封装li
  • Git & GitHub入门3:修改文件后提交(modify, stage, commit)

    用atom 打开当前目录下的文件 修改这个文件 在其中加一行注释后保存 运行git add Practice BaiduBaike py 表示我们希望将保存修改后的Practice BaiduBaike py文件 现在我们可以使用git c
  • 毕业N年后,请不要像我一样被档案烦死——转自一位已经毕业的学姐

    转 转自一位已经毕业的学姐 今天在QQ空间里看见有一个毕业了很久的学姐写下了下面这段很干货的经历 加上现在大学生确实对毕业生档案问题不够重视和了解 也很迷茫 所以打算做个搬运工 把这种经历转发出来 提前知道毕业了之后档案到底会有什么影响 毕
  • HAProxy的安装及常用配置中文注释

    一 HAProxy的安装 1 Centos安装 yum install haproxy 2 Ubuntu 安装 apt get install haproxy 3 编译安装 1 安装前准备 yum install gcc gcc c gli
  • Linux TCP客户端、服务器编程模型及实例

    Linux TCP客户端 服务器编程模型及实例 服务器模型 1 绑定IPv4的地址 INADDR ANY 和端口号 8888 int listenfd sockfd opt 1 struct sockaddr in server clien
  • php根据类型重定向跳转

    核心代码 elseif REQUEST act print iftaochan next qid intval REQUEST custqid if empty qid sys msg 非法参数 row where row where cu
  • tinystl实现(第二步:TypeTraits.h)

    经过长时间的学习终于可以开始tinystl的仿 chao 写工作了 本文参考了这位大佬的github 坦白讲我只是补充了注释 因为tinystl的代码真的非常经典而我又没什么这种大型项目的经验 所以只能这样做 不过相信能够有助于大家的学习
  • 计算方法——C语言实现——高斯消元法求解线性方程组

    最近在上计算方法这门课 要求是用MATLAB做练习题 但是我觉得C语言也很棒棒啊 题目 高斯消元法是线性方程组的直接解法 可能会造成很大的失真 尤其是下面用的高斯顺序消元法 代码都是上上个星期写的 暂时就不注释了 使用VS2017 代码如下
  • Latex使用笔记

    Latex使用笔记 笔者最近开始使用latex编辑文档 此处记录一下latex的使用过程中一些值得记录的点 Latex安装 latex安装网上教程很多 笔者参考TeX Live2018 latex安装教程安装成功 未安装图形化界面 late
  • python 时间转换 指定字符串时间转时间戳

    指定年月日时分秒的表达方式 time strftime Y m d H M S 字符串转时间戳 tss1 2019 08 27 timeArray time strptime tss1 Y m d 转为时间戳 timeStamp int t
  • 通用文字识别 本地OCR接口 json数据 任意语言 不限次调用 exe服务工具免搭建部署启动即用

    解决没有网络得环境下图片转文字 本地OCR 也可以云端自己搭建服务 稳定 不限调用次数 附送两个百度飞桨得ONNX识别模型 一个简单 一个复杂 在这里插入图片描述 样本识别效果 使用方法 启动本地OCR接口服务 图片文件 gt base64
  • 【一文搞定Svelte】超详细的Svelte保姆级上手教程!

    目录 Svelte框架是什么 Svelte使用 一 项目搭建 1 SvelteKit搭建 2 Vite搭建 二 svelte组件 1 组件构成 2 组件引用 三 语法 1 包裹js表达式 2 on 事件绑定 3 响应 4 逻辑块 5 组件属