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

React子组件向父组件传值失败,请求排查问题

问题原因及解决方案

1. setState异步特性导致即时打印旧值

React的useState状态更新是异步的,你在调用setLogin({email: childData})后立刻执行console.log(login),此时状态还未完成更新,打印的是更新前的初始值{email: ""}。

要查看更新后的状态,需通过useEffect监听login的变化:

import { useState, useEffect } from "react";

function RouteSwitch(){
    const [login, setLogin] = useState({email: ""});

    useEffect(() => {
        // login状态更新时触发打印
        console.log(login);
    }, [login]);

    function childToParentLogin(childData){
        setLogin({email: childData});
    }

    // 其余代码不变
}

2. 页面刷新导致状态丢失

你用window.location.href跳转页面会触发浏览器全局刷新,RouteSwitch组件会重新挂载,login状态被重置为初始值{email: ""},所以User组件拿到的是空邮箱对象。

应使用react-router-dom的useNavigate钩子实现单页跳转,避免页面刷新:

修改Login.js:

import "../styles/Login.css";
import { Link, useNavigate } from "react-router-dom";
import { useState } from "react";
import Axios from "axios";

function Login({ childToParentLogin }){
    const [email, setEmail] = useState("");
    const [password, setPassword] = useState("");
    const [response, setResponse] = useState("");
    const navigate = useNavigate();

    async function handleSubmit(){
       // 其余验证逻辑不变
        try {
            const data = await Axios.post(url, formData);
            if(data.data === "Correct data"){
                childToParentLogin(email);
                navigate("/login/user"); // 与RouteSwitch中的路由路径保持一致
            }
            setResponse(data.data);
        }catch(erro){
            console.log(erro);
        }
    }
    return (
        ...
    );
}

export default Login;

注意:确保跳转路径/login/user与RouteSwitch中User组件的路由路径完全匹配,之前的/login/usuario路径需修正一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:17:49