Navigate

25 年 7 月 21 日 星期一
566 字
3 分钟

if (isAuthenticated) navigate("/app", { replace: true });

好问题!让我用更直观的方式解释 replace 到底替换了什么:


浏览器历史记录就像一个数组

想象浏览器的历史记录是一个数组,用户的每次导航都会改变这个数组:


1. 正常导航(不使用 replace)

用户操作流程:

text
1. 访问首页:/home
2. 点击登录:/login
3. 登录成功:navigate("/app")

历史记录变化:

js
// 初始状态
history = []

// 访问 /home
history = ['/home']

// 导航到 /login
history = ['/home', '/login']

// 导航到 /app(正常导航,添加新条目)
history = ['/home', '/login', '/app']
//                          ↑ 当前位置

用户按后退按钮:

js
// 第一次后退
history = ['/home', '/login', '/app']
//                   ↑ 回到 /login

// 第二次后退
history = ['/home', '/login', '/app']
//           ↑ 回到 /home

2. 使用 replace: true

用户操作流程:

text
1. 访问首页:/home
2. 点击登录:/login
3. 登录成功:navigate("/app", { replace: true })

历史记录变化:

js
// 初始状态
history = []

// 访问 /home
history = ['/home']

// 导航到 /login
history = ['/home', '/login']

// 导航到 /app(replace: true,替换当前条目)
history = ['/home', '/app']
//                   ↑ 当前位置
//         ↑ /login 被 /app 替换掉了!

用户按后退按钮:

js
// 第一次后退
history = ['/home', '/app']
//           ↑ 直接回到 /home
// /login 页面不存在了,跳过了!

3. 直观对比

导航方式历史记录后退行为
正常导航[/home, /login, /app]app → login → home
replace: true[/home, /app]app → home

4. replace 替换的是什么?

替换的是当前历史记录中的最后一个条目

js
// 替换前(在 /login 页面)
history = ['/home', '/login']
//                   ↑ 当前位置

// 执行 navigate("/app", { replace: true })
history = ['/home', '/app']
//                   ↑ /login 被 /app 替换了

5. 形象比喻

想象历史记录是一摞纸:

正常导航:

text
[第3张纸: /app]     ← 在最上面放一张新纸
[第2张纸: /login]
[第1张纸: /home]

replace: true:

text
[第2张纸: /app]      ← 把最上面的纸换掉
[第1张纸: /home]     ← /login 的纸被扔掉了

总结

replace: true 替换的是:

  • 当前历史记录栈中的最后一个条目
  • 用户当前所在的页面记录
  • 让用户无法通过后退按钮回到被替换的页面

这样用户就不会回到登录页面,而是直接回到登录前的页面!

文章标题:Navigate

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/navigate[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。