ArkTS 进阶之道(8):@Prop/@Link 父子传值——单向 vs 双向数据流根因
ArkTS 进阶之道8Prop/Link 父子传值——单向 vs 双向数据流根因本文是「ArkTS 进阶之道」系列第 8 篇续「ArkUI 状态哲学」阶段。上篇讲 State 装饰器赋值就刷 UI 的依赖追踪机制篇 56——单组件内部状态。本文讲父子组件传值Prop 单向 vs Link 双向——根因在数据流方向绑定机制Prop 绑单向「父传子」Link 绑双向「父子同步」。能力系列篇 14 讲过 Prop/Link 怎么用本文讲为哈单向 vs 双向——根因在数据流绑定。一、开篇Prop/Link 不是轻量的语法糖是数据流方向的显式绑定你写 TypeScript/React 时父子传值是「魔法」React props 单向传子子改要调父 setter// React props 单向 setter 回调 function Child({ value, onChange }: { value: number; onChange: (v: number) void }) { return Button onClick{() onChange(value 1)}子改 {value}/Button } function Parent() { const [count, setCount] useState(0) return Child value{count} onChange{setCount} / ← 父传 value 单向子改调 onChange 回父改 } // 子改 value 不刷单向子调 onChange 才回父改刷手动双向你写鸿蒙 ArkTS 时Prop/Link 装饰器显式绑数据流方向——不用手写 setter 回调// ArkTS Prop 单向 Link 双向显式绑定 Component struct PropChild { Prop value: number // Prop 单向父传子子改不影响父 build() { Text(${this.value}) } } Component struct LinkChild { Link synced: number // Link 双向父子同步变 build() { Text(${this.synced}) } } Entry Component struct Index { State propValue: number 1 State linkValue: number 1 build() { Column() { PropChild({ value: this.propValue }) // 父传 Prop 单向 LinkChild({ synced: this.linkValue }) // 父传 Link 双向 } } }魔法 vs 绑定的区别React 把父子传值当「魔法」你手写 setter 回调实现双向ArkTS 把 Prop/Link 当「数据流方向绑定」装饰器编译期绑方向不用手写 setter。根因不是魔法是绑定——Prop 编译期绑单向「父变子变子变父不变」Link 编译期绑双向「父子互变同步」。二、根因Prop/Link 的数据流方向绑定机制鸿蒙 ArkUI 的 Prop/Link 是数据流方向绑定——编译期给字段加方向追踪代码父变触发子刷 / 子改是否回父来自三重绑定机制。机制 1Prop 单向绑定——父变子变子变父不变Prop 装饰器编译期绑单向数据流——父 State 变触发子 Prop 刷子 Prop 改不回父Component struct PropChild { Prop value: number // Prop 单向父变子变子变父不变 build() { Column() { Text(子 Prop ${this.value}) ← 依赖 Prop value Button(子改 Prop) .onClick(() { this.value this.value 100 // 子改 Prop只刷自己 UI父不变 }) } } } Entry Component struct Index { State propValue: number 1 // 父管 Prop 的源 build() { Column() { Text(父 State ${this.propValue}) PropChild({ value: this.propValue }) // 父传 Prop 单向 Button(父改 State) .onClick(() { this.propValue // 父改 State单向传 Prop 子刷新 }) } } }单向绑定Propvalue编译期绑单向——父propValue变触发子value刷父变子变子value改不回父propValue子变父不变。赋值this.value this.value 100只刷子 UI父propValue仍原值。单向数据流不用手写 setter装饰器绑方向。机制 2Link 双向绑定——父子互变同步Link 装饰器编译期绑双向数据流——父 State 变触发子 Link 刷子 Link 改也回父 StateComponent struct LinkChild { Link synced: number // Link 双向父子互变同步 build() { Column() { Text(子 Link ${this.synced}) ← 依赖 Link synced Button(子改 Link) .onClick(() { this.synced this.synced 100 // 子改 Link父子同步变双向 }) } } } Entry Component struct Index { State linkValue: number 1 // 父管 Link 的源 build() { Column() { Text(父 State ${this.linkValue}) LinkChild({ synced: this.linkValue }) // 父传 Link 双向 Button(父改 State) .onClick(() { this.linkValue // 父改 State双向同步 Link 子也变 }) } } }双向绑定Linksynced编译期绑双向——父linkValue变触发子synced刷父变子变子synced改也回父linkValue子变父也变。赋值this.synced this.synced 100父子同步变父子 UI 均刷。双向数据流不用手写 setter 回调装饰器绑方向。机制 3Prop/Link 追踪范围不同——单向只追父变 / 双向追父子互变Prop/Link 编译期绑的追踪范围不同——Prop 只追父变单向通知子Link 追父子互变双向同步// Prop 追踪范围只追父变单向通知子 // 父 propValue 变 → 通知子 value 刷父变子变 // 子 value 改 → 不通知父子变父不变单向只追父变方向 // Link 追踪范围追父子互变双向同步 // 父 linkValue 变 → 通知子 synced 刷父变子变 // 子 synced 改 → 通知父 linkValue 变子变父也变双向追互变方向追踪范围区别Prop 编译期只追「父变单向通知子」一个方向Link 编译期追「父变通知子 子变通知父」两个方向。根因不是单向双向的语法区别是编译期绑的追踪范围不同——Prop 绑一个方向Link 绑两个方向。三、真机配图Prop 单向 vs Link 双向 数据流对比证据初始态父 propValue1、父 linkValue1、子 Prop1、子 Link1 均初始值点调子改 Prop 子改 Link 父改 State 后父 propValue1 不变子 Prop 变 101 单向、父 linkValue2 子 Link 同步变 102 双向均对比证据齐对比证据子改 Prop 后子变 101 父 propValue 仍 1单向子变父不变子改 Link 后父子同步变双向互变同步父改 State propValue 单向传子刷新父改 State linkValue 双向同步子也变。Prop 单向 vs Link 双向不是语法区别是编译期绑的数据流追踪范围不同——Prop 绑一个方向Link 绑两个方向。四、真解法Prop/Link 用法的三个场景场景 1Prop 单向传值子只读不改父90% 场景首选Component struct DisplayChild { Prop title: string // Prop 单向子只读显示不改父 Prop count: number build() { Column() { Text(this.title) ← 依赖 Prop title 只读显示 Text(count ${this.count}) ← 依赖 Prop count 只读显示 } } } Entry Component struct Index { State title: string 标题 State count: number 0 build() { Column() { DisplayChild({ title: this.title, count: this.count }) // 父传 Prop 单向 Button(父改) .onClick(() { this.count // 父改 State 单向传子刷新 }) } } }为哈能跑Prop 单向绑「父变子变子变父不变」子只读显示不改父。首选这个90% 的场景子只读显示用 Prop 单向就够。要写「子显示父数据不改」时用这个——单向数据流清晰子改不影响父状态边界。场景 2Link 双向同步父子互改同步要双向协作时Component struct EditChild { Link synced: number // Link 双向子可改父也同步变 build() { Column() { Text(同步 ${this.synced}) Button(子改) .onClick(() { this.synced // 子改 Link 父也同步变双向 }) } } } Entry Component struct Index { State shared: number 0 // 父管 Link 的源 build() { Column() { Text(父 ${this.shared}) EditChild({ synced: this.shared }) // 父传 Link 双向 Button(父改) .onClick(() { this.shared // 父改 State 双向同步子也变 }) } } }为哈能跑Link 双向绑「父子互变同步」子可改父也同步变。要写「父子双向协作共享状态」时用这个——双向数据流不用手写 setter 回调装饰器绑两个方向追踪。注意 Link 的父端必须是 State双向同步要父管源状态。场景 3Prop Link 混用单向显示 双向编辑分离Component struct MixedChild { Prop readonlyTitle: string // Prop 单向只读显示标题 Link editableValue: number // Link 双向可编辑值同步 build() { Column() { Text(this.readonlyTitle) ← Prop 只读显示 Text(值 ${this.editableValue}) ← Link 可编辑同步 Button(子改值) .onClick(() { this.editableValue ← 子改 Link 父也变双向 // this.readonlyTitle 新 ← 子改 Prop 不影响父单向不这么用 }) } } } Entry Component struct Index { State title: string 标题 State value: number 0 build() { Column() { MixedChild({ readonlyTitle: this.title, editableValue: this.value }) Button(父改标题) .onClick(() { this.title 标题${this.value} }) ← 父改 Prop 单向传子 } } }为哈能跑Prop Link 混用——Prop 管只读显示字段单向父传子Link 管可编辑字段双向父子同步。要写「子组件有只读字段 可编辑字段分离」时用这个——单向双向按字段职责分离数据流边界清晰。五、一句话哲学Prop/Link 不是语法区别是编译期绑的数据流方向追踪范围不同。ArkUI 的 Prop 单向绑「父变子变子变父不变」一个方向追踪Link 双向绑「父子互变同步」两个方向追踪。根因不是单向双向的语法区别是编译期绑的追踪范围——Prop 绑一个方向父变通知子Link 绑两个方向父变通知子 子变通知父。不用手写 setter 回调装饰器绑方向。状态哲学阶段串讲State 单组件内部篇 56赋值就刷 UI 依赖追踪→ Prop/Link 父子传值篇 57单向 vs 双向数据流绑定——从「单组件内部状态」到「父子组件传值」扩展根因都是编译期绑追踪范围。下一篇ArkTS 进阶之道9—— Provide/Consume 跨层传值为啥不叫全局变量对应能力系列篇 15讲根因——续「ArkUI 状态哲学」阶段。能力系列回链能力系列篇本文进阶点篇 14 Prop/Link 用法Prop/Link 数据流方向绑定根因篇 13 State 基础用法上一篇State 依赖追踪机制篇 15 Provide/Consume 用法下篇预告跨层传值为啥不叫全局变量真机 demo 完整代码// 篇 57 demoProp 单向 vs Link 双向 数据流对比 // 显式 interface 声明见篇 51 装对象字量约束 interface ICounterObj { count: number } // ✅ Prop 单向父传子子改不影响父 Component struct PropChild { Prop value: number // Prop 单向接父值子改不影响父 build() { Column({ space: 8 }) { Text(Prop 子接收 ${this.value}).fontSize(14).fontColor(#2563eb) Button(子改 Prop只改自己不影响父) .width(92%).height(40).fontSize(12) .onClick(() { this.value this.value 100 // 子改 Prop 只刷自己 UI父不变 }) } .alignItems(HorizontalAlign.Center) } } // ✅ Link 双向父子互改同步 Component struct LinkChild { Link synced: number // Link 双向同步子改父也变 build() { Column({ space: 8 }) { Text(Link 子同步 ${this.synced}).fontSize(14).fontColor(#dc2626) Button(子改 Link父子同步变) .width(92%).height(40).fontSize(12) .onClick(() { this.synced this.synced 100 // 子改 Link 父也变双向同步 }) } .alignItems(HorizontalAlign.Center) } } Entry Component struct Index { // 父组件 State State propValue: number 1 // 父管 Prop 的源 State linkValue: number 1 // 父管 Link 的源 State log: string (未操作) build() { Column({ space: 12 }) { Text(篇 57 配图Prop 单向 vs Link 双向 数据流) .fontSize(18).fontWeight(FontWeight.Bold).margin({ top: 20, bottom: 8 }) Text(Prop 子改不影响父 vs Link 父子同步变对比证据) .fontSize(12).fontColor(#888).margin({ bottom: 16 }) Column({ space: 6 }) { Text(父 State propValue ${this.propValue}).fontSize(15).fontWeight(FontWeight.Bold) Text(父 State linkValue ${this.linkValue}).fontSize(15).fontWeight(FontWeight.Bold) Text(日志${this.log}).fontSize(12).fontColor(#333).margin({ top: 4 }) } .width(92%).padding(12).backgroundColor(#f5f5f5).borderRadius(8) // 父传子Prop 单向 Link 双向 PropChild({ value: this.propValue }) LinkChild({ synced: this.linkValue }) Button(父改 State propValue单向传子) .width(92%).height(44).fontSize(14) .onClick(() { this.propValue // 父改 State单向传 Prop 子刷新 this.log 父改 propValue${this.propValue}单向传子刷子改不影响父 }) Button(父改 State linkValue双向同步子) .width(92%).height(44).fontSize(14) .onClick(() { this.linkValue // 父改 State双向同步 Link 子也变 this.log 父改 linkValue${this.linkValue}双向同步子也变 }) } .width(100%).height(100%).alignItems(HorizontalAlign.Center) } }写鸿蒙 ArkUI 记住Prop 单向绑「父变子变子变父不变」一个方向追踪Link 双向绑「父子互变同步」两个方向追踪。根因不是单向双向语法区别是编译期绑的数据流追踪范围——Prop 绑一个方向父变通知子Link 绑两个方向父变通知子 子变通知父。Prop 单向传值子只读不改父首选Link 双向同步父子互改共享状态要双向协作Prop Link 混用按字段职责分离单向双向。不用手写 setter 回调装饰器绑方向是 ArkUI 状态哲学核心

相关新闻

Flutter+OpenHarmony实现高性能分布式步骤条

Flutter+OpenHarmony实现高性能分布式步骤条

1. 项目背景与核心价值订单确认流程作为电商类应用的核心交互环节,其用户体验直接影响转化率。传统Web式步骤条在移动端常面临性能卡顿、动效生硬、状态管理混乱等问题。我们基于OpenHarmony与Flutter的跨平台方案,实现了帧率稳定在60fps的丝滑步骤条组件…

2026/7/29 1:52:13阅读更多 →
Unity字体优化:基于TextMeshPro的自动化字符集扫描与精简方案

Unity字体优化:基于TextMeshPro的自动化字符集扫描与精简方案

1. 项目概述与核心价值在Unity项目开发的后期,尤其是涉及到多语言本地化、UI优化或者性能排查时,我们经常会遇到一个棘手的问题:项目中究竟使用了哪些字体,以及这些字体具体包含了哪些字符?这个问题看似简单&#xff0…

2026/7/29 1:52:13阅读更多 →
167、NPU的编译器开发:条件执行与分支处理

167、NPU的编译器开发:条件执行与分支处理

NPU的编译器开发:条件执行与分支处理 上周五晚上十一点,我在调试一个客户反馈的模型推理异常——一个简单的if-else分支,在ARM CPU上跑得好好的,迁移到NPU后输出全乱。盯着反汇编出来的NPU指令流看了两个小时,发现编译器把条件分支优化成了两条并行路径,但两条路径的中间…

2026/7/29 1:50:13阅读更多 →
大模型应用开发实战:从提示词工程到企业级部署全流程

大模型应用开发实战:从提示词工程到企业级部署全流程

这次我们来看一套完整的大模型应用开发实战教程,重点不是讲概念,而是从提示词工程到企业级落地的全流程实操。这套教程特别适合想要快速上手大模型应用开发的工程师和产品经理,内容覆盖了从基础提示词编写到复杂系统集成的关键技术点。教程的…

2026/7/29 3:10:27阅读更多 →
Unity主程进阶:2个月系统构建架构、性能与工程化核心能力

Unity主程进阶:2个月系统构建架构、性能与工程化核心能力

1. 项目概述:为什么主程需要一份专属的进阶大纲?在游戏行业摸爬滚打这些年,我见过太多技术扎实的开发者卡在“高级工程师”到“主程”这个关键跃升点上。他们能熟练地实现功能,能解决大部分技术难题,但一旦被问到“这个…

2026/7/29 3:10:27阅读更多 →
STM32烧录方式全解析:从ISP、ICP到SWD/JTAG,新手到量产必备指南

STM32烧录方式全解析:从ISP、ICP到SWD/JTAG,新手到量产必备指南

1. 项目概述:为什么需要了解STM32的烧录方式? 如果你刚开始接触STM32,或者已经用它做过几个项目,大概率都遇到过这样的场景:代码写好了,编译也通过了,但就是没法让芯片“动”起来。这时候&#…

2026/7/29 3:10:27阅读更多 →
从零构建数字时钟:硬件探索与74系列芯片实践指南

从零构建数字时钟:硬件探索与74系列芯片实践指南

1. 项目概述:从零到一,打造一个会“思考”的时钟几年前,我第一次尝试自己动手做一个数字钟,动机很简单:市面上那些成品要么太丑,要么功能太单一,要么就是价格不菲。更重要的是,作为一…

2026/7/29 3:10:27阅读更多 →
西门子PLC工程实例精讲:从300套源码到标准化编程实战

西门子PLC工程实例精讲:从300套源码到标准化编程实战

1. 项目概述:一份来自现场的PLC工程源码库在工业自动化领域摸爬滚打了十几年,我见过太多工程师,尤其是刚入行的朋友,面对一个全新的项目时,常常会感到无从下手。他们不缺理论知识,也不缺编程软件&#xff0…

2026/7/29 3:10:27阅读更多 →
安卓设备串码与基带QCN文件读写:从端口开启到深度修复实战指南

安卓设备串码与基带QCN文件读写:从端口开启到深度修复实战指南

1. 项目概述:安卓底层通讯模块的“身份证”管理在安卓设备维修、二手翻新、系统深度定制乃至一些特定的开发测试场景里,经常会遇到一个核心需求:修改或恢复设备的串码(IMEI/MEID)以及处理与之紧密相关的基带QCN文件。这…

2026/7/29 3:08:27阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →