当前位置: 首页 > article >正文

鸿蒙NEXT开发-界面渲染(条件和循环)(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下

如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识

专栏地址: https://blog.csdn.net/qq_56760790/category_12794123.html

目录

1. 渲染-条件渲染

1.1 基本介绍

1.2 使用if/else(创建销毁元素)

1.3 visibility属性控制

2. 渲染-循环渲染

2.1 基本介绍

2.2 首次渲染

2.3 非首次渲染

3. 学习地址


1. 渲染-条件渲染

1.1 基本介绍

在ArkTS中 我们要根据某个状态来控制元素或者组件的显示隐藏 可以采用条件渲染

1.2 使用if/else(创建销毁元素)

代码示例

@Entry
  @Component
  struct Index {

    @State isShow:boolean=true
    build() {
      Column() {
        Button('显示/隐藏')
          .width(100)
          .height(30)
          .onClick(()=>{
            if(this.isShow){
              this.isShow=false
            }else{
              this.isShow=true
            }
          })
        if(this.isShow){
          Text('我是东林').width(200).height(200).fontSize(40)
        }
      }.width('100%')
        .height('100%')
    }
  }

1.3 visibility属性控制

visibility属性有以下三种:

1、Visible 显示

2、Hidden 隐藏

3、None 隐藏,但是不占位置

代码示例

@Entry
  @Component
  struct Index {

    @State isShow:boolean=true
    build() {
      Column() {
        Button('显示/隐藏')
          .width(100)
          .height(30)
          .onClick(()=>{
            if(this.isShow){
              this.isShow=false
            }else{
              this.isShow=true
            }
          })
        Text('我是东林').width(200).height(200).fontSize(40)
          .backgroundColor(Color.Green)
          .visibility(this.isShow?Visibility.Visible:Visibility.Hidden)

        Text('小头').width(200).height(200).fontSize(40)
          .backgroundColor(Color.Yellow)
      }.width('100%')
        .height('100%')
    }
  }

2. 渲染-循环渲染

2.1 基本介绍

循环渲染使用 ForEach方法来进行

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

官方参考文档

文档中心

语法结构

ForEach(
  // 数据源
  arr: Array,
  // 组件生成函数
  itemGenerator: (item: 单项, index?: number) => void,
    // 键值生成函数
    keyGenerator?: (item: 单项, index?: number): string => string
                 )

代码示例

import FruitModel from '../model/FruitModel';

@Entry
  @Component
  struct Index {
    @State fruits: FruitModel[]=[new FruitModel('1','苹果','100')
                                 ,new FruitModel('2','香蕉','90'),
                                 new FruitModel('3','西瓜','200')];

    build() {
      Row() {
        Column() {
          ForEach(this.fruits, (item: FruitModel) => {
            Text(`${item.id}:${item.name}:${item.vote}`)
              .width(200)
              .height(200)
          }, (item: FruitModel) => item.id)
        }
        .width('100%')
          .height('100%')
      }
      .height('100%')
    }
  }

2.2 首次渲染

在ForEach首次渲染时,会根据前述键值生成规则为数据源的每个数组项生成唯一键值,并创建相应的组件。

@Entry
@Component
struct Index {
  @State simpleList: Array<string> = ['苹果', '香蕉', '西瓜'];

  build() {
    Row() {
      Column() {
        ForEach(this.simpleList, (item: string) => {
          ChildItem({ item: item })
        }, (item: string) => item)
      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
  }
}

@Component
struct ChildItem {
  @Prop item: string;

  build() {
    Text(this.item)
      .fontSize(50)
  }
}

在上述代码中,键值生成规则是keyGenerator函数的返回值item。在ForEach渲染循环时,为数据源数组项依次生成键值苹果、香蕉和西瓜,并创建对应的ChildItem组件渲染到界面上。

当不同数组项按照键值生成规则生成的键值相同时,框架的行为是未定义的。例如,在以下代码中,ForEach渲染相同的数据项香蕉时,只创建了一个ChildItem组件,而没有创建多个具有相同键值的组件。

@Entry
  @Component
  struct Index {
    @State simpleList: Array<string> = ['苹果', '香蕉', '香蕉','西瓜'];

    build() {
      Row() {
        Column() {
          ForEach(this.simpleList, (item: string) => {
            ChildItem({ item: item })
          }, (item: string) => item)
        }
        .width('100%')
          .height('100%')
      }
      .height('100%')
    }
  }

@Component
  struct ChildItem {
    @Prop item: string;

    build() {
      Text(this.item)
        .fontSize(50)
    }
  }

在该示例中,最终键值生成规则为item。当ForEach遍历数据源simpleList,遍历到索引为1的香蕉时,按照最终键值生成规则生成键值为香蕉的组件并进行标记。当遍历到索引为2的香蕉时,按照最终键值生成规则当前项的键值也为香蕉,此时不再创建新的组件。

2.3 非首次渲染

在ForEach组件进行非首次渲染时,它会检查新生成的键值是否在上次渲染中已经存在。如果键值不存在,则会创建一个新的组件;如果键值存在,则不会创建新的组件,而是直接渲染该键值所对应的组件。例如,在以下的代码示例中,通过点击事件修改了数组的第三项值为"西瓜test",这将触发ForEach组件进行非首次渲染。

@Entry
  @Component
  struct Index {
    @State simpleList: Array<string> = ['苹果', '香蕉','西瓜'];

    build() {
      Row() {
        Column() {
          Text('点击修改第3个数组项的值')
            .fontSize(24)
            .fontColor(Color.Red)
            .onClick(() => {
              this.simpleList[2] = '西瓜test';
            })

          ForEach(this.simpleList, (item: string) => {
            ChildItem({ item: item })
          }, (item: string) => item)
        }
        .width('100%')
          .height('100%')
      }
      .height('100%')
    }
  }

@Component
  struct ChildItem {
    @Prop item: string;

    build() {
      Text(this.item)
        .fontSize(50)
    }
  }

3. 学习地址

全网首发鸿蒙NEXT星河版零基础入门到实战,2024年最新版,企业级开发!视频陆续更新中!_哔哩哔哩_bilibili


http://www.kler.cn/news/327911.html

相关文章:

  • Chromium 用户数据目录User Data 初始化过程c++
  • Apache POI快速入门
  • leetcode刷题day31|贪心算法Part05重叠区间问题(56. 合并区间、738.单调递增的数字、968.监控二叉树)
  • Unity NetCode 客户端连接不上服务器,局域网模式 Failed to connect to server.
  • 【微信小程序开发】入门Day2 —— 从视图逻辑到配置请求全方位解析
  • 遍历递归数结构,修改里的disabled值
  • 【JVM】基础篇
  • 2024ICPC网络赛2记录:CK
  • 企业数字化转型指南:基于TOGAF框架的系统化战略解读
  • Junit 5 - 理解Mockito,提高UT 覆盖率
  • 景联文科技精准数据标注:优化智能标注平台,打造智能未来
  • LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大
  • 【Redis技术进阶之路】「原理分析系列开篇」探索事件驱动枚型与数据特久化原理实现(数据持久化的实现AOF)
  • linux远程桌面:xrdp 安装失败
  • Android 长按文本弹出输入框
  • 《野蛮时代》数据分析项目实战——报告
  • 基于muduo库实现protobuf协议的通信详解
  • 叶绿素透射反射率与波长
  • pr2024安装包及新手入门讲解
  • Qt::WA_TranslucentBackground
  • 成都睿明智科技有限公司抖音开店怎么样?
  • 社交内容电商中的新机遇:2+1链动模式AI智能名片商城小程序
  • 10款好用的开源 HarmonyOS 工具库
  • 7-1.Android SQLite 之 SQLiteDatabase 简单编码模板(SQLiteDatabase 使用、SQL 语句编写)
  • 矩阵系统源码搭建的具体步骤,支持oem,源码搭建
  • Redis的基础通用命令
  • 3D Gaussian Splatting 学习笔记
  • VTK 与 OpenCV 的区别和各自的特点
  • 【笔记】X射线的衍射方向
  • golang学习笔记26-管道(Channel)【重要】