在 React Router 的 history 模式中,push 和 replace 方法有什么区别?

React Router 中 pushreplace 的区别

核心差异:对浏览器历史记录的操作方式不同


1. push(推入)
  • 行为特征
    向浏览器的历史记录栈添加新条目
    类似「手机APP的多层返回」效果

  • 用户感知
    点击浏览器后退按钮可回到前一个地址

  • 典型场景

    // 用户从首页点击进入商品详情页
    history.push('/product/123')
    
    • 普通页面跳转(如菜单导航)
    • 需要保留回退路径的交互流程
  • 历史记录变化

    原记录: [ '/home' ]
    操作后: [ '/home', '/detail' ]  ← 新增条目
    

2. replace(替换)
  • 行为特征
    用新地址覆盖当前历史记录
    类似「原地修改便签纸内容」的效果

  • 用户感知
    点击浏览器后退按钮会跳过被替换的地址

  • 典型场景

    // 登录成功后替换当前地址
    history.replace('/dashboard')
    
    • 身份验证跳转(登录/登出)
    • 表单提交后的结果页
    • 不希望用户返回临时页面的场景
  • 历史记录变化

    原记录: [ '/home', '/login' ]
    操作后: [ '/home', '/dashboard' ]  ← 最后一个地址被替换
    

3. 直观对比
操作历史记录示例(操作前 → 操作后)用户点击后退按钮去向
push[A, B] → [A, B, C]回到B
replace[A, B] → [A, C]回到A

4. 开发注意事项
  • 错误处理页面建议使用 replace,避免用户反复提交错误请求
  • 支付流程中的中间页推荐使用 replace,防止用户意外退回造成重复支付
  • 带查询参数的跳转(如筛选条件)通常使用 push,保留参数调整空间
// 实际代码示例
<button 
  onClick={() => history.push('/checkout')} // 正常跳转
>去结算</button>

<button
  onClick={() => history.replace('/thank-you')} // 替换当前页
>确认订单</button>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值