ArkTs中使用ForEach循环渲染

文章概叙

本文主要使用一个简单的例子介绍一下ArkTs中是如何进行循环渲染的。以及对ForEach接口的用法做出介绍

列表循环

无论是在哪一端进行开发,循环渲染永远是一个避不开的话题。尤其是在现在的主流框架中,基本都存在if判断是否显示,for循环渲染的接口,在ArkTs中自然也存在,ArkTS是使用ForEach接口循环渲染的。

ForEach接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如,ListItem组件要求ForEach的父容器组件必须为List组件。

介绍起来有点麻烦,正好结合在我们的tab中,将其整合起来,介绍下如何使用forEach来循环渲染。

介绍情况

之前的例子中,我们是分两次来实现TabContent的,代码如下

javascript 复制代码
  TabContent() {
    Text(`这个是${this.tabList[0].name}`)
  }
  .tabBar(this.TabBuilder(
    this.tabList[0].name,
    0,
    this.tabList[0].selected_icon,
    this.tabList[0].unselected_icon)
  )
  .backgroundColor("#ccc")

自然可以发现两次代码的重复率很高,唯一的区别就是下标、文字、icon的区别。

且两组数据都是从同一个tabList的数组中拿出来的,所以这儿的情况就很适合使用forEach接口了。

开始代码

javascript 复制代码
ForEach(
  arr: Array,
  itemGenerator: (item: any, index?: number) => void,
  keyGenerator?: (item: any, index?: number): string => string
)

以上是官网中对forEach接口的参数示例,其中

  • arr

数据源,为Array类型的数组。为必需参数

  • itemGenerator

组件生成函数。为必需参数,也就是我们生成页面的地方

  • keyGenerator

键值生成函数,非必须,也就是我们的唯一标识。

在ForEach循环渲染过程中,系统会为每个数组元素生成一个唯一且持久的键值,用于标识对应的组件。当这个键值变化时,ArkUI框架将视为该数组元素已被替换或修改,并会基于新的键值创建一个新的组件。

键值的重要性在于,当我们的列表数据更新,我们要重新做一次循环渲染的时候,如果键值没有发生变化,则ArkUI不会对其进行更新.

结合到我们的项目中,既我们要对tabContent进行forEach循环渲染,所以我们的代码需要这么改动

javascript 复制代码
Tabs({ barPosition: BarPosition.End }) {
  ForEach(this.tabList, (item: any, index: number) => {
    TabContent() {
      Text(`这个是${item.name}`)
    }
    .tabBar(
      this.TabBuilder(
        item.name,
        index,
        item.selected_icon,
        item.unselected_icon)
    )
    .backgroundColor("#ccc")
  })
}

在第三行中,我们抛出来的组件是TabContent,这是因为我们的Tabs中需要使用到TabContent组件,所以就解释了刚刚后半句的

需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件 ok,更新后的整个代码如下

javascript 复制代码
@Entry
@Component
struct Index {
  @State currentIndex: number = 0;
  tabList: {
    name: string,
    unselected_icon: Resource,
    selected_icon: Resource
  }[] =
    [
      { name: "发现", unselected_icon: $r("app.media.found_unselect"), selected_icon: $r("app.media.found_select"), },
      { name: "我的", unselected_icon: $r("app.media.mine_unselect"), selected_icon: $r("app.media.mine_select") }
    ]
​
  @Builder
  TabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {
    Column() {
      Image(this.currentIndex === targetIndex ? selectedImg : normalImg)
        .size({ width: 25, height: 25 })
      Text(title)
        .margin({ top: 5 })
        .fontSize(16)
        .fontColor(this.currentIndex === targetIndex ? '#FFAA00' : '#3A9B78')
    }
    .width('100%')
    .height(50)
    .justifyContent(FlexAlign.Center)
  }
​
  build() {
    Tabs({ barPosition: BarPosition.End }) {
      ForEach(this.tabList, (item: any, index: number) => {
        TabContent() {
          Text(`这个是${item.name}`)
        }.tabBar(this.TabBuilder(item.name, index, item.selected_icon, item.unselected_icon)).backgroundColor("#ccc")
      })
    }.width("100%").height("100%").onChange((index) => {
      this.currentIndex = index
    })
  }
}
​

ForEach的使用并不复杂,只要知道哪个参数对应的是啥就可以了,一般我们是不需要去设置key的生成的,直接使用默认的方式,会将所有的字段都串联起来,生成一个唯一标识。

个人公众号

呜呜呜,大佬们好,我又来求关注了,公众号求大佬们关注,谢谢

公众号文章链接

相关推荐
HwJack203 小时前
【共创稿事节】HarmonyOS 7空间应用的可用性测试和体验评估小方法分享
华为·harmonyos·可用性测试
m0_738185823 小时前
Flutter 鸿蒙化实战:flutter_scankit 适配 OpenHarmony,华为 ScanKit 扫码
flutter·华为·harmonyos·鸿蒙
用户117910488335 小时前
别让AI随便启动你的LSP:hmharness给语言服务器加SHA256门禁 GitHub:swsgbl/hmharness
ai编程·harmonyos
李游Leo8 小时前
HarmonyOS 7 + Share Kit-Window Kit:精准碰一碰屏幕坐标的窗口换算与落点拒绝【鸿蒙心迹】
华为·harmonyos
翼辉cto8 小时前
Compose Multiplatform KV 存储库 multiplatform-settings 的 OpenHarmony 鸿蒙化适配实战
华为·harmonyos
事圆则缓10 小时前
Flutter 开发鸿蒙实战:从 OpenHarmony 适配版到 HAP 构建与插件接入
flutter·华为·harmonyos
传奇开心果编程10 小时前
【ArkUI进阶练中学】第9课:分布式能力与多设备协同
学习·ui·华为·harmonyos
李游Leo10 小时前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 输入帧内参与位姿的版本一致性门禁【鸿蒙心迹】
c++·3d·harmonyos
tsqtsqtsq030910 小时前
Account Kit 华为账号服务介绍
华为·harmonyos
EatFan11 小时前
Flutter 鸿蒙适配实践 2026:从环境搭建、混合渲染到 OpenTelemetry 性能基建
flutter·华为·harmonyos·openharmony·opentelemetry·鸿蒙适配·impeller