HarmonyOS鸿蒙Next中合理的状态管理

HarmonyOS鸿蒙Next中合理的状态管理 一、减少不必要的深拷贝

在开发中如何需要父子组件进行值的传递,在不改变子组件中变量值的情况下使用@Prop状态变量会导致组件创建的耗时增加。

例如:

片段一

@Entry
@Component
struct Index {
  @State student: Student = new Student("张三", 20)
  build() {
    Column() {
      Text(`${this.student.name} :${this.student.age}`)
        .onClick(() => {
          this.student.age++
        })
      //子组件
      ChildComponent({ student: this.student })
    }
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .width('100%')
  }
}

//子组件
@Component
struct ChildComponent {
  [@Prop](/user/Prop) student: Student
  build() {
    Text(`${this.student.name} :${this.student.age}`)
      .margin({top:20})
  }
}
class Student {
  name: string = ""
  age: number = 0
  constructor(name: string, age: number) {
    this.age = age
    this.name = name
  }
}

片段二

@Entry
@Component
struct Index {
  @State student: Student = new Student("张三", 20)
  build() {
    Column() {
      Text(`${this.student.name} :${this.student.age}`)
        .onClick(() => {
          this.student.age++
        })
      //子组件
      ChildComponent({ student: this.student })
    }
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .width('100%')
  }
}

//子组件
@Component
struct ChildComponent {
  [@ObjectLink](/user/ObjectLink) student: Student
  build() {
    Text(`${this.student.name} :${this.student.age}`)
      .margin({top:20})
  }
}
@Observed
class Student {
  name: string = ""
  age: number = 0
  constructor(name: string, age: number) {
    this.age = age
    this.name = name
  }
}

片段一和片段二区别是子组件中的变量student是由@Porp修饰还是由@ObjectLink修饰,实现效果是一样的,但是@Porp会导致装饰状态变量深拷贝,所以这种情况使用@ObjectLink是最优的选择。

二、控制状态变量的组件数

最好让每个状态变量关联的组件数量控制在 20 个以内。要是能精准把控状态变量关联的组件数,就可以减少那些没必要进行刷新的组件,进而提升组件的刷新效率。常常会出现这样的情况,开发者把同一个状态变量和多个同级组件的属性绑定在一起,一旦这个状态变量发生变化,那些组件就都会跟着做出同样的改变,而这在有些时候会导致组件出现不必要的刷新情况。要是组件比较复杂的话,还会对整体性能产生很大的影响呢。不过要是把这个状态变量绑定到这些同级组件的父组件上,需要刷新的组件数量就能减少了,刷新性能也就随之提高了。

三、控制复杂对象作为状态变量时的关联组件数

在将一个复杂对象定义为状态变量时,对其关联的组件数进行合理控制是十分必要的。由于存在这样一种情况,即当该复杂对象中的某一成员属性发生变化时,不管与之关联的组件是否直接使用了这一发生改变的属性,都会致使这些组件全部进行刷新。而这种 “冗余刷新” 现象往往会对性能产生负面影响,鉴于此,建议通过合理拆分该复杂对象的方式,来有效控制对象关联的组件数量,进而规避因 “冗余刷新” 带来的性能问题。

四、避免在for、while等循环逻辑中频繁读取状态变量

反例

@Entry
@Component
struct Index {
  @State message: string = "Hello World"
  build() {
    Column() {
      Button().onClick(() => {
        for (let i = 0; i < 10; i++) {
          console.log(this.message)
        }
      })
    }
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .width('100%')
  }
}

正例

@Entry
@Component
struct Index {
  @State message: string = "Hello World"
  build() {
    Column() {
      Button().onClick(() => {
        let msg = this.message
        for (let i = 0; i < 10; i++) {
          console.log(msg)
        }
      })
    }
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .width('100%')
  }
}

更多关于HarmonyOS鸿蒙Next中合理的状态管理的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,合理的状态管理主要通过@State@Prop@Link@Provide@Consume等装饰器来实现。@State用于组件内部状态管理,@Prop用于父组件向子组件传递状态,@Link用于父子组件双向绑定。@Provide@Consume用于跨组件层级的状态共享。这些装饰器帮助开发者更高效地管理组件状态,确保UI与数据同步。

更多关于HarmonyOS鸿蒙Next中合理的状态管理的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,合理的状态管理应遵循以下原则:

  1. 单一数据源:确保应用的状态集中管理,避免状态分散。
  2. 不可变性:通过创建新的状态对象来更新状态,而非直接修改现有状态。
  3. 响应式更新:使用@State@Link等装饰器,确保UI随状态变化自动更新。
  4. 组件化:将状态管理与UI组件分离,提升代码可维护性。
  5. 性能优化:避免不必要的状态更新,使用@Watch监听关键状态变化。

通过这些原则,可以构建高效、可维护的HarmonyOS应用。

回到顶部