Svelte 最新中文文档翻译(6)—— if、each、key、await 逻辑区块

news/2025/1/28 3:15:59/文章来源:https://www.cnblogs.com/yayujs/p/18691981

前言

Svelte,一个非常“有趣”、用起来“很爽”的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1

Image

Svelte 以其独特的编译时优化机制著称,具有轻量级高性能易上手等特性,非常适合构建轻量级 Web 项目,也是我做个人项目的首选技术栈。

目前 Svelte 基于 Svelte 5 发布了最新的官方文档,但却缺少对应的中文文档。为了帮助大家学习 Svelte,为爱发电翻译了官方文档。

我同时搭建了 Svelte 最新的中文文档站点:https://svelte.yayujs.com ,如果需要辅助学习,也可以入手我的小册《Svelte 开发指南》,语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!

虽说是翻译,但个人并不喜欢严格遵守原文,为了保证中文阅读流畅,会删减部分语句,对难懂的部分也会另做补充解释,希望能给大家带来一个好的中文学习体验。

欢迎围观我的“朋友圈”、加入“低调务实优秀中国好青年”前端社群,分享技术,带你成长。

{#if expression}...{/if}
{#if expression}...{:else if expression}...{/if}
{#if expression}...{:else}...{/if}

需要条件渲染的内容可以包装在 if 块中。

{#if answer === 42}<p>问题是什么?</p>
{/if}

可以使用 {:else if expression} 添加额外的条件,最后可以选择性地以 {:else} 子句结束。

{#if porridge.temperature > 100}<p>太热了!</p>
{:else if 80 > porridge.temperature}<p>太冷了!</p>
{:else}<p>刚刚好!</p>
{/if}

(块不必只包裹元素,它们也可以包裹元素内的文本。)

<!--- copy: false  --->
{#each expression as name}...{/each}
<!--- copy: false  --->
{#each expression as name, index}...{/each}

遍历值可以通过 each 块来完成。这些值可以是数组、类数组对象(即任何具有 length 属性的对象),或者可迭代对象如 MapSet —— 换句话说,任何可以用 Array.from 处理的对象都可以。

<h1>购物清单</h1>
<ul>{#each items as item}<li>{item.name} x {item.qty}</li>{/each}
</ul>

each 块还可以指定一个 index,相当于 array.map(...) 回调中的第二个参数:

{#each items as item, i}<li>{i + 1}: {item.name} x {item.qty}</li>
{/each}

带键的 each 块

<!--- copy: false  --->
{#each expression as name (key)}...{/each}
<!--- copy: false  --->
{#each expression as name, index (key)}...{/each}

如果提供了一个 key 表达式(必须能唯一标识每个列表项),当数据发生变化时,Svelte 将使用它对列表进行差异比较,而不是在末尾添加或删除条目。key 可以是任何对象,但建议使用字符串和数字,因为它们允许在对象本身发生变化时保持标识继续存在。

{#each items as item (item.id)}<li>{item.name} x {item.qty}</li>
{/each}<!-- 或带有额外的索引值 -->
{#each items as item, i (item.id)}<li>{i + 1}: {item.name} x {item.qty}</li>
{/each}

你可以在 each 块中自由使用解构和剩余模式。

{#each items as { id, name, qty }, i (id)}<li>{i + 1}: {name} x {qty}</li>
{/each}{#each objects as { id, ...rest }}<li><span>{id}</span><MyComponent {...rest} /></li>
{/each}{#each items as [id, ...rest]}<li><span>{id}</span><MyComponent values={rest} /></li>
{/each}

不带条目的 each 块

<!--- copy: false  --->
{#each expression}...{/each}
<!--- copy: false  --->
{#each expression, index}...{/each}

如果你只是想渲染某些内容 n 次,可以省略 as 部分(demo):

<div class="chess-board">{#each { length: 8 }, rank}{#each { length: 8 }, file}<div class:black={(rank + file) % 2 === 1}></div>{/each}{/each}
</div>

Else 块

<!--- copy: false  --->
{#each expression as name}...{:else}...{/each}

each 块还可以有一个 {:else} 子句,当列表为空时会渲染该子句。

{#each todos as todo}<p>{todo.text}</p>
{:else}<p>今天没有任务!</p>
{/each}

{#key expression}...{/key}

当表达式的值发生变化时,Key 块会销毁并重新创建其内容。当用在组件时,这将导致组件被重新实例化和重新初始化:

{#key value}<Component />
{/key}

如果你想要在值发生变化时播放过渡效果,这也很有用:

{#key value}<div transition:fade>{value}</div>
{/key}

{#await expression}...{:then name}...{:catch name}...{/await}
{#await expression}...{:then name}...{/await}
{#await expression then name}...{/await}
{#await expression catch name}...{/await}

Await 块允许你根据 Promise 的三种可能状态 — 等待中(pending)、已完成(fulfilled)或已拒绝(rejected) — 进行分支处理。

{#await promise}<!-- promise 正在等待中 --><p>等待 promise 解决中...</p>
{:then value}<!-- promise 已完成或不是一个 Promise --><p>值是 {value}</p>
{:catch error}<!-- promise 被拒绝 --><p>出现错误: {error.message}</p>
{/await}

[!NOTE] 在服务端渲染期间,只会渲染等待中分支。

如果提供的表达式不是一个 Promise,则只会渲染 :then 分支,包括在服务端渲染期间。

如果你不需要在 promise 被拒绝时渲染任何内容(或不可能出现错误),可以省略 catch 块。

{#await promise}<!-- promise 正在等待中 --><p>等待 promise 解决中...</p>
{:then value}<!-- promise 已完成 --><p>值是 {value}</p>
{/await}

如果你不关心等待状态,你也可以省略初始块。

{#await promise then value}<p>值是 {value}</p>
{/await}

同样,如果你只想显示错误状态,你可以省略 then 块。

{#await promise catch error}<p>错误是 {error}</p>
{/await}

[!NOTE] 你可以将 #awaitimport(...) 一起使用实现组件懒加载:

{#await import('./Component.svelte') then { default: Component }}<Component />
{/await}

Svelte 中文文档

本篇已收录在掘金专栏 《Svelte 中文文档》,该系列预计 40 篇。

系统学习 Svelte,欢迎入手小册《Svelte 开发指南》。语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!

此外我还写过 JavaScript 系列、TypeScript 系列、React 系列、Next.js 系列、冴羽答读者问等 14 个系列文章, 全系列文章目录:https://github.com/mqyqingfeng/Blog

通过文字建立交流本身就是一种缘分,欢迎围观我的“朋友圈”、加入“低调务实优秀中国好青年”前端社群,分享技术,带你成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876023.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中的集合ArrayList

创建集合对象有3种形式 1,不需要传递构造参数,直接new就可以,此时底层数组为空数组。 2,构造参数需要传递一个int类型的值, 用于设置底层数组的长度 3,构造参数需要传递一个Collection集合类型的值,用于将集合中的数据放置在当前的集合中。 第1种方式创建数组 package goodSt…

IDM下载器(Internet Download Manager) v6.42.27 直装破解版

Internet Download Manager(IDM)是一款功能强大的下载管理软件,可以帮助用户加快下载速度,管理下载任务,并能够恢复中断或损坏的下载任务。 软件功能 多线程下载:IDM支持多线程下载,可以同时下载多个文件,提高下载速度。定时下载:用户可以设置定时下载任务,方便管理…

Exadata磁盘写入性能差,导致数据库出现大量free buffer waits

1、故障概述 某客户的Exadata上,运行着很多套ORACLE数据库,在每个月的征期内,业务系统经常出现卡顿的现象,主要表现为业务数据写入慢,甚至出现业务写入超时的情况。2、故障分析 2.1 AWR分析 (1).分析数据库的AWR报告。(本报告取自于业务高峰期)从数据库的TOP10等待事件…

zkap_春节赛

题目情况web welcome_to_zkaqctf nodejs题目。给出附件包含后端源码,app listen部分根据本地nodejs监听调式需要,自行添加,用node --inspect app.js命令启动调试监听 // const host = 127.0.0.1; // 主机名或IP地址 // const port = 9999; // const app = fastify(); app.l…

AI 语音独角兽 ElevenLabs C 轮融资估值超 30 亿美元;港科大 Llasa TTS:15 秒声音克隆支持中英双语

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

The Locker Puzzle

The Locker Puzzle 今天刷到一个很有趣的著名概率题,如果有和我一样闲的人可以一起看看。 Philippe Flajolet和Robert Sedgewick在2009年提出了“百囚犯问题(The Locker Puzzle)”。 问题描述 在监狱中有100名囚犯,被编号为1-100号。典狱长决定给囚犯们一次特赦的机会,条件…

DDR3 memory type not supported

问题现象 电脑开机之后无法进入系统,而是显示下图: 解决方法 以为是内存条金手指有灰尘导致无法正常读取,插拔擦拭之后问题依旧。在网上查阅资料之后发现可能是内存条的电压与原装的不同,把加装的第二根内存取下之后,电脑正常。hp技术支持中心:https://h30434.www3.hp.co…

Python数据格式转换神器-提高办公效率

Python办公技巧,数据转换神器,提升工作效率一、引言在工作日常里,数据转换总是让人头疼?别急,今天揭秘一个超级实用的Python技巧,帮你轻松搞定各种数据格式转换,提升工作效率不是梦! 场景1:你手头有一堆CSV格式的(逗号分隔符)数据,其他部门或公司需要你提供其中几列关…

Python Functools模块

代码:#coding=utf-8import functools from functools import cache from functools import cached_property, lru_cache from functools import partial, partialmethod from functools import singledispatch, singledispatchmethod from functools import update_wrapper, w…

F12调试应用:强行查看洛谷个人主页

1.前言 众所周知,洛谷的个人主页常常有些不得了的东西,但是:(洛谷估值第二名%%%)这个系统维护每次都拦着我们。 有一个比较常用的方法就是删掉域名.cn,访问外国服务器(天天炸)。所以必须要有更可靠的方法。 2.F12大法妙 这时候,我们就可以按下F12打开检查。按下左上角…

【AI+安全】看不见的AI安全威胁,揭秘隐形提示注入风险

在人工智能蓬勃发展并融合到各行各业的当前,一种新型的威胁正悄然蔓延:隐形提示注入攻击。这种看不见的攻击手段,利用了用户肉眼无法识别的特殊字符,悄无声息地影响着大语言模型的行为。它就像一个隐藏在阴影中的刺客,偷偷操纵强大的 AI 系统做出意想不到的危险行为。 如果…

unity shader 消融效果

消融效果 基础消融效果原理多方向和可控消融