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

如何获取点击的用户名并传递至另一个React组件?

React组件间用户信息传递问题解决方案

你当前的代码实现了侧边栏的显示/隐藏功能,但没有将点击的用户信息传递给SideBarProfile组件。要解决这个问题,需要在父组件(CarouselUsers)中维护选中用户的状态,再将该状态传递给子组件(SideBarProfile),具体修改步骤如下:


1. 在CarouselUsers中添加选中用户状态

新增selectedUser状态,用于存储被点击用户的完整信息:

const [selectedUser, setSelectedUser] = useState(null);

2. 修改点击事件,传递当前用户

替换原有的openProfile函数,点击用户时同时设置选中用户和侧边栏显示状态:

const handleUserClick = (user) => {
  setSelectedUser(user);
  setProfile(true); // 直接打开侧边栏,无需切换状态
};

同时更新用户卡片的点击事件,传入当前循环的用户对象:

<div 
  className="box"
  style={{ background: `linear-gradient(to bottom,rgba(0, 0, 0, 0.4) 0,rgba(0,0,0,.6) 100%),url(${euTeste})` }} 
  onClick={() => handleUserClick(user)}
  key={user.id} // 用user.id作为key,避免用户名重复导致的渲染问题
>

3. 将选中用户传递给SideBarProfile

修改组件调用,新增selectedUser属性,并将关闭侧边栏的逻辑简化:

<SideBarProfile 
  profile={profile} 
  openProfile={() => setProfile(false)} 
  selectedUser={selectedUser} 
/>

4. 在SideBarProfile中接收并显示用户名

在组件props中添加selectedUser,并在对应位置渲染用户名(使用可选链操作符避免空值报错):

<div className="nome text-center">
  <h5>{selectedUser?.nome || '未选择用户'}</h5>
</div>

修改后的完整代码

CarouselUsers.jsx

import React, { useState, useEffect } from 'react';
import * as Styled from './style.jsx';
import { collection, getDocs } from "firebase/firestore";
import { Swiper, SwiperSlide } from "swiper/react";
import { db } from '../../Data/Firebase.jsx';
import "swiper/css";
import euTeste from '../../assets/teste.jfif'
import SideBarProfile from '../../components/SideBarProfile/SideBarProfile.jsx';

export default function CarouselUsers() {
  const [profile, setProfile] = useState(false)  
  const [selectedUser, setSelectedUser] = useState(null);

  const handleUserClick = (user) => {
    setSelectedUser(user);
    setProfile(true);
  };

  const [users, setUsers] = useState([])
  const usersCollectionRef = collection(db, "usuarios")

  useEffect(() => {    
    const getUsers = async () => {
      const data = await getDocs(usersCollectionRef);
      setUsers(data.docs.map((doc) => ({ ...doc.data(), id: doc.id }))); 
    };
    getUsers();
  }, []);
 
  return (
    <>
    <Styled.CarouselUsers>
      <div className="boxMembros">
        <div className="titulo">
          <h6>Membros</h6>
        </div>
        <Swiper spaceBetween={10} slidesPerView={3}> 
          {users.map((user) => (
            <SwiperSlide key={user.id}>
              <div 
                className="box"
                style={{ background: `linear-gradient(to bottom,rgba(0, 0, 0, 0.4) 0,rgba(0,0,0,.6) 100%),url(${euTeste})` }} 
                onClick={() => handleUserClick(user)}
              >
                <div className="infoBottom">
                  <div className="info">   
                    <h6>{user.nome}</h6>
                  </div>                        
                </div>
              </div>  
            </SwiperSlide>                  
          ))}
        </Swiper>
      </div>
    </Styled.CarouselUsers>    
    <SideBarProfile 
      profile={profile} 
      openProfile={() => setProfile(false)} 
      selectedUser={selectedUser} 
    />
    </>
  )
}

SideBarProfile.jsx

import React from 'react'
import { XCircle, WhatsappLogo } from "phosphor-react";
import * as Styled from './style.jsx';

export default function SideBarProfile({ openProfile, profile, selectedUser }) {  
  return (
    <Styled.SideBarProfile>
      <div className={profile ? 'col-md-3 boxLeftWrapper open' : 'col-md-3 boxLeftWrapper close'}>
        <div className="boxAll">
          <div className="header d-flex justify-between align-items-center">
            <div className="titulo">
              <h1>Perfil</h1>
            </div>
            <div className="close">
              <button onClick={openProfile}>
                <XCircle/>
              </button>
            </div>
          </div>
          <div className="boxBodyUser text-left">
            <div className="boxThis">
              <div className="foto">
                <img alt="Usuário" className='img-fluid ativo' />
              </div>
              <div className="nome text-center">
                <h5>{selectedUser?.nome || '未选择用户'}</h5>
              </div>
              <div className="status ativo">
                <span>Ativo</span>
              </div>
              <div className="ministerios">
                <ul className="pl-0 list-none mb-0">
                  <li>Teatro</li>
                  <li>Mídias Sociais</li>
                </ul>
              </div>
              <div className="boxContato mt-5">
                <div className="whatsapp d-flex items-center justify-center gap-2">
                  <WhatsappLogo/>
                  <span>Mensagem</span>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div> 
    </Styled.SideBarProfile>    
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:06:32