HarmonyOS(四)ArkUI性能优化

2024-09-17  本文已影响0人  简单Timor

1. 布局性能优化

2.长列表加载性能优化

@Component
Struct MyComponent {
  build () {
    list() {
      //…
      LazyForEach(…)
    }.cachedCount(n/2)
  }
}
@Component
@Reusable
Export struct ArticleCardView {
  @Prop isCollected: boolean = false;
  @Prop isLiked: boolean = false;
  @Prop articleItem: LearningResource = new LearningResource();
  onCollected?: () => void;
  onLiked?: () => void;

  aboutToReuse(params) {
     this.onCollected = params.onCollected;
     this.onLiked = params.onLiked;
  }

  build() {
    ......
  }
}
@Component
export struct DiscoverView {
  private data: ArticleListData = new ArticleListData();
  ......
  build() {
    List() {
      Column() {
        LazyForEach(this.data, (item: LearningResource) => {
          ListItem() {
            Column() {
              ArticleCardView({
                articleItem: item
                ......
              })
            }
          }
          .reuseId(‘ArticleCardView')
        }, (item: LearningResource) => item.id)
      }
    }.cachedCount(3);
  }
}

状态管理

ArkUI提供了一系列装饰器实现ViewModel的能力,如@Prop@Link@ProvideLocalStorage等。当自定义组件内变量被装饰器装饰时变为状态变量,状态变量的改变会引起UI的渲染刷新。
在ArkUI的开发过程中,如果没有选择合适的装饰器或合理的控制状态更新范围,可能会导致以下问题:
1. 状态和UI的不一致,如同一状态的界面元素展示的UI不同,或UI界面展示的不是最新的状态。
2. 非必要的UI视图刷新,如只修改局部组件状态时导致组件所在页面的整体刷新。
当用户与界面产生交互行为时,状态的修改是通过事件驱动处理的。事件的处理可以在应用的任何地方,如果没有进行适当的逻辑处理管理也会导致代码冗余和不利于维护。

合理选择装饰器

组件间需要共享的状态,按照共享范围从小到大依次有三种场景:父子组件间共享状态,不同子树上组件间共享状态和不同组件树间共享状态。ArkUI提供了@State+@Prop@State+@Link@State+@Observed+@ObjectLink@Provide+@ConsumeAppStorageLocalStorage六种装饰器组合以解决不同范围内的组件间状态共享。按照共享范围能力从小到大

截屏2024-09-18 16.40.03.png

由于@State+@Prop、@State+@Link、@State+@Observed+@ObjectLink三种方案的实现方式是逐级向下传递状态, 当遇到跨层级较多的情况,@Provide+@Consume方案更为合理。

按照状态复杂度选择装饰器

image.png

结合三个方案的特性,在选择时有如下建议:
需要观察嵌套类对象的深层属性变化的场景,选择

上一篇 下一篇

猜你喜欢

热点阅读