@Require装饰器使用详解

这是一个非常重要的概念澄清:在 HarmonyOS ArkTS 中,@Require 装饰器是专门用于“系统权限”校验的,它不能用于约束父组件必须向子组件传入某个变量。

如果希望实现“约束子组件中的某个变量必须由父组件传入值”(即 Required Props 的效果),ArkTS 中有一套特定的约定来实现这一需求。

下面我将为你展示如何通过 ArkTS 的标准语法来实现这个“必填传值”的约束。

❌ 错误示范

// 错误:@Require 是用于权限的,不能这样用
@Component
struct Child {
  // 编译器会报错,因为 @Require 不接受普通的 @Prop 变量
  @Require @Prop title: string; 

  build() {
    Text(this.title)
  }
}

✅ 正确做法:声明式约束 + 运行时校验

在 ArkTS 中,要使一个变量成为“必填项”,主要有两步:

  1. 声明层面:不给变量赋初始值,且类型不设为可选(不带 ?)。
  2. 安全层面:在 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)
  }
}

在这里插入图片描述

💡 补充:关于 @BuilderParamrequire 属性

唯一与“强制”这个词相关的特殊用法是在 @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

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐