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

如何判断对象ID是否存在于另一对象数组?实现关注/取消关注按钮状态切换

解决方案:实现粉丝列表的关注状态判断与按钮切换

一、优化关注ID的快速查询

为了高效判断粉丝是否在你的关注列表中,将关注列表的ID提取为Set结构(查询效率O(1),远高于数组的O(n)),用useMemo派生这个值,确保仅在关注列表变化时更新:

import { useMemo } from 'react';

// ... 其他状态定义

const followingIds = useMemo(() => {
  return new Set(followingList.map(item => item.id));
}, [followingList]);

二、修正异步列表获取逻辑

原代码中getFollower会直接执行,并非在getFollowing完成后触发,可改用Promise.all并行获取两个列表(无依赖时更高效),或调整链式调用顺序:

useEffect(() => {
  // 并行获取关注与粉丝列表
  Promise.all([getFollowing(), getFollower()])
    .then(([followingRes, followerRes]) => {
      setFollowingList(followingRes);
      setFollowerList(followerRes);
    })
    .catch(err => console.error('获取列表失败', err));
}, []);

三、动态渲染粉丝列表的按钮状态

无需给每个粉丝单独维护isFollowing状态,渲染时直接用followingIds.has(follow.id)判断关注状态,动态切换按钮文字与点击逻辑:

{followerList.map((follow) => {
  const isFollowing = followingIds.has(follow.id);
  return (
    <div className="follow-item" key={follow.id}> {/* 用用户ID作为key,避免索引不稳定问题 */}
      <div className="follow-img">
        <img src={follow.profileImg} alt="UserPic" />
      </div>
      <div className="follow-name">{follow.nickname}</div>
      <FollowBtn onClick={() => handleFollowToggle(follow.id, isFollowing)}>
        {isFollowing ? 'Unfollow' : 'Follow'}
      </FollowBtn>
    </div>
  );
})}

四、实现关注/取消关注的切换逻辑

添加处理按钮点击的函数,同步更新前端状态与后端数据:

const handleFollowToggle = async (userId, isCurrentlyFollowing) => {
  try {
    if (isCurrentlyFollowing) {
      // 调用取消关注接口
      await unfollowUser(userId);
      // 更新关注列表:移除该用户
      setFollowingList(prev => prev.filter(item => item.id !== userId));
    } else {
      // 调用关注接口
      await followUser(userId);
      // 更新关注列表:添加该用户(可根据接口返回结果调整)
      const userToAdd = followerList.find(item => item.id === userId);
      if (userToAdd) {
        setFollowingList(prev => [...prev, userToAdd]);
      }
    }
  } catch (err) {
    console.error('操作失败', err);
  }
};

五、优化关注列表的取消关注逻辑(可选)

关注列表的取消关注按钮可复用上述切换函数,简化代码:

{followingList.map((follow) => {
  return (
    <div className="follow-item" key={follow.id}>
      <div className="follow-img"><img src={follow.profileImg} alt="UserPic" /></div>
      <div className="follow-name">{follow.nickname}</div>
      <FollowBtn onClick={() => handleFollowToggle(follow.id, true)}>Unfollow</FollowBtn>
    </div>
  );
})}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:01:12