当前位置:   article > 正文

『鸿蒙ArkTS笔记』 关于ForEach循环渲染详解_foreach ts

foreach ts

语法说明

循环渲染可使用ForEach语句基于一个数组来快速渲染一个组件列表,可以通过选项列表循环渲染UI组件。

ForEach循环渲染的语法如下

ForEach(
  arr: any[], 
  itemGenerator: (item: any, index?: number) => void,
  keyGenerator?: (item: any, index?: number) => string
)
  • 1
  • 2
  • 3
  • 4
  • 5

各参数的含义如下

arr:需要进行循环渲染的数据源,必须为数组类型,例如

@State options: string[] = ["苹果", "桃子", "香蕉", "橘子"];
  • 1

itemGenerator:组件生成函数,用于为arr数组中的每个元素创建对应的组件。该函数可接收两个参数,分别是
itemarr数组中的数据项
index(可选):arr数组中的数据项的索引
例如

(item: string) => {
        Button(item)
          .width(100)
          .backgroundColor(Color.Green)
          .onClick(() => {
            this.answer = item;
          })
      }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

keyGenerator(可选):key生成函数,用于为arr数组中的每个数据项生成唯一的key

key的作用

ForEach在数组发生变化(修改数组元素或者向数组增加或删除元素)时,需要重新渲染组件列表,在重新渲染时,它会尽量复用原来的组件对象,而不是为每个元素都重新创建组件对象。key的作用就是辅助ForEach完成组件对象的复用。 具体逻辑如下: ForEach在进行初次渲染时,会使用keyGenerator为数组中的每个元素生成一个唯一的key,并将key作为组件对象的标识。当数组发生变化导致ForEach需要重新渲染时,ForEach会再次使用keyGenerator为每个元素重新生成一遍key,然后ForEach会检查新生成的key在上次渲染时是否已经存在,若存在,ForEach就会认为这个key对应的数组元素没有发生变化,那它就会直接复用这个key所对应的组件对象;若不存在,ForEach就会认为这个key对应的元素发生了变化,或者该元素为新增元素,此时,就会为该元素重新创建一个组件对象。

开发者可以通过keyGenerator函数自定义key的生成规则。如果开发者没有定义keyGenerator函数,则系统会使用默认的key生成函数,即

(item: any, index: number) => { return index + '__' + JSON.stringify(item); }
  • 1

在某些情况下默认的key生成函数,会导致界面渲染效率低下,此时可考虑通过keyGenerator函数自定义生成逻辑,例如如下场景

状态变量数组定义如下

@State arr:string[] = ["zhangsan","lisi","wangwu"]
  • 1

ForEach语句如下

Column(){
  ForEach(this.arr,(item)=>{ Text(item) })
}
  • 1
  • 2
  • 3

初次渲染时,每个元素对应的key依次为0__"zhagnsan"1__"lisi"2__"wangwu"。若现有一个操作是向arr数组头部插入新的元素,例如新元素为wanger,按照默认的key生成逻辑,插入新元素之后每个元素的key就会依次变为0__"wanger"1__"zhagnsan"2__"lisi"3__"wangwu",也就是所有元素的key都发生了变化,因此UI界面更新时需要为每个元素都重新创建组件对象,即便原有的元素没有发生变化也无法复用之前的组件,这样一来就导致了性能浪费。此时我们就可以考虑提供第三个参数,如下

Column(){
  ForEach(this.arr, (item)=>{ Text(item) }, item => JSON.stringify(item))
}
  • 1
  • 2
  • 3

这样就可以提升渲染效率

有一点注意,要保证key的唯一性

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/700916
推荐阅读
相关标签
  

闽ICP备14008679号