《鸿蒙开发-答案之书》懒加载BaseDataSource封装
List的懒加载很常见,还有Swiper的。用懒加载可以提供性能。
下面分享一个封装好的BaseDataSource代码:
export class BaseDataSource<T> implements IDataSource{
private listeners: DataChangeListener[] = []
private dataArray:T[] = []
// 设置新数据
setNewData(data: T[]){
this.dataArray = data
this.notifyDataReload()
}
// 添加数据;index:添加的位置,不传就添加在最后
addData(data: T[], position?: number){
if(typeof position === 'number' && position < this.totalCount()){
// 不是添加在末尾就刷新全列表,要不列表上的位置index变量是不会更新的
this.dataArray.splice(position, 0, ...data)
this.notifyDataReload()
}else {
let index: number = this.totalCount()
data.forEach((item:T,i: number) =>{
this.dataArray.splice(index + i, 0, item)
this.listeners.forEach(listener => {
listener.onDataAdd(index + i);
})
})
}
}
addDataNoListener(data: T){
this.dataArray.push(data)
}
// 删除数据;index:删除的位置
// deleteCount:连续删除接下来的几位,不传就只删除一位,超出最大数就从index位删到末尾
deleteData(index: number, deleteCount?: number){
if(index < this.totalCount()){
if(typeof deleteCount !== 'number'){
deleteCount = 1
}else if(deleteCount > this.totalCount() - index){
deleteCount = this.totalCount() - index
}
for(let i = 0; i < deleteCount; i++){
this.dataArray.splice(index, 1)
// this.listeners.forEach(listener => {
// listener.onDataDelete(index);
// })
}
this.notifyDataReload()
}
}
// 更新某一位的数据;index:刷新的位置; item:新数据
changeData(index: number, item: T){
if(index < this.totalCount()){
this.dataArray.splice(index, 1, item)
this.listeners.forEach(listener => {
listener.onDataChange(index);
})
}
}
// 刷新所有子组件
notifyDataReload(): void {
this.listeners.forEach(listener => {
listener.onDataReloaded();
})
}
// 通知控制器数据变化
notifyDataChange(index: number): void {
this.listeners.forEach(listener => {
listener.onDataChange(index)
})
}
totalCount(): number {
return this.dataArray.length
}
getData(index: number):T {
return this.dataArray[index]
}
getAllData():T[] {
return this.dataArray
}
resetAllDataNoListener() {
this.dataArray = []
}
// 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听
registerDataChangeListener(listener: DataChangeListener): void {
if (this.listeners.indexOf(listener) < 0) {
this.listeners.push(listener)
}
}
// 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听
unregisterDataChangeListener(listener: DataChangeListener): void {
const pos = this.listeners.indexOf(listener)
if (pos >= 0) {
this.listeners.splice(pos, 1)
}
}
}
上面代码可以直接拿去用
有鸿蒙开发bug或者需求的可私信我,我每天都看私信的