Внимание: я разместил ответ там, лично я считаю, что это лучшее решение на данный момент. Несмотря на то, что это не самый высокий рейтинг ответа, но в зависимости от результата, который я получаю, он очень эффективен.
---------------------------------------------Оригинальный вопрос ----------------------------------------------- --------
Предположим, я пишу клон Twitter, но намного проще. Я помещаю каждый элемент в FlatList и отображаю их.
Чтобы "понравиться" сообщению, я нажимаю кнопку "Мне нравится" на сообщении, и кнопка "Мне нравится" становится красной, я нажимаю ее снова, она становится серой.
Это то, что у меня пока есть: я сохраняю все загруженные посты в this.state
, у каждого поста есть свойство "Мне нравится", которое является логическим и указывает, понравился ли этот пост пользователю или нет, когда пользователь нажимает "Мне нравится". Я захожу в 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
, потому что, когда я делаю это, состояние posts
изменяется, и все сообщения перерисовываются, но какой другой подход я могу попробовать?