今天要分享的是仓颉开发语言中的懒加载。

先和初学者朋友们解释一下什么是懒加载。懒加载在代码中叫做LazyForEach,看到名字你一定能猜到它和ForEach的功能类似。只不过和ForEach的一次性加载所有数据不同,懒加载会根据屏幕可使区域按需加载数据,并且当内容滑出屏幕范围时,懒加载又会自动将这些内容销毁。

所以懒加载对于程序的性能有显著的优化,对于用户的体验也有大幅的提升,这一点幽蓝君在ArkTs语言中已经做过对比。当数据比较多比较大的时候强烈建议大家使用懒加载。

LazyForEach的用法和ForEach相比较为麻烦一些,它的数据源要求IDataSource类型,我们需要先自定义这个数据类型。IDataSource中有一些方法,主要用来获取数据和监听数据改变:

public interface IDataSource<T> {
func totalCount(): Int64
func getData(index: Int64): T
func onRegisterDataChangeListener(listener: DataChangeListener): Unit
func onUnregisterDataChangeListener(listener: DataChangeListener): Unit
}

我在本地服务器放了几张高清图片,下面以加载这些高清图片为例,为大家演示懒加载的具体用法:

package ohos_app_cangjie_entry.page
import ohos.base.*
import ohos.component.*
import ohos.state_manage.*
import ohos.state_macro_manage.*
import std.collection.ArrayList
import std.collection.*
class CoverDataSource <: IDataSource<String> {
public CoverDataSource(let data_: ArrayList<String>) {}
public var listenerOp: Option<DataChangeListener> = None
public func totalCount(): Int64 {
return data_.size
}
public func getData(index: Int64): String {
return data_[index]
}
public func onRegisterDataChangeListener(listener: DataChangeListener): Unit {
listenerOp = listener
}
public func onUnregisterDataChangeListener(listener: DataChangeListener): Unit {
listenerOp = None
}
public func notifyChange(): Unit {
let listener: DataChangeListener = listenerOp.getOrThrow()
listener.onDataReloaded()
}
}
func getDS(): CoverDataSource
{
let data: ArrayList<String> = ArrayList<String>([
'http://example.com/youlanApi/cover/lazy1.jpg',
'http://example.com/youlanApi/cover/lazy2.jpg',
'http://example.com/youlanApi/cover/lazy3.jpg',
'http://example.com/youlanApi/cover/lazy4.jpg',
'http://example.com/youlanApi/cover/lazy5.jpg',
'http://example.com/youlanApi/cover/lazy6.jpg',
'http://example.com/youlanApi/cover/lazy7.jpg',
'http://example.com/youlanApi/cover/lazy8.jpg',
'http://example.com/youlanApi/cover/lazy9.jpg',
'http://example.com/youlanApi/cover/lazy10.jpg',
'http://example.com/youlanApi/cover/lazy11.jpg'
])
let dataSourceStu: CoverDataSource = CoverDataSource(data)
return dataSourceStu
}
let coverDataSource: CoverDataSource = getDS()
@Entry
@Component
public class lazypage {
func build(){
Column(30) {
Grid {
LazyForEach(coverDataSource, itemGeneratorFunc: {cover: String, idx: Int64 =>
GridItem {
Image(cover)
.width(100.percent)
.height(300)
}
})
}
.height(100.percent)
.width(100.percent)
.columnsTemplate('1fr 1fr')
.columnsGap(5)
.rowsGap(5)
.backgroundColor(0xFFFFFF)
.padding(right: 5, left: 5)
}
}
}

运行效果如下:

以上就是今天的内容分享,感谢阅读。##HarmonyOS语言##仓颉##购物#

鸿蒙Next仓颉语言开发实战教程:懒加载的更多相关文章

  1. iOS开发UI篇—懒加载

    iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...

  2. iOS开发UI中懒加载的使用方法

    1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...

  3. iOS开发——UI基础-懒加载,plist文件,字典转模型,自定义view

    一.懒加载 只有使用到了商品数组才会创建数组 保证数组只会被创建一次 只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 lazy - (void)viewDidLoad 控 ...

  4. ESP8266 LUA脚本语言开发: 准备工作-LUA文件加载与变量调用

    前言 这节说一下多个文件调用 多个文件之间变量调用 准备两个文件 init.lua other.lua 开始 模块默认一开始调用的是init.lua 咱让init.lua调用 other.lua 很简 ...

  5. iOS开发中懒加载的使用和限制

    1.在开发过程中很多时候,很多控件和对象需要alloc为了,提高开发效率使得懒加载得以产生. 2.下边用代码解释: - (NSMutableArray *)newsArr{ if (!_newsArr ...

  6. iOS开发基础-图片切换(4)之懒加载

    延续:iOS开发基础-图片切换(3),对(3)里面的代码用懒加载进行改善. 一.懒加载基本内容 懒加载(延迟加载):即在需要的时候才加载,修改属性的 getter 方法. 注意:懒加载时一定要先判断该 ...

  7. Swift游戏开发实战教程(霸内部信息大学)

    Swift游戏开发实战教程(大学霸内部资料) 试读下载地址:http://pan.baidu.com/s/1sj7DvQH 介绍:本教程是国内第一本Swift游戏开发专向资料. 本教程具体解说记忆配对 ...

  8. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发4- 后台模板html页面创建

    上一篇教程<asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发3-登录模块开发>完成了本项目的登录模块,登录后就需要进入后台管理首页了,需要准备一个后台模 ...

  9. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发2-Model层建立

    上篇(asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发1-准备工作)文章讲解了开发过程中的准备工作,主要创建了项目数据库及项目,本文主要讲解项目M层的实现,M层这里 ...

  10. 微信小程序-云开发实战教程

    微信小程序-云开发实战教程 云函数,云存储,云数据库,云调用 https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/gettin ...

随机推荐

  1. JDK各个版本发布时间和版本名称

    版权 版本 名称 发行日期 JDK 1.0 Oak(橡树) 1996-01-23 JDK 1.1   1997-02-19 JDK 1.1.4 Sparkler(宝石) 1997-09-12 JDK ...

  2. elk收集分析nginx日志,并绘制图形

    一.修改nginx配置 把nginx日志修改成json格式,在nginx.conf中添加如下内容,重启nginx. log_format log_json '{"@timestamp&quo ...

  3. 线性判别分析(LDA):降维与分类的完美结合

    在机器学习领域,线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的算法,它在降维和分类任务中都表现出色. LDA通过寻找特征空间中能够最大化类间方差和最小 ...

  4. 【跟K8S学设计】Informer全分析-Reflector(上)

    鉴于Informer架构及其处理逻辑蕴含了丰富的实战技术,本文将分为上下两章进行深入探讨. 上篇将专注于解析Informer中的Reflector组件,而下篇则会详尽分析Indexer模块.通过这种结 ...

  5. Python科学计算系列3—多项式操作

    1.因式分解 例1:分解下列多项式 代码如下: from sympy import symbols, factor x, y = symbols('x y') f = 3 * x ** 4 - 2 * ...

  6. UTC时间与正常时间相互转换的shell脚本

    UTC时间转换的shell脚本 前言 摸鱼感想 昨天被UTC时间,系统时间的转换的代码绕得有点晕, 最后,不饶了,我当天的任务是搞一个嵌入式测试而已!!!开摆! 于是在网上找了半天没找到合适的时间转换 ...

  7. cocos3 Shader的CCProgram模板详解

    这段内容描述的是一个 着色器(Shader) 的基本结构模板,可能用于一种自定义的着色器语言或框架(例如基于某种图形渲染引擎或中间表示语言扩展的着色器定义方式).以下是逐部分解析其含义: 1. CCP ...

  8. java串口通信

    实体 package com.hwd.campus.common.common.utils.http; import gnu.io.SerialPort; /** * 串口参数封装类 * @autho ...

  9. jsp页面的跳转

    服务器端和客户端跳转 服务器端跳转不改变URL,服务器的行为 客户端跳转改变URL,客户端的行为 项目目录 index.jsp <%@ page language="java" ...

  10. maven配置jdk版本

    修改默认的jdk版本 在maven安装目录 apache-maven-3.6.1\conf\setting.xml 添加 <profile> <id>jdk18</id& ...