我正在使用Realm Native的ListView,根据他们的网站,它基于React的ListView API。我也在关注Realm的ListView
示例here。
我的问题如下:我目前有一个ListView
,在某些时候需要部分重新渲染,例如第X行需要更新。但是,功能:
rowHasChanged: function(r1, r2) {
return +r1.date !== +r2.date;
}
...将始终返回false
,这意味着我的ListView保持不变。
代码(在我的组件构造函数中)如下:
let objects = realm.objects('xxxx');
let dataSource = new ListView.DataSource({
rowHasChanged: function(r1, r2) {
return +r1.date !== +r2.date;
}
});
this.state = {
objects: objects,
dataSource: dataSource.cloneWithRows(objects)
};
我还有一个更新函数,它将更新dataSource
状态:
updateObject(id, date) {
let obj = getObjById(id);
realm.write(() => {
obj[0].date = date;
...
});
}
执行上述功能后,rowHasChanged
将会触发。但是,r1
和r2
相同,因此它们都包含新日期。这意味着我的ListView
没有被重新呈现,并且有问题的行将包含不正确的(旧)日期。
答案 0 :(得分:0)
我目前正在使用它作为临时解决方案,因为我们现在正在添加额外的n * 2计算。
我添加了一个名为copyArray
的新功能(.slice(0)
因其shallow copying而无法正常工作。)
我的组件中的构造函数:
let objects = this.copyArray(realm.objects('xxxx'));
let dataSource = new ListView.DataSource({
rowHasChanged: function(r1, r2) {
return +r1.date !== +r2.date;
}
});
this.state = {
objects: objects,
dataSource: dataSource.cloneWithRows(objects)
};
新功能:
copyArray(array) {
let newArray = [];
for(let i = 0; i < array.length; i++) {
newArray.push({
date: array[i].date,
...
});
}
return newArray;
}
更新功能:
updateObject(id, date) {
let obj = getObjById(id);
realm.write(() => {
obj[0].date = date;
...
});
var newArray = this.copyArray(realm.objects('xxxx'));
this.setState({
objects: newArray,
dataSource: this.state.dataSource.cloneWithRows(newArray)
});
}