LazyForEach從提供的數(shù)據(jù)源中按需迭代數(shù)據(jù),并在每次迭代過程中創(chuàng)建相應的組件。當LazyForEach在滾動容器中使用了,框架會根據(jù)滾動容器可視區(qū)域按需創(chuàng)建組件,當組件劃出可視區(qū)域外時,框架會進行組件銷毀回收以降低內(nèi)存占用。
一、接口描述
LazyForEach(
dataSource: IDataSource, // 需要進行數(shù)據(jù)迭代的數(shù)據(jù)源
itemGenerator: (item: any) => void, // 子組件生成函數(shù)
keyGenerator?: (item: any) => string // (可選) .鍵值生成函數(shù)
): void
interface IDataSource {
totalCount(): number; // Get total count of data
getData(index: number): any; // Get single data by index
registerDataChangeListener(listener: DataChangeListener): void; // Register listener to listening data changes
unregisterDataChangeListener(listener: DataChangeListener): void; // Unregister listener
}
interface DataChangeListener {
onDataReloaded(): void; // Called while data reloaded
onDataAdd(index: number): void; // Called while single data added
onDataMove(from: number, to: number): void; // Called while single data moved
onDataDelete(index: number): void; // Called while single data deleted
onDataChange(index: number): void; // Called while single data changed
.}
二、IDataSource類型說明
interface IDataSource {
totalCount(): number;
getData(index: number): any;
registerDataChangeListener(listener: DataChangeListener): void;
unregisterDataChangeListener(listener: DataChangeListener): void;
}
三、DataChangeListener類型說明
?
四、使用限制
LazyForEach必須在容器組件內(nèi)使用,僅有List、Grid以及Swiper組件支持數(shù)據(jù)懶加載(即只加載可視部分以及其前后少量數(shù)據(jù)用于緩沖),其他組件仍然是一次性加載所有的數(shù)據(jù)。
LazyForEach在每次迭代中,必須創(chuàng)建且只允許創(chuàng)建一個子組件。
生成的子組件必須是允許包含在LazyForEach父容器組件中的子組件。
允許LazyForEach包含在if/else條件渲染語句中,也允許LazyForEach中出現(xiàn)if/else條件渲染語句。
鍵值生成器必須針對每個數(shù)據(jù)生成唯一的值,如果鍵值相同,將導致鍵值相同的UI組件被框架忽略,從而無法在父容器內(nèi)顯示。
LazyForEach必須使用DataChangeListener對象來進行更新,第一個參數(shù)dataSource使用狀態(tài)變量時,狀態(tài)變量改變不會觸發(fā)LazyForEach的UI刷新。
為了高性能渲染,通過DataChangeListener對象的onDataChange方法來更新UI時,需要生成不同于原來的鍵值來觸發(fā)組件刷新。
itemGenerator函數(shù)的調(diào)用順序不一定和數(shù)據(jù)源中的數(shù)據(jù)項相同,在開發(fā)過程中不要假設(shè)itemGenerator和keyGenerator函數(shù)是否執(zhí)行及其執(zhí)行順序。例如,以下示例可能無法正常運行:文章來源:http://www.zghlxwxcb.cn/news/detail-666122.html
LazyForEach(dataSource,
item => Text(`${item.i}. item.data.label`),
item => item.data.id.toString())
五、示例文章來源地址http://www.zghlxwxcb.cn/news/detail-666122.html
// Basic implementation of IDataSource to handle data listener
class BasicDataSource implements IDataSource {
private listeners: DataChangeListener[] = [];
public totalCount(): number {
return 0;
}
public getData(index: number): any {
return undefined;
}
registerDataChangeListener(listener: DataChangeListener): void {
if (this.listeners.indexOf(listener) < 0) {
console.info('add listener');
this.listeners.push(listener);
}
}
unregisterDataChangeListener(listener: DataChangeListener): void {
const pos = this.listeners.indexOf(listener);
if (pos >= 0) {
console.info('remove listener');
this.listeners.splice(pos, 1);
}
}
notifyDataReload(): void {
this.listeners.forEach(listener => {
listener.onDataReloaded();
})
}
notifyDataAdd(index: number): void {
this.listeners.forEach(listener => {
listener.onDataAdd(index);
})
}
notifyDataChange(index: number): void {
this.listeners.forEach(listener => {
listener.onDataChange(index);
})
}
notifyDataDelete(index: number): void {
this.listeners.forEach(listener => {
listener.onDataDelete(index);
})
}
notifyDataMove(from: number, to: number): void {
this.listeners.forEach(listener => {
listener.onDataMove(from, to);
})
}
}
class MyDataSource extends BasicDataSource {
private dataArray: string[] = ['/path/image0', '/path/image1', '/path/image2', '/path/image3'];
public totalCount(): number {
return this.dataArray.length;
}
public getData(index: number): any {
return this.dataArray[index];
}
public addData(index: number, data: string): void {
this.dataArray.splice(index, 0, data);
this.notifyDataAdd(index);
}
public pushData(data: string): void {
this.dataArray.push(data);
this.notifyDataAdd(this.dataArray.length - 1);
}
}
@Entry
@Component
struct MyComponent {
private data: MyDataSource = new MyDataSource();
build() {
List({ space: 3 }) {
LazyForEach(this.data, (item: string) => {
ListItem() {
Row() {
Image(item).width('30%').height(50)
Text(item).fontSize(20).margin({ left: 10 })
}.margin({ left: 10, right: 10 })
}
.onClick(() => {
this.data.pushData('/path/image' + this.data.totalCount());
})
}, item => item)
}
}
}
到了這里,關(guān)于HarmonyOS/OpenHarmony應用開發(fā)-ArkTS語言渲染控制LazyForEach數(shù)據(jù)懶加載的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!