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

React:如何将Login子组件的用户信息传递给App.js?

解决React中Login组件向App.js传递用户信息的问题

下面提供三种实用方案,根据项目复杂度选择适合的方式:

方法一:状态提升(Props + 回调函数)

适合简单层级的信息传递,通过路由组件中转回调函数,实现Login向App的信息回传。

1. App.js 维护状态并定义更新函数

import { useState } from 'react';
import Router from './Router';

function App() {
  // 初始化硬编码用户信息,后续动态更新
  const [tUserInfo, setTUserInfo] = useState({
    name: '默认用户',
    avatar: '/default-avatar.png'
  });

  // 接收Login组件传递的用户信息并更新状态
  const updateUserInfo = (userInfo) => {
    setTUserInfo(userInfo);
  };

  return (
    <div className="App">
      {/* 用户图标展示,绑定动态状态 */}
      <div className="user-avatar">
        <img src={tUserInfo.avatar} alt={tUserInfo.name} />
        <span>{tUserInfo.name}</span>
      </div>
      {/* 将更新函数传递给路由组件 */}
      <Router onUserLogin={updateUserInfo} />
    </div>
  );
}

export default App;

2. Router.js 中转回调给Login组件

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Login from './Login';
// 导入其他路由组件

function AppRouter({ onUserLogin }) {
  return (
    <Router>
      <Routes>
        {/* 把回调函数作为props传给Login */}
        <Route path="/login" element={<Login onLoginSuccess={onUserLogin} />} />
        {/* 其他路由配置 */}
      </Routes>
    </Router>
  );
}

export default AppRouter;

3. Login.js 登录成功后调用回调传递信息

import { useState } from 'react';
import axios from 'axios';

function Login({ onLoginSuccess }) {
  const [username, setUsername] = useState('');
  const [password, setPassword] = useState('');

  const handleLogin = async () => {
    try {
      // 调用登录接口获取用户信息
      const res = await axios.post('/api/login', { username, password });
      const userInfo = res.data;
      
      // 触发回调,把用户信息传给App.js
      onLoginSuccess(userInfo);
      
      // 登录成功跳转首页
      window.location.href = '/';
    } catch (err) {
      console.error('登录失败:', err);
    }
  };

  return (
    <div className="login-form">
      <input 
        type="text" 
        value={username} 
        onChange={(e) => setUsername(e.target.value)} 
        placeholder="用户名"
      />
      <input 
        type="password" 
        value={password} 
        onChange={(e) => setPassword(e.target.value)} 
        placeholder="密码"
      />
      <button onClick={handleLogin}>登录</button>
    </div>
  );
}

export default Login;

方法二:Context API(多组件共享场景)

如果项目中有多个组件需要访问用户信息,用Context可以避免逐层传递props的麻烦。

1. 创建UserContext.js

import { createContext, useContext, useState } from 'react';

const UserContext = createContext();

// 提供Context的Provider组件
export function UserProvider({ children }) {
  const [tUserInfo, setTUserInfo] = useState({
    name: '默认用户',
    avatar: '/default-avatar.png'
  });

  const updateUserInfo = (userInfo) => {
    setTUserInfo(userInfo);
  };

  return (
    <UserContext.Provider value={{ tUserInfo, updateUserInfo }}>
      {children}
    </UserContext.Provider>
  );
}

// 自定义Hook简化Context调用
export function useUser() {
  return useContext(UserContext);
}

2. App.js 包裹Provider

import { UserProvider, useUser } from './UserContext';
import Router from './Router';

// 封装用户图标组件,直接读取Context数据
function UserAvatar() {
  const { tUserInfo } = useUser();
  return (
    <div className="user-avatar">
      <img src={tUserInfo.avatar} alt={tUserInfo.name} />
      <span>{tUserInfo.name}</span>
    </div>
  );
}

function App() {
  return (
    <UserProvider>
      <div className="App">
        <UserAvatar />
        <Router />
      </div>
    </UserProvider>
  );
}

export default App;

3. Login.js 调用Context更新函数

import { useState } from 'react';
import axios from 'axios';
import { useUser } from './UserContext';

function Login() {
  const [username, setUsername] = useState('');
  const [password, setPassword] = useState('');
  const { updateUserInfo } = useUser();

  const handleLogin = async () => {
    try {
      const res = await axios.post('/api/login', { username, password });
      updateUserInfo(res.data);
      window.location.href = '/';
    } catch (err) {
      console.error('登录失败:', err);
    }
  };

  return (
    <div className="login-form">
      {/* 表单内容同前 */}
    </div>
  );
}

export default Login;

方法三:路由跳转传递状态(临时场景)

适合仅登录跳转时传递信息的简单场景,但页面刷新后状态会丢失,不依赖持久化的情况可以用。

Login.js 跳转时携带状态

import { useState } from 'react';
import axios from 'axios';
import { useNavigate } from 'react-router-dom';

function Login() {
  const [username, setUsername] = useState('');
  const [password, setPassword] = useState('');
  const navigate = useNavigate();

  const handleLogin = async () => {
    try {
      const res = await axios.post('/api/login', { username, password });
      // 跳转首页并携带用户信息
      navigate('/', { state: { userInfo: res.data } });
    } catch (err) {
      console.error('登录失败:', err);
    }
  };

  return (
    <div className="login-form">
      {/* 表单内容同前 */}
    </div>
  );
}

App.js 接收路由状态并更新

import { useLocation } from 'react-router-dom';
import { useState, useEffect } from 'react';

function App() {
  const [tUserInfo, setTUserInfo] = useState({
    name: '默认用户',
    avatar: '/default-avatar.png'
  });
  const location = useLocation();

  useEffect(() => {
    // 读取路由携带的用户信息并更新状态
    if (location.state?.userInfo) {
      setTUserInfo(location.state.userInfo);
    }
  }, [location]);

  return (
    {/* 用户图标展示 */}
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:15:34