ArkUI 状态管理

@State

在声明式UI中,是以状态驱动视图更新,核心概念就是状态和视图。

在这里插入图片描述

状态(state):指驱动视图更新的数据(一个变量,加上@State装饰器,它就变成了状态变量)

视图(View):基于UI描述渲染的到用户界面

说明:

  • @State装饰器标记的变量必须初始化,不能为空值
  • @State支持Object, class, string, number, boolean, enum类型以及这些类型的数组
  • 嵌套类型以及数组中的对象属性无法触发视图更新

@Prop和@Link

当父子组件之间需要数据同步时,可以使用@Prop和@Link装饰器。

在这里插入图片描述

示例代码:

@Entry
@Component
struct Parent{
  @State name: string = 'zhangsan'
  @State age: number = 20
  
  build() {
    Column(){
      Child({name: this.name, age: $age})
    }
  }
}

@Component
struct Child{
  @Prop name: string
  @Link age: number
  
  build() {
    Column({space: 10}){
      Text('name:' + this.name)
      Text('age:' + this.age)
      Button('点击')
        .onClick(() => {
          this.age ++
        })
    }
  }
}

@Provide和@Consume

@Provide和@Consume可以跨组件提供类似于@State和@Link的双向同步。

不需要手动传递参数,由组件内部来维护,对资源的消耗会大一些,不需要跨组件传参的情况,尽量不使用。

示例代码:

@Entry
@Component
struct Parent{
  @Provide age: number = 20
  
  build() {
    Column(){
      Text('父组件 age:' + this.age)
      Child()
    }
  }
}

@Component
struct Child{
  @Consume age: number
  
  build() {
    Column({space: 10}){
      Text('子组件 age:' + this.age)
      Button('点击')
        .onClick(() => {
          this.age ++
        })
    }
  }
}

@Observed和@ObjectLink

@Observed和@ObjectLink装饰器用于在涉及嵌套对象或数组元素为对象的场景中进行双向数据同步。

示例代码:

@Observed
class Person {
  name: string
  age: number
  gf: Person // 女朋友

  constructor(name: string, age: number, gf?: Person) {
    this.name = name
    this.age = age
    this.gf = gf
  }
}

@Entry
@Component
struct Parent {
  @State person: Person = new Person('Jack', 21, new Person('Rose', 18))
  @State gfs: Person[] = [
    new Person('萝丝', 18), new Person('露西', 19)
  ]

  build() {
    Row() {
      Column() {
        Text('-------女友对象------')
        Child({person: this.person.gf})
          .onClick(() => this.person.gf.age ++)
        Text('-------女友列表------')
        ForEach(
          this.gfs,
          item => {
            Child({person: item}).onClick(() => item.age ++)
          }
        )
      }
    }
  }
}

@Component
struct Child {
  @ObjectLink person: Person

  build() {
    Column({ space: 10 }) {
      Text(`${this.person.name} : ${this.person.age}`)
    }
  }
}
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值