【发布时间】:2017-10-28 20:39:20
【问题描述】:
注意:我已经在下面发布了一个答案,我个人认为这是迄今为止最好的解决方案。尽管它不是最高评价的答案,但根据我得到的结果,它非常有效。
----------------------------------------------原始问题-------------------------------------------------------- ------------
假设我正在编写一个 Twitter 克隆,但要简单得多。我将每个项目放在 FlatList 中并渲染它们。
要“点赞”帖子,我按帖子上的“点赞”按钮,“点赞”按钮变成红色,我再按一次,它变成灰色。
这就是我目前所拥有的:我将所有加载的帖子存储在this.state,每个帖子都有一个名为“liked”的属性,它是布尔值,当用户按下时表示该用户是否喜欢这个帖子“like”,我去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 });
}
这种方法有效,但是太慢了。当我按下“like”按钮时,它的颜色会翻转,但通常需要大约 1 秒钟才能改变颜色。我想要的是当我按下它时颜色几乎会同时翻转。
我确实知道为什么会发生这种情况,我可能不应该使用this.setState,因为当我这样做时,posts 状态会发生变化,并且所有帖子都会重新呈现,但是我可以尝试其他什么方法?
【问题讨论】:
标签: react-native