You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native帖子点赞UI异常:点击单帖触发全帖状态变更

问题原因

核心问题是所有帖子复用了同一个点赞状态变量,没有根据帖子的唯一标识(比如_id)区分不同帖子的点赞状态,导致点击任意一个帖子的点赞按钮时,全局状态变化会让所有帖子同步切换点赞UI。

解决方案

1. 调整状态存储结构

将单个布尔值状态改为以帖子ID为键的对象,单独维护每个帖子的点赞状态:

// 初始化空对象,存储{ 帖子ID: 是否点赞 }的键值对
const [likedPosts, setLikedPosts] = useState({});

2. 修改点赞请求函数

点击点赞时,仅更新当前点击帖子的状态,而非全局状态:

const likePost = async (postId) => {
  try {
    // 调用后端点赞接口
    const response = await fetch(`/api/posts/${postId}/like`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
    });
    await response.json();

    // 切换当前帖子的点赞状态
    setLikedPosts(prevState => ({
      ...prevState,
      [postId]: !prevState[postId] // 若之前未点赞则设为true,反之设为false
    }));
  } catch (error) {
    console.error('点赞操作失败:', error);
  }
};

3. 修正帖子渲染逻辑

渲染每个帖子时,根据当前帖子ID从likedPosts中获取对应的点赞状态,而非使用全局状态:

{posts.map(post => {
  // 判断当前帖子是否已点赞,默认未点赞
  const isLiked = likedPosts[post._id] || false;

  return (
    <View key={post._id} style={styles.postItem}>
      {/* 帖子其他内容(标题、正文等) */}
      
      {/* 点赞按钮 */}
      <TouchableOpacity 
        onPress={() => likePost(post._id)}
        style={styles.likeBtn}
      >
        {/* 根据isLiked切换图标样式 */}
        <Icon 
          name={isLiked ? 'heart' : 'heart-o'}
          size={22}
          color={isLiked ? '#ff3b30' : '#8e8e93'}
        />
        <Text style={styles.likeCount}>{post.likes.length}</Text>
      </TouchableOpacity>
    </View>
  );
})}

4. 初始化已点赞状态(可选)

如果需要页面加载时就显示用户已点赞的帖子状态,可在组件挂载时请求后端获取用户点赞记录,初始化likedPosts:

useEffect(() => {
  const fetchUserLikedPosts = async () => {
    try {
      const response = await fetch('/api/users/me/liked-posts');
      const likedPostIds = await response.json();
      
      // 将已点赞ID数组转为{ID: true}的对象
      const initialLikedState = likedPostIds.reduce((acc, postId) => {
        acc[postId] = true;
        return acc;
      }, {});
      
      setLikedPosts(initialLikedState);
    } catch (error) {
      console.error('获取已点赞帖子列表失败:', error);
    }
  };

  fetchUserLikedPosts();
}, []);

内容的提问来源于stack exchange,提问作者jedihomeslice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:40:00