【ArkTS】循环控制与List的使用

news/2024/7/21 11:28:02 标签: harmonyos

ArkTS如何进行循环渲染

现有数据如下

class Item{
  name:string
  image:Resource
  price:number
  dicount:number
  constructor(name:string,image:Resource,price:number,dicount?:number) {
    this.name = name
    this.image = image
    this.price = price
    this.dicount = dicount
  }
}

private items:Array<Item> = [
  new Item('商品1',$r('app.media.phone1'),6999,500),
  new Item('商品2',$r('app.media.phone2'),10999,1000),
  new Item('商品3',$r('app.media.phone3'),999),
  new Item('商品4',$r('app.media.phone4'),1699),
  new Item('商品5',$r('app.media.phone5'),2699),
  new Item('商品6',$r('app.media.phone6'),1699,100),
  new Item('商品7',$r('app.media.phone7'),699),
  new Item('商品8',$r('app.media.phone8'),16999),
]

直接使用ForEach遍历渲染

ForEach(arr:Array,(item:any,index?:number) => {//结构},keyGenerator?:(item:any,index?:number):string => {})

分析三个参数

  1. arr

    需要遍历的数组

  2. (item:any,index?:number) => {// 结构}

    页面组件生成函数

    item默认类型为any,index为可选参数(数组角标),函数内部放结构体部分。

  3. keyGenerator?:(item:any,index?:number):string => {}

    键生成函数,为数组每一项生成一个唯一标识,组件是否重新渲染的判断标准(如果只有一项发生改变,不会重新渲染其他元素)。

ForEach(
  this.items,
  (item:Item)=>{
    Row({space:20}){
      Image(item.image).width(100)
      Column({space:4}){
        if(item.dicount && item.dicount > 0){
          Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)
          Text("原价:¥"+item.price).fontColor('#ccc').fontSize(16).decoration({type:TextDecorationType.LineThrough})
          Text("折扣价:¥"+(item.price-item.dicount)).fontColor('#f36').fontSize(18)
          Text("补贴:¥"+item.dicount).fontColor('#f36').fontSize(16)
        }else{
          Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)
          Text("¥"+item.price).fontColor('#f36').fontSize(18)
        }
      }
      .height('100%')
      .alignItems(HorizontalAlign.Start)
    }
    .width('100%')
    .height(120)
    .backgroundColor("#FFF")
    .borderRadius(20)
    .padding(10)
  }
)

问题

直接使用ForEach循环控制,如果元素内容超过视口高度,不会自动生成滚动条,如果超出部分需要滚动条,可以使用List组件。

List组件

List组件相比ForEach,如果元素遍历后元素高度超过视口高度后,会自动产生滚动条。

List(){

​ ListItem(){

​ // 结构

​ }

}

将ForEach和List组件结合使用即可

需要注意的是,使用List组件时,必须通过ListItem才能渲染结构

List(){
	ForEach(
		arr,
		(item:Item) => {
			ListItem(){
				// 结构
			}
		}
	)
}

http://www.niftyadmin.cn/n/5268660.html

相关文章

flume:Ncat: Connection refused.

一&#xff1a;nc -lk 44444 和 nc localhost 44444区别 nc -lk 44444 和 nc localhost 44444 是使用 nc 命令进行网络通信时的两种不同方式。 1. nc -lk 44444&#xff1a; - 这个命令表示在本地监听指定端口&#xff08;44444&#xff09;并接受传入的连接。 - -l 选项…

深度学习记录--矩阵维数

如何识别矩阵的维数 如下图 矩阵的行列数容易在前向和后向传播过程中弄错&#xff0c;故写这篇文章来提醒易错点 顺便起到日后查表改错的作用 本文仅作本人查询参考(摘自吴恩达深度学习笔记)

力扣LCR 130. 衣橱整理(DFS 解法)

Problem: LCR 130. 衣橱整理 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 首先该问题可以归纳为一类遍历二维矩阵的题目&#xff0c;此类中的一部分题目可以利用DFS来解决&#xff0c;具体到本题目&#xff1a; 我们可以利用一个布尔类型的二维数组记录我们已经访…

PMP项目管理 - 质量管理

系列文章目录 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. PMP项目管理 - 质量管理 系列文章目录一、规划质量管理 - 关注工作需要达到的质量二、管理…

verilog语法进阶,时钟原语

概述&#xff1a; 内容 1. 时钟缓冲 2. 输入时钟缓冲 3. ODDR2作为输出时钟缓冲 1. 输入时钟缓冲 BUFGP verilog c代码&#xff0c;clk作为触发器的边沿触发&#xff0c;会自动将clk综合成时钟信号。 module primitive1(input clk,input a,output reg y); always (posed…

【STM32】STM32学习笔记-OLED显示屏(10)

00. 目录 文章目录 00. 目录01. OLED显示屏接线图02. OLED函数库03. OLED测试代码04. Keil调试05. 程序下载06. 附录 01. OLED显示屏接线图 02. OLED函数库 oled.h #ifndef __OLED_H #define __OLED_Hvoid OLED_Init(void); void OLED_Clear(void); void OLED_ShowChar(uint8…

机器学习 高维数据可视化:t-SNE 降维算法

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Ansible如何处理play错误的?Ansible角色?

Ansible如何处理play错误的&#xff1a;Ansible审查每个任务的返回代码&#xff0c;以确定任务是否成功或失败。默认情况下&#xff0c;当一个任务失败时&#xff0c;Ansible会立即中止该主机上的其他操作&#xff0c;并跳过所有后续任务。 实际生产中&#xff0c;若希望即使任…