当前位置:   article > 正文

ArkTs 语法学习 ---- 装饰器_ark语言的装饰器

ark语言的装饰器

数据变量相关装饰器

@State

@State说明
装饰器参数
功能装饰的变量拥有其所属组件的状态,
可以作为其子组件单向和双向同步的数据源。
当其数值改变时,会引起相关组件的渲染刷新。
可见性私有,仅所属组件可见。不支持组件外访问,只能在组件内访问。
与父组件的同步类型不与父组件中任何类型的变量同步。
与子组件的同步类型与子组件中的@Prop装饰变量之间建立单向数据同步,与@Link、@ObjectLink装饰变量之间建立双向数据同步
变量生命周期变量生命周期与其所属自定义组件的生命周期相同。
允许装饰的变量类型Object、class、string、number、boolean、enum类型,以及这些类型的数组。
被装饰变量的初始值必须指定。
注意类型必须被指定。
不支持any,不支持简单类型和复杂类型的联合类型,不允许使用undefined和null。
建议不要装饰Date类型,应用可能会产生异常行为。
不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类型。
初始化可选,从父组件初始化或者本地初始化。如果从父组件初始化将会覆盖本地初始化。
支持父组件中常规变量初始化@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp装饰的变量,初始化子组件的@State。
用于初始化子组件@State装饰的变量支持初始化子组件的常规变量、@State、@Link、@Prop、@Provide。
@Link说明
装饰器参数
功能装饰的变量与其父组件中对应的数据源建立双向数据绑定,共享相同的值。
限制@Link装饰器不能在@Entry装饰的自定义组件中使用
可见性私有,仅所属组件可见。不支持组件外访问,只能在组件内访问。
与父组件的同步类型与父组件@State, @StorageLink和@Link 建立双向绑定。
与子组件的同步类型与子组件中的@Prop装饰变量之间建立单向数据同步,与@Link装饰变量之间建立双向数据同步
变量生命周期变量生命周期与其所属自定义组件的生命周期相同。
允许装饰的变量类型Object、class、string、number、boolean、enum类型,以及这些类型的数组。
被装饰变量的初始值禁止本地初始化。
注意类型必须被指定,且和双向绑定状态变量的类型相同。
不支持any,不支持简单类型和复杂类型的联合类型,不允许使用undefined和null。
不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类型。
初始化从父组件初始化。
支持父组件中常规变量初始化@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp装饰变量初始化子组件@Link。
用于初始化子组件可用于初始化常规变量、@State、@Link、@Prop、@Provide。

@Prop

@Prop说明
装饰器参数
功能装饰的变量可以和父组件建立单向的同步关系
可见性私有,仅所属组件可见。不支持组件外访问,只能在组件内访问。
与父组件的同步类型父组件状态变量值的修改,将同步给子组件@Prop装饰的变量,@Prop装饰的相关变量值将被覆盖。。
变量的修改不会同步到父组件的状态变量上
与子组件的同步类型与子组件中的@Prop装饰变量之间建立单向数据同步,与@Link装饰变量之间建立双向数据同步
变量生命周期变量生命周期与其所属自定义组件的生命周期相同。
允许装饰的变量类型string、number、boolean、enum类型。
被装饰变量的初始值允许本地初始化。
注意类型必须被指定。
不支持any,不允许使用undefined和null。
在父组件中,传递给@Prop装饰的值不能为undefined或者null。
@Prop和数据源类型需要相同。
初始化如果本地有初始化,则是可选的。没有的话,则必选。
支持父组件中常规变量初始化常规变量、@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp去初始化子组件中的@Prop变量。
用于初始化子组件支持去初始化子组件中的常规变量、@State、@Link、@Prop、@Provide。

@Provide

@Provide说明:@State的规则同样适用于@Provide,差异为@Provide还作为多层后代的同步源。
装饰器参数别名:常量字符串,可选。
如果指定了别名,则通过别名来绑定变量;
如果未指定别名,则通过变量名绑定变量。
功能@Provide和@Consume配合,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景,实现跨层级传递。
可见性私有,仅所属组件可见。不支持组件外访问,只能在组件内访问。
同步类型双向同步。
从@Provide变量到所有@Consume变量以及相反的方向的数据同步。双向同步的操作与@State和@Link的组合相同。
不与父组件数据同步 只和@Consume双向同步
变量生命周期变量生命周期与其所属自定义组件的生命周期相同。
允许装饰的变量类型Object、class、string、number、boolean、enum类型,以及这些类型的数组。
被装饰变量的初始值必须指定。
注意类型必须被指定。@Provide变量的@Consume变量的类型必须相同。
不允许在同一个自定义组件内,包括其子组件中声明多个同名或者同别名的@Provide装饰的变量。
不支持any,不支持简单类型和复杂类型的联合类型,不允许使用undefined和null。
不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类型。
初始化必须本地初始化
支持父组件中常规变量更新允许父组件中常规变量、@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp装饰的变量装饰变量更新绑定子组件@Provide。
用于初始化子组件可用于初始化@State、@Link、@Prop、@Provide。

@Consume

@Consume说明
装饰器参数别名:常量字符串,可选。
如果提供了别名,则必须有@Provide的变量和其有相同的别名才可以匹配成功;否则,则需要变量名相同才能匹配成功。
功能@Consume装饰的变量是在后代组件中,去“消费(绑定)”祖先节点(@Provide)提供的变量。
可见性私有,仅所属组件可见。不支持组件外访问,只能在组件内访问。
同步类型双向同步。
从@Provide变量到所有@Consume变量以及相反的方向的数据同步。双向同步的操作与@State和@Link的组合相同。
和@Provide双向同步。
变量生命周期变量生命周期与其所属自定义组件的生命周期相同。
允许装饰的变量类型Object、class、string、number、boolean、enum类型,以及这些类型的数组。
被装饰变量的初始值禁止本地初始化。
注意类型必须被指定。@Provide变量的@Consume变量的类型必须相同。
@Consume装饰的变量,在其父节点或者祖先节点上,必须有对应的属性和别名的@Provide装饰的变量。
不支持any,不支持简单类型和复杂类型的联合类型,不允许使用undefined和null。
不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类型。
初始化禁止本地初始化
支持父组件中常规变量初始化/更新禁止。通过相同的变量名和alias(别名)从@Provide初始化。
用于初始化子组件可用于初始化@State、@Link、@Prop、@Provide。

@Provide/@Consume装饰的状态变量有以下特性:

  • @Provide装饰的状态变量自动对其所有后代组件可用。
  • @Provide和@Consume之间的双向数据同步,可以在多层级的父子组件之间传递。
  • @Provide和@Consume可以通过相同的变量名或者相同的变量别名绑定,变量类型必须相同。
  • @Provide修饰的变量和@Consume修饰的变量是一对多的关系。不允许在同一个自定义组件内,包括其子组件中声明多个同名或者同别名的@Provide装饰的变量。

@Observed

@Observed/@ObjectLink说明:@ObjectLink和@Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步
装饰器参数
@Observed说明
类装饰器只能装饰Class,需要放在class的定义前,使用时需使用new创建类对象。
功能被@Observed装饰的类,可以被观察到属性的变化.
单独使用@Observed是没有任何作用的,需要搭配@ObjectLink或者@Prop使用
注意使用@Observed装饰class会改变class原始的原型链,@Observed和其他类装饰器装饰同一个class可能会带来问题。
@ObjectLink说明
同步类型不与父组件中的任何类型同步变量
允许装饰的变量类型必须为被@Observed装饰的class实例,必须指定类型。不支持简单类型,
被装饰变量的初始值禁止指定
变量生命周期变量生命周期与其所属自定义组件的生命周期相同。
初始化禁止本地初始化
特性@ObjectLink装饰变量是只读的,不能被改变。只能从数据源处改变
从父组件初始化必须指定。
初始化@ObjectLink装饰的变量必须同时满足以下场景:
类型必须是@Observed装饰的class。
初始化的数值需要是数组项,或者class的属性。
同步源的class或者数组必须是@State,@Link,@Provide,@Consume或者@ObjectLink装饰的数据。
与源对象同步同步数据源的修改
可以初始化子组件可用于初始化常规变量、@State、@Link、@Prop、@Provide

@Watch

  • @Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数。
  • @Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(===),遵循严格相等规范。当在严格相等为false的情况下,就会触发@Watch的回调。
@Watch说明
装饰器参数必填。常量字符串,字符串需要有引号。是(string) => void自定义成员函数的方法的引用。
可装饰的自定义组件变量可监听所有装饰器装饰的状态变量。不允许监听常规变量。
装饰器的顺序建议@State、@Prop、@Link等装饰器在@Watch装饰器之前。
可装饰的自定义组件变量可监听所有装饰器装饰的状态变量。不允许监听常规变量。
限制避免无限循环,建议不要在@Watch的回调方法里修改当前装饰的状态变量。
属性值更新函数会延迟组件的重新渲染,因此,回调函数应仅执行快速运算
不建议在@Watch函数中调用async await
注意在第一次初始化的时候,@Watch装饰的方法不会被调用,即认为初始化不是状态变量的改变
如果在@Watch的方法里改变了其他的状态变量,也会引起状态变更和@Watch的执行
@Watch方法在自定义组件的属性变更之后同步执行
@Component
struct TotalView {
  @Prop @Watch('onCountUpdated') count: number;
  @State total: number = 0;
  // @Watch 回调
  onCountUpdated(propName: string): void {
    this.total += this.count;
  }

  build() {
    Text(`Total: ${this.total}`)
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

$$运算符

  • $$运算符为系统内置组件提供TS变量的引用,使得TS变量和系统内置组件的内部状态保持同步。
  • 当前$$支持基础类型变量,以及@State、@Link和@Prop装饰的变量。
  • 当前$$仅支持Refresh组件的refreshing参数。
  • $$绑定的变量变化时,会触发UI的同步刷新。
// xxx.ets
@Entry
@Component
struct RefreshExample {
  @State isRefreshing: boolean = false
  @State counter: number = 0

  build() {
    Column() {
      Text('Pull Down and isRefreshing: ' + this.isRefreshing)
        .fontSize(30)
        .margin(10)

      Refresh({ refreshing: $$this.isRefreshing, offset: 120, friction: 100 }) {
        Text('Pull Down and refresh: ' + this.counter)
          .fontSize(30)
          .margin(10)
      }
      .onStateChange((refreshStatus: RefreshStatus) => {
        console.info('Refresh onStatueChange state is ' + refreshStatus)
      })
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

@LocalStorageProp

  • @LocalStorageProp装饰的变量和与LocalStorage中给定属性建立单向同步关系。
@LocalStorageProp说明
装饰器参数key:常量字符串,必填(字符串需要有引号)。
功能和LocalStorage中key对应的属性建立单向数据同步
可见性私有,仅所属组件可见。不支持组件外访问,只能在组件内访问。
变量生命周期变量生命周期与其所属自定义组件的生命周期相同。
允许装饰的变量类型Object、class、string、number、boolean、enum类型,以及这些类型的数组。
被装饰变量的初始值必须指定。如果LocalStorage实例中不存在属性,则作为初始化默认值,并存入LocalStorage中。
注意类型必须被指定,且必须和LocalStorage中对应属性相同。
不支持any,不允许使用undefined和null。
初始化禁止,@LocalStorageProp不支持从父节点初始化,只能从LocalStorage中key对应的属性初始化,如果没有对应key的话,将使用本地默认值初始化。
初始化子节点可用于初始化@State、@Link、@Prop、@Provide。
同步类型单向同步:从LocalStorage的对应属性到组件的状态变量。组件本地的修改是允许的,但是LocalStorage中给定的属性一旦发生变化,将覆盖本地的修改
  • @LocalStorageLink装饰的变量和在@Component中创建与LocalStorage中给定属性建立双向同步关系。
  • 本地修改发生,该修改会被写回LocalStorage中;
  • LocalStorage中的修改发生后,该修改会被同步到所有绑定LocalStorage对应key的属性上,包括单向(@LocalStorageProp和通过prop创建的单向绑定变量)、双向(@LocalStorageLink和通过link创建的双向绑定变量)变量。
@LocalStorageLink说明
装饰器参数key:常量字符串,必填(字符串需要有引号)。
功能和LocalStorage中key对应的属性建立双向数据同步
可见性私有,仅所属组件可见。不支持组件外访问,只能在组件内访问。
变量生命周期变量生命周期与其所属自定义组件的生命周期相同。
允许装饰的变量类型Object、class、string、number、boolean、enum类型,以及这些类型的数组。
被装饰变量的初始值必须指定。如果LocalStorage实例中不存在属性,则作为初始化默认值,并存入LocalStorage中。
注意类型必须被指定,且必须和LocalStorage中对应属性相同。
不支持any,不允许使用undefined和null。
初始化禁止,@LocalStorageProp不支持从父节点初始化,只能从LocalStorage中key对应的属性初始化,如果没有对应key的话,将使用本地默认值初始化。
初始化子节点可用于初始化@State、@Link、@Prop、@Provide。
同步类型双向同步:从LocalStorage的对应属性到自定义组件,从自定义组件到LocalStorage对应属性。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/340237
推荐阅读
相关标签
  

闽ICP备14008679号