HarmonyOS 5.0应用开发——V2装饰器@param的使用
【高心星出品】
V2装饰器@param的使用
概念
在鸿蒙ArkTS开发中,@Param装饰器是组件间状态管理的重要工具,主要用于父子组件间的单向数据传递,这一点与V1中的@prop类似。
- @Param装饰的变量支持本地初始化,但不允许在组件内部直接修改。
- 被@Param装饰的变量能够在初始化自定义组件时从外部传入,当数据源也是状态变量时,数据源的修改会同步给@Param。
- @Param可以接受任意类型的数据源,包括普通变量、状态变量、常量、函数返回值等。
- @Param装饰的变量变化时,会刷新该变量关联的组件。
- @Param支持对基本类型(如number、boolean、string、Object、class)、内嵌类型(如Array、Set、Map、Date),以及null、undefined和联合类型进行观测。
- 对于复杂类型如类对象,@Param会接受数据源的引用。在组件内可以修改类对象中的属性,该修改会同步到数据源。
- @Param的观测能力仅限于被装饰的变量本身。详见观察变化。
使用方法
- 数据流向 单向同步(父组件 → 子组件),仅支持父组件数据源变化触发子组件更新。
- 适用条件 1
- 仅限@ComponentV2装饰的组件(API version 12+)。
- 子组件禁止直接修改@Param装饰的变量(需通过@Once或事件触发父组件修改)。
- 支持类型 基本类型(number/boolean/string等)、对象、数组、Date/Map/Set等内嵌类型,以及null/undefined和联合类型。
@Param变量装饰器 | 说明 |
---|---|
装饰器参数 | 无。 |
能否本地修改 | 否。若需要修改值,可使用@Param搭配@Once修改子组件的本地值。或通过@Event装饰器,修改@Param数据源的值。 |
同步类型 | 由父到子单向同步。 |
允许装饰的变量类型 | Object、class、string、number、boolean、enum等基本类型以及Array、Date、Map、Set等内嵌类型。支持null、undefined以及联合类型。 |
被装饰变量的初始值 | 允许本地初始化,若不在本地初始化,则需要和@Require装饰器一起使用,要求必须从外部传入初始化。 |
传递规则 | 说明 |
---|---|
从父组件初始化 | @Param装饰的变量允许本地初始化,若无本地初始化则必须从外部传入初始化。当同时存在本地初始值与外部传入值时,优先使用外部传入值进行初始化。 |
初始化子组件 | @Param装饰的变量可以初始化子组件中@Param装饰的变量。 |
同步 | @Param可以和父组件传入的状态变量数据源(即@Local或@Param装饰的变量)进行同步,当数据源发生变化时,会将修改同步给子组件的@Param。 |
案例
子组件中有一个按钮展示@param装饰的count,但是不能更新本地的count,父组件中有一个按钮展示@local装饰的count,并且与子组件的count绑定,形成单向通信效果。点击父组件按钮会更新父子两者的组件显示数据。@require配合@param会强制要求父组件初始化子组件数据。
@ComponentV2
struct child {
// 强制父组件传参
@Require @Param count:number
// 父组件可以传参也可以不传参
// @Param count: number = 10
build() {
Column() {
Button('child count: ' + this.count)
.width('60%')
.onClick(() => {
// 这里会报错,因为@param装饰的数据不能自己更新,需要让父组件更新 同步进来
// this.count+=1
})
}
.width('100%')
.padding(20)
}
}
@Entry
@ComponentV2
struct Parampage {
@Local count: number = 10;
build() {
Column({ space: 20 }) {
Button('page count: ' + this.count)
.width('60%')
.onClick(() => {
this.count += 1
})
// child count与 父组件count单向绑定
child({ count: this.count })
}
.height('100%')
.width('100%')
}
}
同步数据为数组的时候,子组件中可以修改数组元素,不能初始化整个数组,这里的修改会形成双向同步关系,下面案例里面点击两个按钮数据会同时变化。
@ComponentV2
struct child2 {
@Require @Param arr:number[]
build() {
Column() {
Button('child count: ' + this.arr[0])
.width('60%')
.onClick(() => {
// 不可以修改整个数组,但是可以修改数组元素 形成双向同步
this.arr[0]+=1
})
}
.width('100%')
.padding(20)
}
}
@Entry
@ComponentV2
struct Parampage1 {
@Local arr:number[]=[1,2,3]
build() {
Column({ space: 20 }) {
Button('page count: ' + this.arr[0])
.width('60%')
.onClick(() => {
this.arr[0]+=1
})
// child arr与 父组件arr单向绑定
child2({arr:this.arr })
}
.height('100%')
.width('100%')
}
}
如果单向同步的数据是复杂的结构info类,在子组件中@param装饰的数据可以进行修改其属性并且会同步给父组件形成局部双向通信,
在下面案例中点击子组件按钮的时候in的count值已经发生了修改,父组件中的count也会修改,只不过@param和@local没有观察到,当先点击子组件按钮再点击父组件按钮的时候就会观察到两者显示10--12--14 .
class info{
count:number
constructor(count:number) {
this.count=count
}
}
@ComponentV2
struct child2 {
@Require @Param in:info=new info(10)
build() {
Column() {
Button('child count: ' + this.in.count)
.width('60%')
.onClick(() => {
// param不允许本地修改
// this.in=new info(11)
// 允许修改对象的属性 并且会同步到父组件 形成有限制的双向同步
this.in.count+=1
})
}
.width('100%')
.padding(20)
}
}
@Entry
@ComponentV2
struct Parampage1 {
@Local in:info=new info(10)
build() {
Column({ space: 20 }) {
Button('page count: ' + this.in.count)
.width('60%')
.onClick(() => {
this.in=new info(this.in.count+1)
})
// child count与 父组件count单向绑定
child2({ in: this.in })
}
.height('100%')
.width('100%')
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
终端里跑图形应用「GitHub 热点速览」
上周,依旧是"AI Everywhere"的热闹景象,但真正刷屏与引发讨论的,还是那些把老问题拆开、把想象力落到工程实践里的开源项目。 本期上榜的 Term.Everything 把原本只能在桌面环境运行的 GUI 应用"压缩"进终端,重新定义终端(Terminal)的边界。Hyperswitch 用一套高性能网关打通多支付渠道的复杂链路。开源的 n8n 工作流宝库 n8n-workflows,收集了 2000+ 实战模板帮助加速 AI 自动化落地。官方发起的 MCP registry 则补上 MCP 生态中"发现与分发"这一关键拼图。而 GitHub 开源的 spec-kit 把"先写规范再写代码"流程化,并将模糊需求逐步转化为可评审、可测试、可追溯的高质量代码,然后一周涨了 10k Star🤯。 此外,一起看看本周 HelloGitHub 热评脱颖而出的开源项目,Windhawk 让 Windows 定制像装插件一样简单,OpenIsle 则是一个用 Java 构建的轻量级开源社区系统。 本文目录 热门开源项目 1.1 终端里运行任何 GUI 应用:Term.Everything...
-
下一篇
Forest v1.7.4 已经发布,轻量级 HTTP 客户端
Forest v1.7.4 已经发布,轻量级 HTTP 客户端 此版本更新内容包括: Forest v1.7.4 版本发布了!此次版本发布主要支持了在编程式接口中使用和修改字符串模板变量 编程式接口中的模板变量 可以在URL中使用模板变量 Forest.get("{baseURL}/test/{myPath}"); 可以在请求头中使用模板变量 Forest.post("/test") .addHeader("Content-Type", "{myContentType}") .addHeader("name", "{myName}"); 可以在字符串型请求体中使用模板变量 Forest.post("/test") .contentTypeJson() .addBody("{myBody}"); 可以在 K-V 型请求体中使用模板变量 Forest.post("/test") .contentFormUrlEncoded() .addBody("a", "{a}") .addBody("b", "{b}"); 其他可以使用模板变量的编程式接口 Forest.get("/") .host(...
相关文章
文章评论
共有0条评论来说两句吧...