Svelte 最新中文文档教程(14)—— 特殊元素

news/2025/2/22 22:49:31/文章来源:https://www.cnblogs.com/yayujs/p/18726209

前言

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

image.png

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

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

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

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

欢迎围观我的“网页版朋友圈”、加入“低调务实优秀中国好青年”前端社群,踏上前端大佬成长之路。

svelte:boundary

<svelte:boundary onerror={handler}>...</svelte:boundary>

[!NOTE]
此功能在 5.3.0 版本中添加

边界允许你防止应用程序的某一部分出错进而影响整个应用程序,并且可以从这些错误中恢复。

如果在渲染或更新 <svelte:boundary> 的子组件时发生错误,或在执行其中包含的任何 $effect 函数时发生错误,内容将被移除。

在渲染过程之外发生的错误(例如,在事件处理程序中)不会被错误边界捕获。

属性

要使边界发挥作用,必须提供 failedonerror 中的一个或两个。

failed

如果提供了 failed 代码片段,它将与抛出的错误一起渲染,并提供一个重新创建内容的 reset 函数(demo):

<svelte:boundary><FlakyComponent />{#snippet failed(error, reset)}<button onclick={reset}>糟糕!再试一次</button>{/snippet}
</svelte:boundary>

[!NOTE]
与传递给组件的代码片段一样,failed 代码片段可以作为属性显式传递...

<svelte:boundary {failed}>...</svelte:boundary>

...或者像上面的例子那样直接在边界内部隐式声明。

onerror

如果提供了 onerror 函数,它将被调用并传入相同的两个参数 errorreset 。这对于使用错误报告服务跟踪错误很有用...

<svelte:boundary onerror={(e) => report(e)}>...
</svelte:boundary>

...或者在边界本身之外使用 errorreset

<script>let error = $state(null);let reset = $state(() => {});function onerror(e, r) {error = e;reset = r;}
</script><svelte:boundary {onerror}><FlakyComponent />
</svelte:boundary>{#if error}<button onclick={() => {error = null;reset();}}>糟糕!再试一次</button>
{/if}

如果在 onerror 函数内部发生错误(或者如果你重新抛出错误),它将被父边界处理(如果存在的话)。

svelte:window

<svelte:window onevent={handler} />
<svelte:window bind:prop={value} />

<svelte:window> 元素允许您向 window 对象添加事件监听器,而无需担心在组件销毁时移除它们,或在服务端渲染时检查 window 是否存在。

此元素只能出现在组件的顶层 — 它不能在块或元素内部。

<script>function handleKeydown(event) {alert(`按下了 ${event.key} 键`);}
</script><svelte:window onkeydown={handleKeydown} />

你还可以绑定以下属性:

  • innerWidth
  • innerHeight
  • outerWidth
  • outerHeight
  • scrollX
  • scrollY
  • onlinewindow.navigator.onLine 的别名
  • devicePixelRatio

除了 scrollXscrollY 外,其他都是只读的。

<svelte:window bind:scrollY={y} />

[!NOTE] 注意,页面不会滚动到初始值以避免可访问性问题。只有对 scrollXscrollY 绑定变量的后续更改才会导致滚动。如果你有正当理由在组件渲染时滚动,请在 $effect 中调用 scrollTo()

svelte:document

<svelte:document onevent={handler} />
<svelte:document bind:prop={value} />

<svelte:window> 类似,此元素允许您在 document 上添加事件监听器,比如 visibilitychange,这些事件不会在 window 上触发。它还允许您在 document 上使用 actions。

<svelte:window> 一样,此元素只能出现在组件的顶层,绝不能在块或元素内部。

<svelte:document onvisibilitychange={handleVisibilityChange} use:someAction />

您还可以绑定以下属性:

  • activeElement
  • fullscreenElement
  • pointerLockElement
  • visibilityState

所有属性都是只读的。

svelte:body

<svelte:body onevent={handler} />

<svelte:window> 类似,这个元素允许你在 document.body 上添加事件监听器,比如 mouseentermouseleave,这些事件在 window 上是不会触发的。它还允许你在 <body> 元素上使用actions。

<svelte:window><svelte:document> 一样,这个元素只能出现在组件的顶层,且绝不能在块或元素内部。

<svelte:body onmouseenter={handleMouseenter} onmouseleave={handleMouseleave} use:someAction />

svelte:head

<svelte:head>...</svelte:head>

这个元素可以将元素插入到 document.head 中。在服务端渲染期间,head 内容与主要的 body 内容是分开暴露(exposed)的。

<svelte:window><svelte:document><svelte:body> 一样,此元素只能出现在组件的顶层,且不能在块或元素内部。

<svelte:head><title>Hello world!</title><meta name="description" content="This is where the description goes for SEO" />
</svelte:head>

svelte:element

<svelte:element this={expression} />

<svelte:element> 元素允许你渲染一个未知的元素,例如该元素来自 CMS。存在的任何属性和事件监听器都将应用于该元素。

唯一支持的绑定是 bind:this,因为 Svelte 的内置绑定不适用于通用元素。

如果 this 是空值(nullish value),该元素及其子元素都不会被渲染。

如果 this 是空元素(例如 br)的名称,并且 <svelte:element> 包含子元素,在开发模式下将会抛出运行时错误:

<script>let tag = $state('hr');
</script><svelte:element this={tag}>这段文本不能出现在 hr 元素内部
</svelte:element>

Svelte 会尽力从元素的周围环境推断出正确的命名空间,但这并不总是可行的。你可以使用 xmlns 属性明确指定它:

<svelte:element this={tag} xmlns="http://www.w3.org/2000/svg" />

this 需要是一个有效的 DOM 元素标签,像 #textsvelte:head 这样的内容将不能正常运行。

svelte:options

<svelte:options option={value} />

<svelte:options> 元素提供了一个指定每个组件编译器选项的位置,这些选项在编译器部分有详细说明。可用的选项包括:

  • runes={true} — 强制组件进入 符文模式 (参见 Legacy APIs 部分)
  • runes={false} — 强制组件进入 遗留模式
  • namespace="..." — 该组件将使用的命名空间,可以是 "html"(默认)、"svg" 或 "mathml"
  • customElement={...} — 将此组件编译为自定义元素时使用的选项。如果传入字符串,则将其用作 tag 选项
  • css="injected" — 该组件将内联注入其样式:在服务端渲染期间,它会作为 <style> 标签注入到 head 中,在客户端渲染期间,它通过 JavaScript 加载

[!LEGACY] 遗留模式
Svelte 4 还包含以下废弃选项。它们在 Svelte 5 中已被废弃,在符文模式下不可用。

  • immutable={true} — 从不使用可变数据,因此编译器可以进行简单的引用相等性检查来确定值是否已更改
  • immutable={false} — 默认值。Svelte 将更保守地判断可变对象是否发生了变化。
  • accessors={true} — 为组件的 props 添加 getter 和 setter
  • accessors={false} — 默认值
<svelte:options customElement="my-custom-element" />

Svelte 中文文档

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

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

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

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

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

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

相关文章

清华大学第四版:DeepSeek+DeepResearch:让科研像聊天一样简单!(附PDF免费下载)

还在为文献综述熬夜秃头?数据分析做到怀疑人生?清华大学与北航团队联合开发的DeepSeek+DeepResearch横空出世,彻底颠覆传统科研模式!这款AI工具让科研像聊天一样轻松,一键生成高质量报告,效率提升10倍!还在为文献综述熬夜秃头?数据分析做到怀疑人生?清华大学与北航团队…

2.Java基础

本章目标数据类型 变量和常量 运算符 数组 循环本章内容问题:任何编程语言都离不开数据的计算,那么在编程语言中能过什么来保存变化的计算的值,有哪些类型可以用于计算?这时我们就需要使用到:数据类型、变量、常量、运算符一、数据类型 java数据类型可分为两大类(基本数据…

不可不知的浏览器使用技巧

本文是《最全面的浏览器教程》第二篇,主要介绍浏览器的基本概念,基本技巧,以及相关设置。​ 本文是《最全面的浏览器教程》第二篇,主要介绍浏览器的基本概念,基本技巧,以及相关设置。 除此之外,还会介绍一些我平时遇到的问题和解决办法。 ‍ 浏览器是什么 简单来说,浏览…

codelldb-win32-x64.vsix 插件安装

vscode 安装 出++插件更新     nstalling platform package from https://github.com/vadimcn/codelldb/releases/download/v1.11.4/codelldb-win32-x64.vsix Error: Error: socket hang up https://github.com/vadimcn/codelldb/releases/vadimcn v1.11.4 e5aef55 Compar…

最全面的浏览器教程

这个教程能让你的浏览器更加好用、好玩。​ 这个教程能让你的浏览器更加好用、好玩。 ‍ 为什么写 在 日渐孤岛化的互联网上,浏览器的重要性在逐渐下降。但不可否认的是,它依然重要,是日常生活中常用软件之一。 我自己就是电脑端重度用户,浏览器是我用的最频繁的软件之一,…

Vision Transformer中的图像块嵌入详解:线性投影和二维卷积的数学原理与代码实现

Transformer 架构因其强大的通用性而备受瞩目,它能够处理文本、图像或任何类型的数据及其组合。其核心的“Attention”机制通过计算序列中每个 token 之间的自相似性,从而实现对各种类型数据的总结和生成。在 Vision Transformer 中,图像首先被分解为正方形图像块,然后将这…

10分钟搭建DeepSeek R1满血版个人知识库实例指导

本文通过一个完整实例(花茶大师),手把手教你搭建基于DeepSeek R1的个人知识库本文通过一个完整实例(花茶大师),手把手教你搭建基于DeepSeek R1的个人知识库 一. 搭建满血版DeepSeek R1 1、下载Cherry Studio,已下载请忽略 下载地址 2、登录/注册「硅基流动」,新用户会赠…

Vue2.0 运用PDFjs 直接运用pdfjs-dist加载pdf文件

首先pdfjs这部分有2种加载运用方式。 1、直接npm的形式。2、直接运用其构建好的文件。本文就直接讲述的第二种。pdfjs官网https://mozilla.github.io/pdf.js/getting_started/#download。(划重点,注意看viewer.html,viewer.mjs)文件解压之后直接放入项目中,随便哪个地方。在…

代理合约Delegatecall

Delegatecall 简介1.1.什么是 delegatecall ?.delegatecall() 是 Solidity 中的一个方法,用于从一个原始合约中调用目标合约中的一个函数。然而,与其他方法不同的是,当使用.delegatecall()在目标合约中执行函数时,上下文从原始合约中传递,即代码在目标合约中执行,但变量…

Dify知识库分段与数据清洗实战:优化LLM检索效率与回答精准性指南

将内容上传至知识库后,要对内容进行分段与数据清洗。该阶段是内容的预处理与数据结构化过程,长文本将会被划分为多个内容分段。 1 分段 由于LLM的上下文窗口有限,无法一次性处理和传输整个知识库的内容,因此需对文档 中的长文本分段为内容块。即便部分大模型已支持上传完整…

CTFShow-Web169-170:包含日志

CTFShow-Web169-170:包含日志 前端校验要求上传.zip文件,验证要求MIME类型为image/png 过滤了$、?、<、>等,考虑使用包含日志 🛠️ Web169-170 WriteUp上传.user.zip,BurpSuite上传修改后缀为ini,MIME类型修改为image/png同第一步上传图片,UA中写入一句话木马点…

DEEPSEEK-R1 模型 API 部署

DEEPSEEK-R1 模型 API 部署DeepSeek-R1 模型 API 部署一. 项目背景二. 项目需求三. 项目环境3.1 必要依赖3.2 安装依赖3.3 获取模型(1) models.py 模型文件(2) setting.py 配置文件3.4 书写 FastAPI 应用(1) main.py 文件3.5 部署到服务器(1) 启动 FastAPI 服务(2) 配置防火墙(…