2016-01-02 43 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)});  

},