HarmonyOS 6.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. 数据流向
    单向同步(父组件 → 子组件),仅支持父组件数据源变化触发子组件更新。
  2. 适用条件 1
    • 仅限@ComponentV2装饰的组件(API version 12+)。
    • 子组件禁止直接修改@Param装饰的变量(需通过@Once或事件触发父组件修改)。
  3. 支持类型
    基本类型(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会强制要求父组件初始化子组件数据。

typescript 复制代码
@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%')
  }
}

同步数据为数组的时候,子组件中可以修改数组元素,不能初始化整个数组,这里的修改会形成双向同步关系,下面案例里面点击两个按钮数据会同时变化。

typescript 复制代码
@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 .

typescript 复制代码
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%')
  }
}
相关推荐
高心星2 天前
鸿蒙6.0应用开发——网络状态管理
网络·华为·网络状态·鸿蒙6.0·harmonyos6.0·网络重连
高心星2 天前
鸿蒙6.0应用开发——Preferences数据存储
华为·preferences·首选项·鸿蒙6.0·harmonyos6.0·用户首选项
高心星3 天前
鸿蒙6.0应用开发——实况窗开发
华为·通知·鸿蒙6.0·harmonyos6.0·实况窗
梦想不只是梦与想4 天前
Python 中的装饰器
python·装饰器
高心星7 天前
鸿蒙6.0应用开发——应用内存占用优化
性能优化·生命周期·内存优化·图片处理·鸿蒙6.0·harmonyos6.0
高心星12 天前
鸿蒙6.0应用开发——访问应用文件
华为·文件读写·fs·鸿蒙6.0·harmonyos6.0·应用文件·fileio
高心星14 天前
鸿蒙6.0应用开发——Web组件的生命周期
html·web组件·arkweb·鸿蒙6.0·harmonyos6.0
高心星2 个月前
鸿蒙6.0应用开发——页面专场实践案例
华为·页面跳转·鸿蒙6.0·harmonyos6.0·页面专场·专场动画
高心星2 个月前
鸿蒙6.0应用开发——一镜到底动画实践案例
动画·鸿蒙6.0·harmonyos6.0·转场动画·一镜到底动画
海市公约2 个月前
Python三大高阶特性详解:装饰器、生成器与上下文管理器
装饰器·生成器·yield·高阶函数·python进阶·with语句·上下文管理器