2016-01-02 21 views
0

我有问题的列表视图不刷新它的数据源,除非我离开页面并回来。我的列表视图是在NavigatorIOS组件内。React本机列表视图不会刷新行编辑

每一篇文章我读了sais刷新数据源与一个新的对象。当我从数据源中删除/添加某些东西时它工作正常,但是当我只想从数据源中编辑一行时,它不刷新视图。

此代码不能正常工作

editMessage(title, message, messageIndex, replyIndex){ 
    var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 
    var newData = []; 
    newData = this.state.data.slice(); 
    newData[messageIndex].replies[replyIndex].title= title; 
    newData[messageIndex].replies[replyIndex].message= message; 
    this.setState({data: newData}); 
    this.setState({dataSource: ds.cloneWithRows(newData)}); 
}, 

然而,这样的样本工作正常

removeMessage(index){ 
    console.log(index); 
    var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 
    var newData = this.state.data; 
    newData.splice(index, 1); 


    this.setState({dataSource: ds.cloneWithRows(newData)}); 

}, 

编辑:我已经尝试通过值复制,但它仍然无法正常工作。

newData = JSON.parse(JSON.stringify(this.state.data)); newData[messageIndex].replies[replyIndex].title= title; newData[messageIndex].replies[replyIndex].message= message; this.setState({dataSource: ds.cloneWithRows(newData)}); this.setState({data: newData});

回答

0

我不知道这是一个通过引用错误的this.state ..既然你正在改变,这将有一个指针回到原来的this.state数组对象数组对象的属性。如果您将该数组设置为原始状态,那么它会认为它与您只修改数组中的对象的数组相同。 “对于对象引用(而不是实际对象),slice将对象引用复制到新数组中。原始数组和新数组引用同一个对象。如果引用的对象发生更改,这些更改对新的和原始的阵列都是可见的。“ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

+0

我已经尝试'newData = JSON.parse (JSON.stringify(this.state.data));修改this.state.data后,仍然没有改变。我的印象是通过价值复制的代码行 –

0

我认为问题出在我的逻辑上,即使状态更新,孩子也不刷新。

当前父数据源看起来像这样

[ 
{ 
    index: 
    author: 
    title: 
    message: 
    replies: [{ 
       author: 
       title: 
       message: 
      }] 
} 
] 

子组件只使用答复阵列作为数据源

replies: [{ 
       author: 
       title: 
       message: 
      }] 

为什么它很重要,但?当我更改父状态时,孩子的数据源也会发生变化,因为它使用的是相同的数据源。但它不会刷新页面。即使父母已更改状态,我也必须更新childs数据源。

,家长有此代码

editMessage(title, message, messageIndex, replyIndex){ 

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

this.state.data[messageIndex].replies[replyIndex].title= title; 
this.state.data[messageIndex].replies[replyIndex].message= message; 

this.setState({dataSource: ds.cloneWithRows(this.state.data)}); 
this.setState({data: this.state.data}); 

},

和孩子有这个代码

editMessage(title, message, replyIndex){ 

this.props.editMessage(title, message, this.props.pushEvent.index ,replyIndex); 
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 
this.setState({dataSource: ds.cloneWithRows(this.state.replies)});  

},