HarmonyOS 鸿蒙Next状态管理合理使用开发指导

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next状态管理合理使用开发指导 请问有状态管理合理使用开发指导吗?

3 回复
  1. 使用@ObjectLink代替@Prop减少不必要的深拷贝
@Observed
class ClassA {
  public c: number = 0;

  constructor(c: number) {
    this.c = c;
  }
}

@Component
struct PropChild {
  [@ObjectLink](/user/ObjectLink) testNum: ClassA; // [@ObjectLink](/user/ObjectLink) 装饰状态变量不会深拷贝

  build() {
    Text(`PropChild testNum ${this.testNum.c}`)
  }
}

@Entry
@Component
struct Parent {
  @State testNum: ClassA[] = [new ClassA(1)];

  build() {
    Column() {
      Text(`Parent testNum ${this.testNum[0].c}`)
        .onClick(() => {
          this.testNum[0].c += 1;
        })

      // 当子组件不需要发生本地改变时,优先使用[@ObjectLink](/user/ObjectLink),因为[@Prop](/user/Prop)是会深拷贝数据,具有拷贝的性能开销,所以这个时候[@ObjectLink](/user/ObjectLink)是比@Link和[@Prop](/user/Prop)更优的选择
      PropChild({ testNum: this.testNum[0] })
    }
  }
}
  1. 不使用状态变量强行更新非状态变量关联组件
@Entry
@Component
struct CompA {
  @State realState1: Array<number> = [4, 1, 3, 2];
  @State realState2: Color = Color.Yellow;
  build() {
    Column({ space: 20 }) {
      ForEach(this.realState1,
        (item: Array<number>) => {
          Text(`${item}`)
        })
      Text("add item")
        .onClick(() => {
          // 改变realState1触发UI视图更新
          this.realState1.push(this.realState1[this.realState1.length-1] + 1);
        })
      Text("chg color")
        .onClick(() => {
          // 改变realState2触发UI视图更新
          this.realState2 = this.realState2 == Color.Yellow ? Color.Red : Color.Yellow;
        })
    }.backgroundColor(this.realState2)
    .width(200).height(500)
  }
}
  1. 精准控制状态变量关联的组件数
@Observed
class Translate {
  translateX: number = 20;
}

@Component
struct Title {
  build() {
    Row() {
      Image($r('app.media.icon'))
        .width(50)
        .height(50)
      Text("Title")
        .fontSize(20)
    }
  }
}

@Entry
@Component
struct Page1 {
  @State translateObj: Translate = new Translate();
  build() {
    Column() {
      Title()
      Stack() {
      }
      .backgroundColor("black")
      .width(200)
      .height(400)
      Button("move")
        .onClick(() => {
          animateTo({
            duration: 50
          },() => {
            this.translateObj.translateX = (this.translateObj.translateX + 50) % 150
          })
        })
    }
    .translate({ // the component in Column shares the same property translate
      x: this.translateObj.translateX
    })
  }
}

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


ui里面就行基础的状态装饰器,ui外面就用observed🤣

针对帖子标题“HarmonyOS 鸿蒙Next状态管理合理使用开发指导”的问题,以下是专业且简洁的回答:

在HarmonyOS鸿蒙系统中进行Next状态管理时,开发者需关注以下几点以合理利用资源并提升应用性能:

  1. 状态定义清晰:确保每个状态的定义清晰明确,避免状态冗余和混淆。状态应反映应用或组件的真实情况,便于后续的逻辑处理和UI渲染。

  2. 状态更新高效:状态更新时,应尽可能减少不必要的计算和DOM操作,利用鸿蒙提供的性能优化机制,如异步更新等,确保界面流畅。

  3. 状态管理框架:根据应用规模和复杂度选择合适的状态管理框架。鸿蒙系统支持多种状态管理方式,开发者需结合实际需求进行选型,以实现状态的高效管理和维护。

  4. 跨组件通信:对于跨组件的状态共享和更新,应利用鸿蒙提供的通信机制,如Intent、DataAbility等,确保数据的一致性和实时性。

  5. 错误处理:在状态管理过程中,应添加必要的错误处理逻辑,如状态异常检测、恢复机制等,以增强应用的稳定性和用户体验。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部