当前位置: 首页 > news >正文

【Svelte 5】当改变$state中的属性值,但是该属性并未在页面中使用,会导致页面重写渲染吗?

以下面为例,v.b的改变是否会导致页面刷新渲染?

<script>
let v = $state({a: 'a', b: 'b'});
</script><p>{v.a}</p>

不,当 v.b 改变时,<p>{v.a}</p> 元素不会对这个变化做出响应。

原因如下:

Svelte 5 的 $state rune 提供了细粒度响应式(fine-grained reactivity)。这意味着 Svelte 会精确地跟踪 $state 对象中哪些属性在模板中或响应式语句(如 $effect$derived)中被读取。然后,它只更新 DOM 中依赖于这些被改变属性的特定部分,或只运行依赖于这些属性的特定效果。

在你的例子中:

  1. let v = $state({a: 'a', b: 'b'}); 创建了一个响应式状态对象 v
  2. <p>{v.a}</p> 告诉 Svelte,这个特定的段落元素依赖于 v.a 的值。
  3. 由于 v.b 没有被在任何可见模板中,或在任何会触发该特定部分重新渲染的响应式语句中使用,因此,改变 v.b<p>{v.a}</p> 的渲染没有影响

可以这样理解: Svelte 为那个 <p> 标签订阅了 v.a 的变化。它没有为那个 <p> 标签订阅 v.b 的变化。

示例演示:

<!-- +page.svelte -->
<script>let v = $state({ a: 'initial A', b: 'initial B' });let updateCountA = 0;let updateCountB = 0;// 这个效果只在 v.a 改变时运行$effect(() => {console.log('v.a changed:', v.a);updateCountA++;});// 这个效果只在 v.b 改变时运行$effect(() => {console.log('v.b changed:', v.b);updateCountB++;});function changeA() {v.a = 'New A ' + Date.now();console.log('--- Changed v.a ---');}function changeB() {v.b = 'New B ' + Date.now();console.log('--- Changed v.b ---');}function changeBoth() {v.a = 'Both A ' + Date.now();v.b = 'Both B ' + Date.now();console.log('--- Changed v.a and v.b ---');}
</script><h1>Svelte 5 细粒度响应式</h1><div><h2>显示的值:</h2><p><strong>v.a:</strong> {v.a}</p><!-- v.b 没有直接在此处显示,但它存在 --><p>v.b (未直接显示,但存在): {v.b}</p>
</div><div><h2>更新计数 (来自 $effect):</h2><p>v.a effect 运行次数: {updateCountA} 次</p><p>v.b effect 运行次数: {updateCountB} 次</p>
</div><div style="margin-top: 20px;"><button on:click={changeA}>改变 v.a</button><button on:click={changeB}>改变 v.b</button><button on:click={changeBoth}>同时改变</button>
</div><style>div {margin-bottom: 10px;}button {margin-right: 10px;padding: 8px 15px;font-size: 16px;}strong {color: blue;}
</style>

你会观察到:

  • 当你点击 “改变 v.a” 时,只有 <p><strong>v.a:</strong> {v.a}</p> 会更新,显示新的 v.a 值。v.a effect runs 的计数会增加,你会在控制台中看到 “v.a changed”。<p>v.b (未直接显示,但存在): {v.b}</p> 的内容会保持不变,v.b effect runs 的计数不会增加。
  • 当你点击 “改变 v.b” 时,只有 <p>v.b (未直接显示,但存在): {v.b}</p> 会更新。v.b effect runs 的计数会增加,你会在控制台中看到 “v.b changed”。<strong>v.a:</strong> 的内容会保持不变,v.a effect runs 的计数不会增加。
  • 当你点击 “同时改变” 时,两个段落都会更新,并且两个效果都会运行。

这展示了 Svelte 5 $state rune 的细粒度响应式特性。只有那些明确依赖于被改变属性的部分才会做出响应。

http://www.dtcms.com/a/443097.html

相关文章:

  • 基于SpringBoot+Vue的万佳连锁使利店库存管理系统(Echarts图形化分析)
  • 第二章:BI的原理与技术架构
  • 上海万网网站建设湖北住房和城乡建设厅网站
  • 学习Java第三十天——黑马点评37~42
  • 北京网站建设价钱公众号文章制作
  • 长沙机械网站建设昆明最新消息今天
  • 深度解析 Python 报错:TypeError: ‘NoneType‘ object is not subscriptable
  • 泉州市城乡和住房建设网站大连装修公司
  • 哈巴河网站制作今天的最新消息新闻
  • 做网站猫腻大吗电商网站建设功能
  • 站长论坛网站模板建站教程
  • 淮南网站建设服务免费wordpress中文主题下载
  • 印刷报价网站源码下载小笨鸟跨境电商平台
  • Product Hunt 每日热榜 | 2025-10-04
  • 电商购物网站模板下载来年做哪个网站致富
  • 什么是近场?什么是远场?
  • 【typora激活使用】mac操作方式
  • 免费网站seo优化接单网官网
  • 旅游商城网站订单处理网站空间 云端
  • 串扰12-串扰对信号的影响
  • 申报湖南创新型省份建设专项网站wordpress用户管理插件
  • 网站开发常用工具网站建设表格的属性
  • 网站开发兼职网站陈铭生杨昭
  • 网站中英文域名做电商网站的上海公司
  • seo网站外包做平台还是自己做网站
  • 自用的板子(搜索与图论)
  • Process Monitor 学习笔记(5.9):Procmon 的自动化操作与命令行速查
  • 唐山网站优化中国风网页设计欣赏
  • 微网站开发需要多少费用主营网站开发
  • 网站开发者密钥sousou提交网站入口