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

使用withRouter后仍报TypeError: history.push is not a function怎么修复?

问题原因

  • 你在组件参数中仅解构了id属性,withRouter注入给组件的history属性没有被接收,导致history是未定义状态,调用push方法自然会报错
  • 如果你的项目中react-router-dom版本为v6及以上,该版本已经正式移除了withRouter高阶组件,这种用法本身就不生效,且原有的history.push用法也被替换为新的导航API
  • 额外隐藏问题:firestore.set是异步方法,你当前的写法会在调用set后立刻执行跳转,可能出现数据还未完成写入就已经跳走的情况

解决方案

场景1:使用react-router-dom v5版本

只需要修改组件的参数解构部分,把history从props中取出来即可:

// 把原来的组件参数改成下面这样,加入history的解构
const Session = ({ id, history }) => {
  // 原有代码不变
}

如果要解决异步写入的问题,把提交函数改造成async/await写法:

const handleSubmit = async (e) => {
  e.preventDefault();
  try {
    const userRef = firestore.collection("users").doc(id);
    // 等待写入操作完成再执行后续逻辑
    await userRef.set(
      {
        items: {
          id,
          // 其余变量
        },
      },
      { merge: true }
    );
    console.log(" saved");
    stocksCounter();
    history.push("/");
  } catch (err) {
    console.log(err);
  }
};

场景2:使用react-router-dom v6及以上版本

v6版本推荐使用函数组件专属的useNavigate钩子实现导航,完全不需要使用withRouter:

  1. 替换原有导入,移除withRouter相关代码
// 删除原来的import { withRouter } from "react-router-dom"
import { useNavigate } from "react-router-dom";
  1. 组件内部调用钩子获取导航方法
const Session = ({ id }) => {
  const classes = useStyles();
  const navigate = useNavigate(); // 新增这一行
  // 其余原有代码
}
  1. 替换跳转逻辑,同样建议加上异步等待逻辑:
const handleSubmit = async (e) => {
  e.preventDefault();
  try {
    const userRef = firestore.collection("users").doc(id);
    await userRef.set(
      {
        items: {
          id,
          // 其余变量
        },
      },
      { merge: true }
    );
    console.log(" saved");
    stocksCounter();
    navigate("/"); // 替换原来的history.push("/")
  } catch (err) {
    console.log(err);
  }
};
  1. 修改导出语句,移除withRouter包裹:
export default Session;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:57:03