创建BaseLazyForEachDataSource文件
import { RefreshDataSource } from "@abner/refresh";
export class BaseLazyForEachDataSource<DataElement> implements IDataSource {
private listeners: DataChangeListener[] = [];
protected datas: DataElement[] = [];
public totalCount(): number {
return this.datas.length;
}
public getData(index: number): DataElement {
return this.datas[index];
}
public pushData(data: DataElement): void {
this.datas.push(data);
this.notifyDataAdd(this.datas.length - 1);
}
public pushDatas(datas: DataElement[]): void {
const insertCount = datas.length;
for (let index = 0; index < insertCount; index++) {
const element = datas[index];
this.datas.push(element);
this.notifyDataAdd(this.datas.length - 1);
}
}
public resetAllData(newDatas?: DataElement[]): void {
if (undefined != newDatas && newDatas.length > 0) {
this.datas = newDatas;
}else {
this.datas = [];
}
this.notifyDataReload();
}
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);
})
}
notifyDatasetChange(operations: DataOperation[]): void {
this.listeners.forEach(listener => {
listener.onDatasetChange(operations);
})
}
}
export class ListViewLazyForEachDataSource extends RefreshDataSource {
constructor() {
super();
super.initData([]);
}
pushDatas(datas: Object[]): void {
super.pushDataArray(datas);
}
resetAllData(newDatas?: Object[]): void {
super.deleteAllAfterPushArray(newDatas);
}
}
使用方式 在需要用到的页面继承
class CommentListPageDataSource extends BaseLazyForEachDataSource<CommentList> {
}
在用到的组件或者页面中声明
@State commentListPageDataSource: CommentListPageDataSource = new CommentListPageDataSource();
UI页面使用
LazyForEach(this.commentListPageDataSource, (item:CommentList,index:number) => {
}, (item: Array<CommentList>, index) => `${index}_${JSON.stringify(item)}`)
(item: Array, index) => ${index}_${JSON.stringify(item)} 这句话是必须要写的.
更新数据的时候
let itemData = this.commentListPageDataSource.getData(pos);
itemData.praiseFlag = true
itemData.praises = this.commentListPageDataSource.getData(pos).praises as number + 1
this.commentListPageDataSource.notifyDataChange(pos);
重点是this.commentListPageDataSource.notifyDataChange(pos);这句代码. ListView使用的是ListViewLazyForEachDataSource这个,用法差不多,在此不一一复述.