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

React中如何将一个组件的state变量传递到另一个组件?

React组件间传递状态的实现方案

场景与现有代码

问题描述

我有SignIn.js和Target.js两个React组件(已导入所有必要依赖),需要把SignIn组件里的username状态变量传递给Target组件,该怎么做?

现有组件代码

SignIn.js

// SignIn.js
function SignIn() {
   const [username, setUsername] = useState('Mickey')
   if (/* condition if true */) {
      setUsername('Mickey Mouse');
   }
   return(
      <div><h1>{username}</h1></div>
   )
}
export default SignIn;

Target.js

// Target.js
function Target() {
    return(
      <div><h1>Hello</h1></div>
   )
}
export default Target;

解决方案

根据两个组件的层级关系,提供以下几种可行方案:

1. 父子组件关系(SignIn直接渲染Target)

如果SignIn是Target的父组件,直接通过props传递状态即可,同时修复原代码中会导致无限重渲染的问题:

修改后的SignIn.js:

// SignIn.js
import Target from './Target';
import { useState, useEffect } from 'react';

function SignIn() {
   const [username, setUsername] = useState('Mickey')

   // 用useEffect避免直接在函数体调用setState导致的无限重渲染
   useEffect(() => {
     if (/* 你的判断条件 */) {
       setUsername('Mickey Mouse');
     }
   }, []);

   return(
      <div>
        <h1>{username}</h1>
        <Target username={username} /> {/* 将username作为props传入Target */}
      </div>
   )
}
export default SignIn;

修改后的Target.js:

// Target.js
function Target({ username }) { // 接收props
    return(
      <div><h1>Hello, {username}</h1></div>
   )
}
export default Target;

2. 兄弟/跨层级组件关系

如果两个组件没有直接父子关系,使用React Context实现全局状态共享是最佳选择:

第一步:创建Context文件

// UserContext.js
import { createContext, useContext, useState, useEffect } from 'react';

const UserContext = createContext();

// 提供状态的Provider组件
export function UserProvider({ children }) {
  const [username, setUsername] = useState('Mickey');

  useEffect(() => {
    if (/* 你的判断条件 */) {
      setUsername('Mickey Mouse');
    }
  }, []);

  return (
    <UserContext.Provider value={{ username }}>
      {children}
    </UserContext.Provider>
  );
}

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

第二步:在共同父组件中挂载Provider

比如在根组件App.js中:

// App.js
import { UserProvider } from './UserContext';
import SignIn from './SignIn';
import Target from './Target';

function App() {
  return (
    <UserProvider>
      <SignIn />
      <Target />
    </UserProvider>
  );
}

第三步:在Target中读取状态

// Target.js
import { useUser } from './UserContext';

function Target() {
  const { username } = useUser();
    return(
      <div><h1>Hello, {username}</h1></div>
   )
}
export default Target;

3. 大型项目备选:状态管理库

如果项目规模较大,需要在多个组件间共享复杂状态,可以使用Redux、Zustand或Jotai这类状态管理库,将username存入全局状态,SignIn负责更新状态,Target负责读取状态。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:06:10