2016-11-19 70 views
0

我现在有几个建议的解决方案,但无法让它们工作。通过正确复制旧数组来更新列表视图时遇到问题。 我的解决方案至今(其中不工作:-()不重新呈现列表视图在React Native中更新ListView

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 
    }) 
} 

我想换一个属性(选择)从指数为true,所有其他对象(选择)设置为false。 希望有人能帮助。寻找干净的解决方案。

问候

+1

o.id = rowData.id或o.id == rowData.id? –

+0

糟糕。 o.id == rowData.id ofcourse :-) – MDK

回答

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 
    }) 
} 

任何一个更好的解决方案?

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 
 
    }) 
 
}