假設我正在寫一個Twitter的克隆,但是要簡單得多。我把每個項目放在FlatList中並渲染它們。如何在React Native中更新FlatList中的單個項目?
要「喜歡」一篇文章,我按下帖子上的「喜歡」按鈕,「喜歡」按鈕變成紅色,我再次按下,它變成灰色。
這是我到目前爲止:我將所有加載的帖子存儲在this.state
中,每個帖子都有一個名爲「likes」的屬性,它是布爾值,表示此用戶是否喜歡此帖子,當用戶按下「像」,我去state.posts
和更新後的liked
屬性,然後用this.setState
更新的帖子,像這樣:
// 1. FlatList
<FlatList
...
data={this.state.posts}
renderItem={this.renderPost}
...
/>
// 2. renderPost
renderPost({ item, index }) {
return (
<View style={someStyle}>
... // display other properties of the post
// Then display the "like" button
<Icon
name='favorite'
size={25}
color={item.liked ? 'red' : 'gray'}
containerStyle={someStyle}
iconStyle={someStyle}
onPress={() => this.onLikePost({ item, index })}
/>
...
</View>
);
}
// 3. onLikePost
likePost({ item, index }) {
let { posts } = this.state;
let targetPost = posts[index];
// Flip the 'liked' property of the targetPost
targetPost.liked = !targetPost.liked;
// Then update targetPost in 'posts'
posts[index] = targetPost;
// Then reset the 'state.posts' property
this.setState({ posts });
}
這種方法的工作原理,但是,實在是太慢了。 「按鈕」按鈕的顏色隨着按壓而翻轉,但顏色變化前通常需要1秒左右的時間。我想要的是,當我按下它時,顏色幾乎會在同一時間翻轉。
我知道爲什麼會發生這種情況,我可能不會使用this.setState
,但我還可以嘗試其他方法嗎?
謝謝你的回覆。我沒有聽到服務器更改。我在後臺更新數據庫中的'喜歡'屬性,但我知道這需要一些時間,因此,我必須給用戶一個即時反饋,這就是爲什麼我更新該帖子的'喜歡'屬性並使用' this.setState'首先在本地更改帖子。實際上,在'this.setState({posts})'這行之後,我繼續更新數據庫中的記錄,我忘了在我的問題中寫下這個記錄,對此抱歉。我不知道爲什麼需要大約1秒來更新帖子 –
如果您在數據庫操作之前正在執行setState,那麼它應該快速執行。你能粘貼一些涉及的更多代碼嗎? –
你是對的,我試圖在setState之前修改數據庫,我認爲這是一個異步操作,所以先做哪個操作並不重要。現在顏色幾乎立即改變 –