開發中遇到這樣的問題,我更新了state一個數組的某個元素的選中狀態,打印出的數據也顯示修改正確了,但是界面卻沒更新。例如下圖點擊某項修改選中狀態。
代碼中之前是這樣寫的,結果界面沒有更新。
var array=this.state.list;
var items=array[index];
items.selected=!items.selected;
this.setState({
list: array
})
console.log(this.state.list)
后面查了一下資料,因為FlatList組件繼承自PureComponent
而非通常的Component
,這意味着如果其props
在淺比較
中是相等的,則不會重新渲染。所以請先檢查你的renderItem
函數所依賴的props
數據(包括data
屬性以及可能用到的父組件的state),如果是一個引用類型(Object或者數組都是引用類型),則需要先修改其引用地址(比如先復制到一個新的Object或者數組中),然后再修改其值,否則界面很可能不會刷新。(譯注:這一段不了解的朋友建議先學習下js中的基本類型和引用類型。)
所以,當state內存放的數據為數組時候,實質上是一個引用,就算是state內push了一個數據,這時候是不會觸發更新的。這里我是新建了一個數組解決的,修改后的代碼如下:
var list=[];
list=list.concat(this.state.list);
list[index].selected=!list[index].selected;
this.setState({
list: list
})
console.log(this.state.list)