You need to enable JavaScript to run this app. React中通过history.push传递的参数无法被目标组件接收怎么办
优惠活动
大模型
产品
解决方案
定价
更多

React中通过history.push传递的参数无法被目标组件接收怎么办

问题原因

你通过history.push的state字段传递的参数,不会直接作为组件的顶层props传入,因此直接在Receipt组件的入参中解构authorized和total无法获取到路由传递的值,你当前打印的初始值是参数未匹配时的默认值。

解决方案

根据你使用的React Router版本选择对应实现:

React Router v5 实现

方法1:使用useLocation钩子(推荐,函数组件通用)

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

export default function Receipt() {
    const location = useLocation();
    // 加可选链和默认值,避免刷新/直接访问页面时state为空报错
    const authorized = location.state?.authorized ?? false;
    const total = location.state?.total ?? 0;

    console.log('authorized: ', authorized);
    console.log('total: ', total);

    if(!authorized){
        return <Redirect to="/" />;
    }
    return (
        <div>
            <h1>hello</h1>
        </div>
    )
}

方法2:从Route注入的props中读取

如果你的路由规则是通过<Route path="/receipt" component={Receipt} />的方式定义的,React Router会自动给Receipt组件注入路由相关props,直接解构即可:

import { Redirect } from 'react-router-dom';

export default function Receipt({ location }) {
    const authorized = location.state?.authorized ?? false;
    const total = location.state?.total ?? 0;
    // 剩余逻辑和上面一致
}

React Router v6 实现

v6版本移除了Redirect组件,替换为Navigate,同样通过useLocation获取state:

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

export default function Receipt() {
    const location = useLocation();
    const authorized = location.state?.authorized ?? false;
    const total = location.state?.total ?? 0;

    console.log('authorized: ', authorized);
    console.log('total: ', total);

    if(!authorized){
        return <Navigate to="/" replace />;
    }
    return (
        <div>
            <h1>hello</h1>
        </div>
    )
}

注意:路由state存储在浏览器会话历史中,用户刷新页面或者直接手动输入receipt页面地址访问时,state会丢失,建议添加默认值兜底,重要参数可以配合全局状态管理(Context、Redux等)存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 10:30:05