reduce-view-nesting-levels.md 1.8 KB
Newer Older
S
s30044643 已提交
1 2 3 4 5 6 7 8
# 减少视图嵌套层次

视图的嵌套层次会影响应用的性能。在屏幕刷新率为120Hz的设备上,每8.3ms刷新一帧,如果视图的嵌套层次多,可能会导致没法在8.3ms内完成一次屏幕刷新,就会造成丢帧卡顿,影响用户体验。因此推荐开发者移除多余的嵌套层次,缩短组件刷新耗时。

## 移除多余的嵌套层次

反例:使用了Grid来实现一个网格,但是在外层套了3层stack容器,导致组件刷新和渲染耗时长。

S
sqsyqqy 已提交
9
```typescript
S
s30044643 已提交
10 11
@Entry
@Component
S
sqsyqqy 已提交
12 13
struct AspectRatioExample12 {
  @State children: Number[] = Array.from(Array<number>(900), (v, k) => k);
S
s30044643 已提交
14 15 16 17

  build() {
    Scroll() {
      Grid() {
S
sqsyqqy 已提交
18
        ForEach(this.children, (item:Number[]) => {
S
s30044643 已提交
19 20 21 22 23 24 25 26 27
          GridItem() {
            Stack() {
              Stack() {
                Stack() {
                  Text(item.toString())
                }
              }
            }
          }
S
sqsyqqy 已提交
28
        }, (item:string) => item)
S
s30044643 已提交
29 30 31 32 33 34 35 36 37 38 39 40
      }
      .columnsTemplate('1fr 1fr 1fr 1fr')
      .columnsGap(0)
      .rowsGap(0)
      .size({ width: "100%", height: "100%" })
    }
  }
}
```

建议:通过减少冗余的Stack容器嵌套,每个GridItem的组件数比上面少了3个,缩短了组件刷新与渲染耗时。

S
sqsyqqy 已提交
41
```typescript
S
s30044643 已提交
42 43
@Entry
@Component
S
sqsyqqy 已提交
44
struct AspectRatioExample11 {
S
s30044643 已提交
45 46 47 48 49
  @State children: Number[] = Array.from(Array(900), (v, k) => k);

  build() {
    Scroll() {
      Grid() {
S
sqsyqqy 已提交
50
        ForEach(this.children, (item:Number[]) => {
S
s30044643 已提交
51 52 53
          GridItem() {
            Text(item.toString())
          }
S
sqsyqqy 已提交
54
        }, (item:string) => item)
S
s30044643 已提交
55 56 57 58 59 60 61 62 63
      }
      .columnsTemplate('1fr 1fr 1fr 1fr')
      .columnsGap(0)
      .rowsGap(0)
      .size({ width: "100%", height: "100%" })
    }
  }
}
```