在 ReactJS 中从另一个 React 组件更新状态

Updating a state from another React component in ReactJS

我在 App.js 组件中有一个 api 调用,我从这里获取用户名以在导航栏中显示它。您可以看到导航栏组件将名称 属性 作为参数传递给它。这就是我的 App.js 代码的样子

function App() {

  const[name,setName] = useState(null);

  useEffect(()=> {

    (
        async () => {
          try{
            const res =  await fetch('https://localhost:44361/api/users/getuser', {
                headers: {"Content-Type": 'application/json;charset=UTF-8'},
                credentials: 'include',
            });
            const content = await res.json();
            console.log(content);
            setName(content[0].uFirstName); // has to be content[0]
          }
          catch(e){
            console.log(e);
          }
        }
    )();
  },[name])
return (
    
     <Router>
       <div className="App">

           <Navbar name = {name}/>

           <Routes>

            <Route exact path="/" element={ <Home />} />

            <Route path="/registration" element = {<Registration/>} />

            <Route path="/login" element = {<Login/>} />

           </Routes>
      </div>
     </Router>
  );
}

export default App;

现在我想从 Login.js 组件更新名称 属性。 Login.js 看起来像这样:

function Login() {
    
    // const[name,setName] = useState(null);
    const[UEmail,setEmail] = useState(null);
    const[UPassword,setPassword] = useState(null);
    const[navigate, setNavigate] = useState(false);

    const submitHandler = async (e) => 
    {
        e.preventDefault(); // Prevent from being refreshed. Because User will not re-put every field if some field is wrong
        try{
            const res = await fetch('https://localhost:44361/api/users/login', {
                method: 'POST',
                headers: {"Content-Type": 'application/json;charset=UTF-8'},
                credentials: 'include',
                body : JSON.stringify({
                    UEmail,
                    UPassword
                })
            });

            var content = await res.json();

            if(res.status === 200)
            {
                  setNavigate(true);
                 //DO something
            }

            else if(res.status === 400){
                //DO something
            }
            
        }catch(err){
            console.log(err);
        }
    }
    if(navigate) // REDIRECT TO LOGIN PAGE AFTER BEING SUCCESSFULLY REGISTERED
    {
        return <Navigate to="/"/>
    }
    return (
        <div className="fullContainer">
            <div className="base-container">
                <div className="reg">Login</div>
                <div className="content">
                    <div className="form">
                        <div className="form-group">
                        
                            <input name="Email" type="email" placeholder="Email" required
                            onChange={e => setEmail(e.target.value)}
                            />
                        </div>
                        <div className="form-group">
                        
                            <input name="Password" type="password" placeholder="Password" required
                            onChange={e => setPassword(e.target.value)}
                            />
                        </div>
                    </div>
                </div>
                <div className="footer">
                    <button onClick={submitHandler} type="button" className="btn">Login</button>
                </div>
                <div className="toReg">
                <p>Don't have an account? 
                    <Link to="/registration">
                        <a> Register</a>
                    </Link>
                </p>
                </div>
            </div>
            </div>
    )
}

export default Login

用户在输入所有凭据后单击登录按钮后,如何更新 App.js 中的名称。我想这样做是因为,在状态代码为 200 时将用户导航到主页后,用户名在导航栏中没有更改。我需要重新加载才能在导航栏中看到正确的用户名。

谢谢。

将 App 的回调 setName 传递给登录组件。

更改函数:

function Login({setName}) {

并传递回调:

<Login setName={setName} />

现在您可以在登录组件中调用 setName

更简单的方法是使用上下文。创建一个文件并在该文件中添加您想要跨项目 change/use 的变量,然后将您的项目包装在上下文中,最后在您不会将其与 'react' 中的 useContext 一起使用的文件中调用该方法或变量.

你会在这里找到你需要的一切:https://www.toptal.com/react/react-context-api