在React Native中更新ListView

时间:2016-11-19 14:39:29

标签: javascript listview react-native datasource

我现在有几个建议的解决方案,但无法让它们工作。我通过正确复制旧数组来更新列表视图时遇到问题。 到目前为止我的解决方案(不起作用:-()不要重新阅读列表视图。

const data = [{
            id: 1,
            selected: true,
        }, {
            id: 2,
            selected: false,
        }, {
            id: 3,
            selected: false,
        }]

        const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});

        this.state = {
            dataSource: ds.cloneWithRows(data),
            data: data,
        }

要更新行我使用此代码:

   _updateRow = (rowData, rowID) => {
    let newArray = this.state.data.slice();

    newArray.map((o, index) => {
        if (o.id = rowData.id){
            o.selected = true;
        }
        else {
            o.selected = false;
        }
    })


    this.setState({
        dataSource: this.state.dataSource.cloneWithRows(newArray),
        data: newArray
    })
}

我想将一个属性(已选中)从index更改为true,将所有其他对象(已选中)更改为false。 希望有人能提供帮助。寻找最干净的解决方案。

问候

2 个答案:

答案 0 :(得分:2)

YEAH !!! 解决了它。 以下是代码:

_updateRow = (rowData, rowID) => {
    let newArray = this.state.data.slice();

    newArray.map((o, index) => {
            newArray[index] = {...o, selected: true};
        else
            newArray[index] = {...o, selected: false};

    })

    this.setState({
        dataSource: this.state.dataSource.cloneWithRows(newArray),
        data: newArray
    })
}

任何人都有更好的解决方案吗?

答案 1 :(得分:0)

也许下面的代码?

_updateRow = (rowData) => {
    let newArray = [].concat(this.state.data);

    newArray.map((o, index) => {
      return {...o, selected: o.id === rowData.id}
    });

    this.setState({
        dataSource: this.state.dataSource.cloneWithRows(newArray),
        data: newArray
    })
}