注意:我已经在那里发布了一个答案,我个人认为这是迄今为止最好的解决方案。即使它不是评分最高的答案,但根据我得到的结果,它非常有效。
——————————————— 原始问题--- ————————————————– –
假设我正在编写 Twitter 克隆,但要简单得多。我将每个项目放在 FlatList 中并渲染它们。
要“赞”一个帖子,我按帖子上的“赞”按钮,“赞”按钮变成红色,我再按一次,它变成灰色。
这是我目前所拥有的:我将所有加载的帖子存储在 this.state
中,每个帖子都有一个名为“liked”的属性,它是布尔值,表示这个用户是否喜欢这个帖子,当用户按“喜欢”,我转到 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
状态发生了变化,所有帖子都会重新呈现,但是还有什么其他方法我可以试试吗?
原文由 K.Wu 发布,翻译遵循 CC BY-SA 4.0 许可协议
不要误会我的意思,@ShubhnikSingh 的回答确实有帮助,但我撤回了它,因为很久以前我找到了更好的解决这个问题的方法,最后我记得把它贴在这里。
假设我的帖子项目包含以下属性:
其中
liked
代表查看此帖的用户是否点赞了此帖,这将决定“赞”按钮的颜色(默认为灰色,如果liked == true
红色)以下是重新创建我的解决方案的步骤:将“发布”一个
Component
并将其呈现在一个FlatList
中。如果您没有传递给您的 的任何道具,您可以使用 React 的PureComponent
Post
例如一个数组或对象,它们可能看似不浅相等。如果您不知道这意味着什么,只需使用常规的Component
并覆盖shouldComponentUpdate
如下所示。然后,创建一个
PostList
组件,该组件将负责处理加载帖子和处理类似交互的逻辑:总之:
1)编写一个自定义组件(
Post
)用于呈现“FlatList”中的每个项目2)覆盖自定义组件的“shouldComponentUpdate”(
Post
)函数告诉组件何时更新处理父组件(
PostList
)中的“点赞状态”并将数据向下传递给每个子组件