今天要分享的是倉頡開發語言中的懶加載。
先和初學者朋友們解釋一下什么是懶加載。懶加載在代碼中叫做LazyForEach,看到名字你一定能猜到它和ForEach的功能類似。只不過和ForEach的一次性加載所有數據不同,懶加載會根據屏幕可使區域按需加載數據,并且當內容滑出屏幕范圍時,懶加載又會自動將這些內容銷毀。
所以懶加載對于程序的性能有顯著的優化,對于用戶的體驗也有大幅的提升,這一點幽藍君在ArkTs語言中已經做過對比。當數據比較多比較大的時候強烈建議大家使用懶加載。
LazyForEach的用法和ForEach相比較為麻煩一些,它的數據源要求IDataSource類型,我們需要先自定義這個數據類型。IDataSource中有一些方法,主要用來獲取數據和監聽數據改變:
public interface IDataSource<T> {func totalCount(): Int64func getData(index: Int64): Tfunc onRegisterDataChangeListener(listener: DataChangeListener): Unitfunc 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> = Nonepublic 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語言##倉頡##購物#