React native ListView行已更改r1始终等于r2

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

我使用的是Realm Native,根据他们的站点,它基于React的ListView API。我也在关注Realm的
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)
   });
}