尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ArkTS 进阶之道(25):@StorageLink/@StorageProp 应用级状态绑定边界——为啥双向绑定 vs 单向只读
ArkTS 进阶之道25StorageLink/StorageProp 应用级状态绑定边界——为啥双向绑定 vs 单向只读本文是「ArkTS 进阶之道」系列第 25 篇续「ArkUI 状态联动」深水区。上篇讲 LocalStorage 页面级状态存储槽边界同页面多组件共享页面卸载就销毁。本文讲应用级状态绑定边界StorageLink 双向绑定 vs StorageProp 单向只读——根因在双向绑定槽 vs 单向只读槽。能力系列篇 25 讲过 StorageLink/StorageProp 怎么用本文讲为哈 StorageLink 双向绑定合法 StorageProp 单向只读组件不能改——根因在双向绑定槽 vs 单向只读槽。一、开篇StorageLink 不是单向只读是双向绑定 AppStorage 键你写 React 时应用级状态绑定是「useSelector 魔法」useSelector 双向 sync redux store// React 应用级状态绑定useSelector useDispatch 双向 sync function Comp() { const count useSelector(state state.count) // 单向读 redux store const dispatch useDispatch() return button onClick{() dispatch({ type: INC })}count{count}/button // 改用 dispatch } // React 应用级状态绑定useSelector 单向读 useDispatch 改双向 sync 魔法你写鸿蒙 ArkTS 时StorageLink双向绑定 AppStorage 键——组件改互同步// ArkTS StorageLink 双向绑定 AppStorage 键 AppStorage.setOrCreate(appCount, 0) Component struct LinkComp { StorageLink(appCount) appCount: number 0 // ✅ StorageLink 双向绑定改互同步 build() { Button(appCount${this.appCount}) .onClick(() { this.appCount }) // ✅ 组件改 → AppStorage 同步 → 其他组件同步 } } // StorageLink 双向绑定 AppStorage 键组件改 → AppStorage 同步 → 其他组件同步双向useSelector 魔法 vs 双向绑定槽的区别React 把应用级状态绑定当 useSelector 魔法单向读 useDispatch 改ArkTS 把 StorageLink 当「双向绑定槽」组件改互同步。根因不是 useSelector 魔法是双向绑定槽——StorageLink 双向绑定 AppStorage 键组件改 → AppStorage 同步 → 其他组件同步双向。二、根因StorageLink/StorageProp 的双向绑定槽 vs 单向只读槽机制鸿蒙 ArkUI 的 StorageLink/StorageProp 是应用级状态绑定槽——StorageLink 双向绑定槽StorageProp 单向只读槽来自三重绑定机制。机制 1StorageLink 双向绑定 AppStorage 键——组件改互同步StorageLink 荬饰器双向绑定 AppStorage 键——组件改 → AppStorage 同步 → 其他组件同步双向AppStorage.setOrCreate(appCount, 0) Component struct LinkComp { StorageLink(appCount) appCount: number 0 // ✅ StorageLink 双向绑定改互同步 build() { Column() { Text(appCount ${this.appCount}) Button(改 appCount) .onClick(() { this.appCount }) // ✅ 组件改 → AppStorage 同步 → 其他组件同步 } } } // StorageLink 双向绑定 AppStorage 键组件改 → AppStorage 同步 → 其他组件同步双向StorageLink 双向绑定 AppStorage 键StorageLinkappCount荬饰器双向绑定 AppStorage 键——组件改appCount→ AppStorage 同步 → 其他组件同步双向。根因不是单向只读是双向绑定槽——StorageLink 双向绑定 AppStorage 键组件改互同步双向。机制 2StorageProp 单向只读绑定——AppStorage 改组件同步组件不能改StorageProp 荬饰器单向只读绑定——AppStorage 改 → 组件同步组件改只改本地副本不回传AppStorage.setOrCreate(appCount, 0) Component struct PropComp { StorageProp(appCount) appCount: number 0 // ⚠ StorageProp 单向只读组件不能改 build() { Column() { Text(appCount ${this.appCount}只读组件不能改) Button(试改 appCount) .onClick(() { // ⚠ StorageProp 只读改只改组件本地副本不回传 AppStorage单向只读 this.appCount // ⚠ 只改本地副本AppStorage 不同步其他组件不同步 }) } } } // StorageProp 单向只读绑定AppStorage 改 → 组件同步组件改只改本地副本不回传StorageProp 单向只读绑定StoragePropappCount荬饰器单向只读绑定——AppStorage 改appCount→ 组件同步组件改appCount只改本地副本不回传 AppStorage。根因不是双向同步是单向只读槽——StorageProp 单向只读绑定AppStorage 改组件同步组件改不回传。机制 3StorageLink vs StorageProp 边界——双向绑定 vs 单向只读StorageLink双向绑定组件改互同步StorageProp单向只读AppStorage 改组件同步组件改不回传——根因都是绑定 AppStorage 键但绑的机制不同AppStorage.setOrCreate(appCount, 0) // ✅ StorageLink 路径双向绑定组件改 → AppStorage 同步 → 其他组件同步双向 Component struct LinkComp { StorageLink(appCount) appCount: number 0 // ✅ StorageLink 双向绑定 build() { Button(LinkComp ${this.appCount}) .onClick(() { this.appCount }) // ✅ 组件改 → AppStorage 同步 → 其他组件同步 } } // ⚠ StorageProp 路径单向只读AppStorage 改 → 组件同步组件改不回传 Component struct PropComp { StorageProp(appCount) appCount: number 0 // ⚠ StorageProp 单向只读 build() { Button(PropComp ${this.appCount}) .onClick(() { this.appCount }) // ⚠ 改只改本地副本AppStorage 不同步 } } // StorageLink vs StorageProp 边界双向绑定改互同步vs 单向只读组件改不回传StorageLink vs StorageProp 边界StorageLink 路径——双向绑定组件改 → AppStorage 同步 → 其他组件同步双向推荐组件要改用。StorageProp 路径——单向只读AppStorage 改 → 组件同步组件改只改本地副本不回传推荐组件只读用。根因都是绑定 AppStorage 键但绑的机制不同——StorageLink 双向绑定槽改互同步StorageProp 单向只读槽组件改不回传。机制 4AppStorage.set 改 → StorageLink StorageProp 都同步AppStorage.set改 AppStorage 键→ StorageLink StorageProp 都同步AppStorage 是源AppStorage.setOrCreate(appCount, 0) Entry Component struct Index { StorageLink(appCount) linkCount: number 0 // ✅ StorageLink 双向绑定 build() { Column() { Button(直接改 AppStorage.set(appCount, 50)) .onClick(() { AppStorage.set(appCount, 50) // ✅ AppStorage 改 → StorageLink 同步 StorageProp 同步 // ✅ AppStorage 是源StorageLink 和 StorageProp 都从 AppStorage 同步 }) } } } // AppStorage.set 改 → StorageLink StorageProp 都同步AppStorage 是源AppStorage.set 改 → StorageLink StorageProp 都同步AppStorage.setappCount改 AppStorage 键 → StorageLink StorageProp 都同步AppStorage 是源。根因不是组件改是 AppStorage 源——AppStorage.set 改 → StorageLink StorageProp 都同步AppStorage 是源。三、真机配图StorageLink/StorageProp 应用级状态绑定边界——双向 vs 只读初始态LinkComp appCount0 葝色双向、PropComp appCount0 橙色只读均绑定边界初始态齐点调三按钮后LinkComp appCount50 葝色被 AppStorage.set 直接改 50 覆盖、PropComp appCount50 橙色只读同步、StorageLink 双向 vs StorageProp 只读边界证据齐对比证据点 LinkComp 改 appCount 后 AppStorage 同步StorageLink 双向点 PropComp 试改 appCount 后只改本地副本不回传StorageProp 只读点直接改 AppStorage.set(“appCount”, 50) 后 LinkComp PropComp 都同步 50AppStorage 是源。StorageLink 双向绑定 vs StorageProp 单向只读——StorageLink 绑定 AppStorage 键改互同步双向StorageProp 绑定 AppStorage 键只读组件改不回传。四、真解法StorageLink/StorageProp 应用级状态绑定的三个场景场景 1StorageLink 双向绑定计数器90% 场景首选组件要改用双向AppStorage.setOrCreate(appCount, 0) Component struct LinkComp { StorageLink(appCount) appCount: number 0 // ✅ StorageLink 双向绑定改互同步 build() { Column() { Text(appCount ${this.appCount}) Button(改 appCount) .onClick(() { this.appCount }) // ✅ 组件改 → AppStorage 同步 → 其他组件同步 } } }为哈能跑StorageLink 双向绑定计数器——双向绑定槽StorageLinkappCount双向绑定 AppStorage 键组件改appCount→ AppStorage 同步 → 其他组件同步双向。首选这个90% 的场景组件要改应用级状态用 StorageLink 双向绑定槽就够。要写「组件改应用级状态计数器等」时用这个——不用 StorageProp 单向只读组件改不回传StorageLink 双向绑定改互同步。场景 2StorageProp 单向只读绑定展示组件只读用单向AppStorage 改组件同步AppStorage.setOrCreate(appCount, 0) Component struct PropComp { StorageProp(appCount) appCount: number 0 // ⚠ StorageProp 单向只读组件不能改 build() { Text(appCount ${this.appCount}只读展示组件不能改) // ✅ AppStorage 改 → 组件同步只读展示 } } // StorageProp 单向只读绑定展示AppStorage 改 → 组件同步只读展示组件不能改为哈能跑StorageProp 单向只读绑定展示——单向只读槽StoragePropappCount单向只读绑定 AppStorage 键AppStorage 改appCount→ 组件同步只读展示组件不能改。要写「组件只读展示应用级状态只读展示等」时用这个——不用 StorageLink 双向绑定组件改会回传StorageProp 单向只读组件不能改。场景 3StorageLink StorageProp 混用改组件用 StorageLink只读组件用 StoragePropAppStorage.setOrCreate(appCount, 0) // ✅ 改组件用 StorageLink 双向绑定组件改 → AppStorage 同步 Component struct EditComp { StorageLink(appCount) appCount: number 0 // ✅ StorageLink 双向绑定改互同步 build() { Column() { TextInput({ text: ${this.appCount}, placeholder: 输入值 }) .onChange((value: string) { this.appCount parseInt(value) || 0 }) // ✅ 改 → AppStorage 同步 } } } // ✅ 只读组件用 StorageProp 单向只读AppStorage 改 → 组件同步只读展示 Component struct ShowComp { StorageProp(appCount) appCount: number 0 // ✅ StorageProp 单向只读组件不能改 build() { Text(只读展示 appCount ${this.appCount}) // ✅ AppStorage 改 → 组件同步只读展示 } } // StorageLink StorageProp 混用改组件用 StorageLink 双向只读组件用 StorageProp 单向只读为哈能跑StorageLink StorageProp 混用——改组件用 StorageLink 双向绑定组件改 → AppStorage 同步只读组件用 StorageProp 单向只读AppStorage 改 → 组件同步只读展示。要写「改组件 只读组件混用编辑 展示等」时用这个——改组件用 StorageLink 双向只读组件用 StorageProp 单向只读。五、一句话哲学StorageLink 不是单向只读是双向绑定 AppStorage 键的改互同步StorageProp 是单向只读的组件不能改。ArkUI 的 StorageLink 荬饰器双向绑定 AppStorage 键组件改互同步双向。根因不是单向只读是双向绑定槽——StorageLink 双向绑定 AppStorage 键组件改 → AppStorage 同步 → 其他组件同步双向 StorageProp 单向只读绑定AppStorage 改 → 组件同步组件改只改本地副本不回传 StorageLink vs StorageProp 边界双向绑定 vs 单向只读 AppStorage.set 改 → StorageLink StorageProp 都同步AppStorage 是源。对比 React 应用级状态绑定 useSelector 魔法单向读 useDispatch 改ArkTS StorageLink 双向绑定槽改互同步。状态联动深水区串讲Watch 绑 State 变触发副作用回调槽篇 68 Link $ 语法双向绑定跨组件同步篇 69 Provide/Consume 跨层级传递槽祖辈后辈同步篇 70 Observed/ObjectLink 嵌套对象观测槽子属性改刷 UI篇 71 AppStorage 应用级状态存储槽所有页面共享篇 72 LocalStorage 页面级状态存储槽同页面多组件共享篇 73 StorageLink/StorageProp 应用级状态绑定边界双向 vs 只读篇 74StorageLink 双向绑定 vs StorageProp 单向只读——续「ArkUI 状态联动」深水区讲状态联动深水区Watch 寕作用回调槽边界 Link $ 语法双向绑定边界 Provide/Consume 跨层级传递槽边界 Observed/ObjectLink 嵌套对象观测槽边界 AppStorage 应用级状态存储槽边界 LocalStorage 页面级状态存储槽边界 StorageLink/StorageProp 应用级状态绑定边界。系列预告下篇篇 75讲 LocalStorageLink/LocalStorageProp 页面级状态绑定边界LocalStorage 绑定根因续「ArkUI 状态联动」深水区。五阶段哲学体系类型哲学50-52→ 作用域哲学53-55→ 状态哲学56-59→ 渎染哲学60-62→ 组件设计63-67→ 状态联动深水区68讲清 ArkTS/ArkUI 进阶哲学。能力系列回链能力系列篇本文进阶点篇 25 StorageLink/StorageProp 用法StorageLink/StorageProp 应用级状态绑定边界根因双向绑定 vs 单向只读篇 23 AppStorage 用法应用级状态存储槽边界所有页面共享页面卸载状态仍存在篇 59 Watch 用法状态联动深水区Watch 儝作用回调槽 vs onClick 直接调副作用边界真机 demo 完整代码// 篇 74 demoStorageLink/StorageProp 应用级状态绑定边界 // StorageLink 双向绑定 AppStorage 键改互同步vs StorageProp 单向只读绑定组件不能改 AppStorage.setOrCreate(appCount, 0) AppStorage.setOrCreate(appTheme, #007DFF) // ✅ StorageLink 双向绑定组件改互同步组件改 → AppStorage 同步AppStorage 改 → 组件同步 Component struct LinkComp { StorageLink(appCount) appCount: number 0 // ✅ StorageLink 双向绑定改互同步 build() { Column({ space: 6 }) { Text(组件 LinkCompStorageLink 双向绑定) .fontSize(11).fontColor(#2563eb).fontWeight(FontWeight.Bold) Text(appCount ${this.appCount}).fontSize(13).fontColor(#2563eb) Button(LinkComp 改 appCountStorageLink 双向组件改 → AppStorage 同步) .width(92%).height(36).fontSize(10) .onClick(() { this.appCount }) // ✅ 组件改 → AppStorage 同步 → 其他组件同步 } .width(92%).padding(8).backgroundColor(#e0f0ff).borderRadius(6) } } // ⚠ StorageProp 单向只读绑定组件AppStorage 改 → 组件同步组件不能改只读 Component struct PropComp { StorageProp(appCount) appCount: number 0 // ⚠ StorageProp 单向只读组件不能改 build() { Column({ space: 6 }) { Text(组件 PropCompStorageProp 单向只读) .fontSize(11).fontColor(#ff6600).fontWeight(FontWeight.Bold) Text(appCount ${this.appCount}只读组件不能改).fontSize(13).fontColor(#ff6600) Button(PropComp 试改 appCountStorageProp 只读改不回传 AppStorage) .width(92%).height(36).fontSize(10) .onClick(() { // ⚠ StorageProp 只读改只改组件本地副本不回传 AppStorage单向只读 this.appCount // ⚠ 只改本地副本AppStorage 不同步其他组件不同步 }) } .width(92%).padding(8).backgroundColor(#fff0e0).borderRadius(6) } } Entry Component struct Index { StorageLink(appTheme) appTheme: string #007DFF State log: string (未操作) build() { Column({ space: 12 }) { Text(篇 74 配图StorageLink/StorageProp 应用级状态绑定边界) .fontSize(16).fontWeight(FontWeight.Bold).margin({ top: 16, bottom: 4 }) Text(StorageLink 双向绑定改互同步vs StorageProp 单向只读组件不能改) .fontSize(10).fontColor(#888).margin({ bottom: 8 }) LinkComp() PropComp() // ✅ 直接改 AppStorageStorageLink 同步StorageProp 也同步 Button(直接改 AppStorage.set(appCount, 50)) .width(92%).height(40).fontSize(12) .onClick(() { AppStorage.set(appCount, 50) // ✅ AppStorage 改 → StorageLink 同步 StorageProp 同步 this.log AppStorage.set appCount50StorageLink StorageProp 都同步 }) Text(日志${this.log}).fontSize(10).fontColor(#333).margin({ top: 4 }) } .width(100%).height(100%).alignItems(HorizontalAlign.Center) } }写鸿蒙 ArkUI 记住StorageLink 不是单向只读是双向绑定 AppStorage 键的改互同步——StorageLink 荬饰器双向绑定 AppStorage 键组件改互同步双向。根因不是单向只读是双向绑定槽——StorageLink 双向绑定 AppStorage 键组件改 → AppStorage 同步 → 其他组件同步双向 StorageProp 单向只读绑定AppStorage 改 → 组件同步组件改只改本地副本不回传 StorageLink vs StorageProp 边界双向绑定 vs 单向只读 AppStorage.set 改 → StorageLink StorageProp 都同步AppStorage 是源。StorageLink 双向绑定计数器用双向绑定槽首选90% 场景StorageProp 单向只读绑定展示用单向只读槽组件不能改StorageLink StorageProp 混用改组件用 StorageLink 双向只读组件用 StorageProp 单向只读。双向绑定 vs 单向只读是 ArkUI 状态联动深水区核心
RELATED

相关推荐

AI副业定价不是拍脑袋:用蒙特卡洛模拟+客户支付意愿热力图定最终报价

AI副业定价不是拍脑袋:用蒙特卡洛模拟+客户支付意愿热力图定最终报价

更多请点击: https://codechina.net 第一章:AI副业定价不是拍脑袋:用蒙特卡洛模拟客户支付意愿热力图定最终报价 传统AI副业定价常依赖经验或竞品对标,易陷入“高了没人买、低了不赚钱”的两难。本章引入数据驱动的双引擎定价法&…

📅 2026/9/29 12:25:19
Python驱动海康工业相机实战:从环境搭建到缺陷检测应用

Python驱动海康工业相机实战:从环境搭建到缺陷检测应用

1. 项目缘起:为什么用Python驱动海康工业相机? 在工业视觉项目里,选型上位机开发语言时,C#和C往往是主流选择,尤其是在对实时性要求极高的场景下。但这两年,我发现身边越来越多的工程师,包括我自…

📅 2026/9/10 1:38:31
降AIGC黑科技!AI率92%暴降至5%!实测10款降AIGC软件!学生党狂喜!

降AIGC黑科技!AI率92%暴降至5%!实测10款降AIGC软件!学生党狂喜!

2026 年各大高校和期刊平台的 AI 检测系统又升级了,知网 AIGC、维普 AI、万方智能检测三大平台的算法迭代速度越来越快,上个月能蒙混过关的改写方式,这个月直接就会被标红预警。单纯的同义词替换、语序调整早就不管用了,想要有效降…

📅 2026/9/8 20:43:23
MORE NEWS

更多资讯

📰

Sass 安装与命令行编译:用 TaoToken 统一 Key 打通 SCSS 工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Hermes Agent 学习笔记 06:Skills 系统,Agent 如何把经验沉淀为可复用能力?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

别再盲目学后端了!先搞懂这7个核心技术栈

很多人学后端,上来就啃Spring Boot、Django、Express,跟着教程做个CRUD项目,就以为自己入门了。可一旦线上出现CPU飙高、数据库死锁、消息重复消费,立刻手足无措。原因很简单:你学的是框架的“用法”,而不是…

📰

面了20家Java岗,我总结出这7个高频致命问题

今年年初,我辞掉了外包公司的工作,决定放手一搏,冲击大厂。接下来的两个月,我投递了近百份简历,参加了20场面试。从创业公司到独角兽,从一面到终面,我经历过面试官的频频点头,也体会…

📰

零基础学习C/C++需要注意的地方

谈及C/C,功能强大、应用广泛,一旦掌握了后,若是再自学其他语言就显得轻而易举了。那为什么学C/C的人少呢?很多人认为C/C虽然博大精深,但也难学。其实就本人认为C/C并非是“difficult(困难)”的&…

📰

工控现货的核心竞争力:型号覆盖、版本准确与响应速度

1. 工控现货这门生意,远不止“有货就卖”这么简单干了十几年工业自动化这一行,我越来越觉得“工控现货”这四个字被严重低估了。外行看,不就是倒买倒卖PLC、变频器、伺服电机吗?但真正在这个圈子里摸爬滚打过的人都知道&#xff0…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬