Svelte 最新中文文档教程(16)—— Context(上下文)

news/2025/2/22 18:16:55/文章来源:https://www.cnblogs.com/yayujs/p/18731206

前言

Svelte,一个语法简洁、入门容易,面向未来的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1

image.png

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

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

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

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

欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上前端大佬成长之路。

Context(上下文)

大多数状态是组件级别的状态,其生命周期与组件相同。然而,也存在应用程序范围或页面范围的状态,这也需要进行相应的处理。

处理这种情况最简单的方法是创建全局状态并直接导入它。

/// file: state.svelte.js
export const myGlobalState = $state({user: {/* ... */}/* ... */
});
<!--- file: App.svelte --->
<script>import { myGlobalState } from './state.svelte.js';// ...
</script>

这样做有几个缺点:

  • 只有当您的全局状态仅在客户端使用时,它才能安全地工作 - 例如,当您正在构建一个不在服务端渲染任何组件的单页应用时。如果您的状态最终在服务端被管理和更新,它可能会在 sessions 和(或)用户之间共享,从而导致 bug
  • 这可能给人一种误导性的印象,即某个状态是全局的,而实际上它只应该在你的应用程序的某个特定部分使用

为了解决这些缺点,Svelte 提供了一些 context 原语来缓解这些问题。

设置和获取上下文

要将任意对象与当前组件关联,请使用 setContext

<script>import { setContext } from 'svelte';setContext('key', value);
</script>

然后,组件的子级(包括插槽内容)可以使用 getContext 访问上下文。

<script>import { getContext } from 'svelte';const value = getContext('key');
</script>

setContextgetContext 解决了上述问题:

  • 状态不是全局的,而是限定在组件范围内。这样就可以安全地在服务端渲染组件而不会泄露状态
  • 很明显,状态不是全局的,而是限定在特定的组件树中,因此不能在应用的其他部分使用

[!NOTE] setContext/getContext 必须在组件初始化期间调用。

上下文本身不是响应式的。如果你需要上下文中的响应式值,你可以传递一个 $state 对象到上下文中,其属性 将会 是响应式的。

<!--- file: Parent.svelte --->
<script>import { setContext } from 'svelte';let value = $state({ count: 0 });setContext('counter', value);
</script><button onclick={() => value.count++}>增加</button>
<!--- file: Child.svelte --->
<script>import { getContext } from 'svelte';const value = getContext('counter');
</script><p>计数为 {value.count}</p>

要检查给定的 key 是否已在父组件的上下文中设置,可以使用 hasContext

<script>import { hasContext } from 'svelte';if (hasContext('key')) {// 执行某些操作}
</script>

您还可以使用 getAllContexts 获取属于最近父组件的整个上下文映射。这在你以编程方式创建组件并想要将现有上下文传递给它时很有用。

<script>import { getAllContexts } from 'svelte';const contexts = getAllContexts();
</script>

封装上下文交互

上述方法对如何使用它们并没有太多限制。当你的应用规模增长时,将设置和获取上下文封装到函数中并正确地为其添加类型是值得的。

// @errors: 2304
import { getContext, setContext } from 'svelte';let userKey = Symbol('user');export function setUserContext(user: User) {setContext(userKey, user);
}export function getUserContext(): User {return getContext(userKey) as User;
}

Svelte 中文文档

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

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

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

欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上前端大佬成长之路。

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

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

相关文章

微信小程序-授权获取手机号

前端 wxml <button name=phone class=phone value={{userInfo.phone}} wx:if="{{!userInfo.phone}}" bindgetphonenumber="getPhoneNumber" hover-class=none open-type=getPhoneNumber>点击获取 </button>js import { wxGetPhoneNumber } fr…

Linux 中xargs 中 -L和-n参数的差异

001、-L :按照换行符的数量来传递[root@PC1 dir1]# ls [root@PC1 dir1]# echo {0..9} 0 1 2 3 4 5 6 7 8 9 [root@PC1 dir1]# echo {0..9} | xargs -L 2 ## 利用echo生成一个1行的测试数据 0 1 2 3 4 5 6 7 8 9 [root@PC1 dir1]# seq 0 9 0 1 2 3 4 5 6 7 8 9 [ro…

【humanoid gym】关于在Issac gym里面PPO算法实现里transitions部分roll out storage的记录

1. 前言 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 2.1 在on_policy_runner.py文件夹下,初始化的地方:然后我们寻找定义的地方,在ppo.py文件夹下:其中参数num_transitions_per_env其…

Windows快速部署xxl-job.jar

1.在官网下载文件 https://gitee.com/xuxueli0323/xxl-job 2.在idea打开项目 3.修改maven版本,当前版本(2025/2/22)需要使用maven3.6.3+,maven地址:https://maven.apache.org/download.cgi maven版本过老的报错信息:Failed to execute goal org.apache.maven.plugins:mav…

复制浏览器网页文字 粘贴时却乱码的解决

本文介绍在复制网页内容后粘贴时,粘贴内容出现一个方框图案而不是当初复制内容的解决办法~本文介绍在复制网页内容后粘贴时,粘贴内容出现一个方框图案而不是当初复制内容的解决办法。最近,需要将谷歌地球引擎(Google Earth Engine,GEE)网页中的一段代码复制到另一个网页中…

【翻译】凝视深渊:千核并发控制的评估

凝视深渊:千核并发控制的评估 作者 Xiangyao Yu MIT CSAIL yxy@csail.mit.edu George Bezerra MIT CSAIL gbezerra@csail.mit.edu Andrew Pavlo 卡内基梅隆大学 pavlo@cs.cmu.edu Srinivas Devadas MIT CSAIL devadas@csail.mit.edu Michael Stonebraker MIT CSAIL stonebrake…

2.21课堂测验

需求描述: 请设计一个仓储管理系统原型系统,该系统支持多个仓库的设立。统一设立物资台账,物资台账需包含物资编码、物资名称、规格、材质、供应商、品牌、物资分类,用户可以自定义物资的物资分类。需限制不同的物资名称、规格、材质的物资不能设立相同的物资编码。仓库人员…

CSS2

盒子模型所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容 Margin(外边距):元素与其他元素的距离(边框以外的距离),外边距是透明的,需要修…

清华大学第三版《DeepSeek:如何抓住DeepSeek红利》,普通人必备的Ai手册(附PDF手册)

前两天,清华大学发布了一部极为详尽的电子书——《DeepSeek从入门到精通》。这本书将DeepSeek的基础知识以及提示词的运用方法,讲解得清晰明了、浅显易懂,一经问世便迅速在网络上引发了广泛关注与热潮。 【清华第一版】《DeepSeek从入门到精通》率先登场,给广大对DeepSeek感…

Linux 中xargs 命令的-i和-I用法差异

001、-i 选项[root@PC1 dir1]# ls a.txt b.txt dir1 h.csv i.csv [root@PC1 dir1]# tree . ├── a.txt ├── b.txt ├── dir1 ├── h.csv └── i.csv1 directory, 4 files [root@PC1 dir1]# find *.txt | xargs -i mv {} dir1/ ## -i选项可以将xargs命令传…

宜家 App 存在的 bug All In One

宜家 App 存在的 bug All In One 某商品下架后,App 的订单中就无法再查看有关商品的任何详细信息宜家 App 存在的 bug All In One bugs某商品下架后,App 的订单中就无法再查看有关商品的任何详细信息解决方案使用 Google 搜索,获取对应的商品的网页版信息https://www.ikea.c…