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

React项目中如何正确展示指定用户的关注者与关注列表

问题描述

需求:通过用户ID在其个人资料页面展示该用户的关注者与关注列表。
当前问题:组件仅能展示已登录用户的关注/粉丝列表,点击其他用户资料页时,弹窗仍显示登录用户的列表数据。

问题分析

原代码存在以下核心问题:

  • 目标用户定位错误:遍历所有用户并判断user.id !== userId,完全搞反了筛选逻辑,没有先定位到当前页面的目标用户
  • 关注/粉丝数据逻辑混乱:错误地用user.follower.includes(user.id)判断关注关系,没有明确区分“目标用户关注的人”和“关注目标用户的人”
  • 静态文案:弹窗标题始终显示“Mes Abonnements”(我的关注),未根据目标用户动态调整
修复后的组件代码
import React, { useState } from "react";
import { useSelector } from "react-redux";
import { useParams } from "react-router-dom";
import Modal from "../Components/Log/Modals";
import { isEmpty } from "../Components/Utils";
import FollowHandler from "./FollowHandler";

const FollowingPopup = ({ type }) => {
    const currentUser = useSelector((state) => state.userReducer);
    const [isOpen, setIsOpen] = useState(false);
    const { id: targetUserId } = useParams();
    const [showFollowings, setShowFollowings] = useState(true); // true=显示关注列表,false=显示粉丝列表
    const allUsers = useSelector((state) => state.usersReducer);

    // 定位当前页面的目标用户
    const targetUser = allUsers.find(user => user.id === targetUserId);
    if (!targetUser) return null;

    // 获取目标用户的关注列表(适配原数据结构:从user.follower中提取关注的用户ID)
    const targetFollowings = allUsers.filter(user => 
        targetUser.follower?.some(item => item.followerId === user.id)
    );

    // 获取目标用户的粉丝列表
    const targetFollowers = allUsers.filter(user => 
        user.follower?.some(item => item.followerId === targetUserId)
    );

    return (
        <Modal open={isOpen} onClick={() => setIsOpen(false)}>
            <span
                onClick={() => setIsOpen(false)}
                className="followers__modal__close"
            ></span>
            <header className="followers__modal__header">
                <button
                    className={`followers ${showFollowings ? 'active-followers' : ''}`}
                    onClick={() => setShowFollowings(true)}
                >
                    {targetUser.firstname}的关注
                </button>
                <button
                    className={`followers ${!showFollowings ? 'active-followers' : ''}`}
                    onClick={() => setShowFollowings(false)}
                >
                    {targetUser.firstname}的粉丝
                </button>
            </header>

            <div className="followers__modal__content">
                <ul>
                    {showFollowings ? (
                        targetFollowings.map(user => (
                            <li key={user.id} className="followers__modal__followers">
                                <a
                                    href={`/${user.id}`}
                                    className="followers__modal__followers__links"
                                >
                                    <img src={user.picture} alt={`${user.firstname} ${user.lastname}`} />
                                    <h4>{`${user.firstname} ${user.lastname}`}</h4>
                                </a>
                                {user.id !== currentUser.id && (
                                    <FollowHandler followerId={user.id} type={'suggestion'} />
                                )}
                            </li>
                        ))
                    ) : (
                        targetFollowers.map(user => (
                            <li key={user.id} className="followers__modal__followers">
                                <a
                                    href={`/${user.id}`}
                                    className="followers__modal__followers__links"
                                >
                                    <img src={user.picture} alt={`${user.firstname} ${user.lastname}`} />
                                    <h4>{`${user.firstname} ${user.lastname}`}</h4>
                                </a>
                                {user.id !== currentUser.id && (
                                    <FollowHandler followerId={user.id} type={'suggestion'} />
                                )}
                            </li>
                        ))
                    )}
                </ul>
            </div>
        </Modal>
    );
};

export default FollowingPopup;
关键修改说明
  • 目标用户精准定位:通过allUsers.find直接找到当前页面的目标用户,所有数据处理均基于该用户展开
  • 清晰区分关注/粉丝逻辑:
    • 关注列表:筛选出所有被目标用户关注的用户(适配原数据中follower字段的结构)
    • 粉丝列表:筛选出所有关注了目标用户的用户
  • 动态文案适配:弹窗标题根据目标用户和当前列表类型动态调整,不再固定显示“我的关注”
  • 状态逻辑优化:用showFollowings状态统一控制关注/粉丝列表的切换,逻辑更直观
  • 可读性提升:重命名变量(如userData改为currentUser,userId改为targetUserId),让变量含义更明确
  • 性能优化:提前计算目标用户的关注/粉丝列表,避免渲染循环中重复执行筛选逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:35:33