React native ListView行已更改r1始终等于r2
我使用的是Realm Native,根据他们的站点,它基于React的ListView API。我也在关注Realm的React native ListView行已更改r1始终等于r2,react-native,realm,React Native,Realm,我使用的是Realm Native,根据他们的站点,它基于React的ListView API。我也在关注Realm的ListView示例 我的问题如下:我当前有一个列表视图,在某些情况下需要部分重新渲染,例如,需要更新第X行。但是,该职能: rowHasChanged: function(r1, r2) { return +r1.date !== +r2.date; } copyArray(array) { let newArray = []; for(let i
ListView
示例
我的问题如下:我当前有一个列表视图
,在某些情况下需要部分重新渲染,例如,需要更新第X行。但是,该职能:
rowHasChanged: function(r1, r2) {
return +r1.date !== +r2.date;
}
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)
});
}
…将始终返回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)
};
我还有一个更新功能,它将更新数据源
状态:
updateObject(id, date) {
let obj = getObjById(id);
realm.write(() => {
obj[0].date = date;
...
});
}
执行上述功能后,
行已更改
将触发。但是,r1
和r2
是相同的,因此它们都包含新日期。这随后意味着我的列表视图
不会被重新渲染,并且有问题的行将包含不正确的(旧)日期。我目前将此作为临时解决方案,因为我们现在添加了一个额外的n*2计算
我添加了一个名为copyArray
的新函数(.slice(0)
因此无法工作)
我的组件中的构造函数:
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)
};
新功能:
rowHasChanged: function(r1, r2) {
return +r1.date !== +r2.date;
}
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)
});
}
我现在使用这个作为临时解决方案,因为我们现在添加了一个额外的n*2计算 我添加了一个名为
copyArray
的新函数(.slice(0)
因此无法工作)
我的组件中的构造函数:
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)
};
新功能:
rowHasChanged: function(r1, r2) {
return +r1.date !== +r2.date;
}
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)
});
}