Harmonyos状态管理8:Require装饰器使用详解
·
@Require装饰器使用详解
这是一个非常重要的概念澄清:在 HarmonyOS ArkTS 中,@Require 装饰器是专门用于“系统权限”校验的,它不能用于约束父组件必须向子组件传入某个变量。
如果希望实现“约束子组件中的某个变量必须由父组件传入值”(即 Required Props 的效果),ArkTS 中有一套特定的约定来实现这一需求。
下面我将为你展示如何通过 ArkTS 的标准语法来实现这个“必填传值”的约束。
❌ 错误示范
// 错误:@Require 是用于权限的,不能这样用
@Component
struct Child {
// 编译器会报错,因为 @Require 不接受普通的 @Prop 变量
@Require @Prop title: string;
build() {
Text(this.title)
}
}
✅ 正确做法:声明式约束 + 运行时校验
在 ArkTS 中,要使一个变量成为“必填项”,主要有两步:
- 声明层面:不给变量赋初始值,且类型不设为可选(不带
?)。 - 安全层面:在
aboutToAppear生命周期中手动校验(推荐),防止父组件漏传导致运行时崩溃。
完整代码示例
@Entry
@Component
struct Index {
@State num:number=0
build() {
Column() {
Text("点击我加一:"+this.num).onClick(()=>{this.num++}).fontSize(40).margin({ bottom:50 })
RequireChild({num:this.num})//如果不带参数,会出错
}.width('100%')
}
}
@Component
struct RequireChild{
@Require @Prop num:number=0;
build() {
Text("此子组件会同步加一:"+this.num.toString()).fontSize(50).fontColor(0xff0000)
}
}

💡 补充:关于 @BuilderParam 的 require 属性
唯一与“强制”这个词相关的特殊用法是在 @BuilderParam(自定义构建函数)中。@BuilderParam 有一个 require: true 的属性,强制父组件必须传一个函数。
@Component
struct MyButton {
// 这里使用了 require: true,强制要求父组件传入名为 builderParam 的函数
@BuilderParam require: true builderParam: () => void;
build() {
Button('点击触发')
.onClick(() => {
this.builderParam(); // 如果父组件没传,这里会直接编译不通过或运行报错
})
}
}
总结
| 需求 | 使用方法 | 关键点 |
|---|---|---|
| 约束普通变量必传 | 无专用装饰器 | 1. 定义变量时不给初始值 2. 类型为非可选 (如 string)3. 建议在 aboutToAppear 中校验 |
| 系统权限校验 | @Require | 仅用于权限控制,如 @Require(PermissionLevel.SYSTEM_BASIC, ...) |
| 约束构建函数必传 | @BuilderParam | 使用语法 @BuilderParam require: true |
所以,如果你只是想约束数据传参,请参考上面的 ✅ 正确做法,不要使用 @Require。
更多推荐



所有评论(0)