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 状态哲学核心

相关新闻

微流控芯片键合一压就堵?激光透射焊接守住微米流道

微流控芯片键合一压就堵?激光透射焊接守住微米流道

所谓微流控芯片激光键合,就是用激光束将带有微米级流道的芯片基片与盖片熔接密封,使液体或气体在微通道内精确流动而不泄漏。这片指甲盖大小的芯片,内部刻着宽度仅50-200μm的微通道——键合时稍有不慎,流道就被熔融材料堵死&…

2026/7/29 1:51:01 阅读更多 →
工业级 RAG 系统核心架构

工业级 RAG 系统核心架构

在构建面向具体业务场景的知识库问答大脑时,文档切片(Chunking)往往决定了整体架构的智商下限。初期的误区在于,认为只需把完整的 PDF 或 Markdown 暴力灌入向量数据库即可。但在工业级应用中,精细的文本切分是不可或缺…

2026/7/29 1:51:01 阅读更多 →
HCL AppScan Standard 10.11.0特别版下载,新增AI辅助扫描

HCL AppScan Standard 10.11.0特别版下载,新增AI辅助扫描

前言 HCL AppScan Standard 是一款为安全专家与渗透测试人员设计的动态应用程序安全测试(DAST)工具。它能够通过强大的扫描引擎,自动爬取目标应用并检测漏洞,并以优先级排序的方式输出结果。每个漏洞都会附带清晰、可操作的修复建…

2026/7/29 1:51:01 阅读更多 →

最新新闻

C++组合关系:从类包含到现代软件设计实践

C++组合关系:从类包含到现代软件设计实践

1. 项目概述:从“包含”到“组合”,理解C类关系的基石在C的世界里,当你听到“类包含”这个词,第一反应可能是“一个类里包含了另一个类的对象作为成员”。这个理解没错,但它只是冰山一角。更准确地说,这指向…

2026/7/29 1:59:03 阅读更多 →
PyTorch 张量基础(一)

PyTorch 张量基础(一)

前言 本文梳理 PyTorch 入门核心知识:张量全套创建操作。读完本文你将掌握各类张量创建 API、使用场景与代码示例。 一、深度学习基础导论 1. ML(机器学习)和 DL(深度学习)的关系与区别 基础定义 ML(M…

2026/7/29 1:59:03 阅读更多 →
基于Arduino与3D打印的低成本四轴机械臂DIY全攻略

基于Arduino与3D打印的低成本四轴机械臂DIY全攻略

1. 项目缘起:当“没钱任性”遇上“动手创造”几年前,我在一个创客展上看到一台六轴工业机械臂,流畅地完成抓取、搬运、码垛,心里痒得不行。一问价格,好家伙,最基础的型号也得五位数起步,这还不算…

2026/7/29 1:59:03 阅读更多 →
PTEN缺失前列腺癌患者新选择:FDA批准Truqap卡匹色替capivasertib联合阿比特龙显著延缓疾病进展

PTEN缺失前列腺癌患者新选择:FDA批准Truqap卡匹色替capivasertib联合阿比特龙显著延缓疾病进展

一、PTEN缺失:前列腺癌进展的”加速器”与精准治疗靶点前列腺癌是男性最常见的恶性肿瘤之一,全球每年新发病例超过140万例。在中国,前列腺癌的发病率也在逐年上升,已成为男性泌尿系统最常见的恶性肿瘤。对于转移性激素敏感性前列腺…

2026/7/29 1:59:03 阅读更多 →
3分钟掌握RPG Maker MV资源解密:免费离线工具完整指南

3分钟掌握RPG Maker MV资源解密:免费离线工具完整指南

3分钟掌握RPG Maker MV资源解密:免费离线工具完整指南 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https://gitcode…

2026/7/29 1:59:03 阅读更多 →
第一台样机能跑,为什么第二台问题又回来了?

第一台样机能跑,为什么第二台问题又回来了?

机器人项目里,第一台样机调顺以后,团队很容易松一口气。动作能跑了,报警少了,任务也能走完。看起来,原来的问题已经解决。可第二台机器刚开始运行,第一台已经消失的问题又出现了。现场最容易冒出一句话&…

2026/7/29 1:58:03 阅读更多 →

日新闻

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

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

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

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻