私がTwitterのクローンを書いているとしますが、ずっと簡単です。私は各アイテムをFlatListに入れ、それらをレンダリングします。React NativeでFlatListの1つのアイテムを更新するには?
投稿を「好き」にするには、投稿の「好き」ボタンを押して「好き」ボタンが赤くなり、もう一度押すと灰色に変わります。
this.state
にすべての読み込まれた投稿が格納されています。各投稿には「お気に入り」というプロパティがあり、ブール値で、このユーザーがこの投稿を好きだったかどうかを示します。 」のような、私はそうのような記事を更新するために、this.setState
を使用し、その後state.posts
に移動し、そのポストのliked
プロパティを更新し、このアプローチは動作します
// 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
を使用してはいけませんが、他にどのような方法を試すことができますか?
ありがとうございます。私はサーバーの変更を聞いていません。私はバックグラウンドでデータベースの 'favorite'プロパティを更新しますが、それは時間がかかることを知っていますので、ユーザーにすぐにフィードバックを与えなければならないので、ローカルに最初にポストを変更するにはthis.setState'を実行します。実際に 'this.setState({posts})'行の後に、私はデータベースのレコードを更新するために進みました。私はそれを私の質問で書き留めていたことを忘れていました。投稿を更新するのに約1秒かかるのはなぜ分かりませんか –
データベース操作の前にsetStateを実行している場合は、すばやくそれを実行する必要があります。より多くのコードを貼り付けることができますか? –
あなたはそうです、私はsetStateを実行する前にデータベースを修正しようとしましたが、私は非同期操作だと思ったので、最初にどの操作をしても問題ありません。今すぐすぐに色が変わります –