外观
React Router 的两种历史记录是什么?
浏览器模式用 HTML5 History,地址是正常路径,需要服务器把未知路径都回落到同一个 index.html。哈希模式用 # 后面的部分,不需要服务器配合,但地址不适合当正式 URL。
原理
路由把当前 location 和路由表匹配,决定渲染哪个组件。声明式的 <Routes> 和 <Route> 写匹配规则,<Link> 做导航,不会整页刷新。命令式用 useNavigate。
动态段用 :id,在组件里用 useParams 读取。查询字符串用 useSearchParams。嵌套路由用父路由里的 <Outlet> 放子页面,布局只写一次。
浏览器模式下,用户直接打开 /orders/1 或刷新,请求会打到服务器。服务器如果只托管了静态文件又找不到这个路径,就会 404。配置回落到入口 HTML,再由前端路由接着匹配。见 Vue 部署里的同一问题。
数据路由还可以在进入页面前加载数据。加载函数失败要有错误边界,否则整棵路由树卸掉。见 错误边界。
追问
怎么做权限路由?
在路由配置上标权限,导航前判断。没权限就渲染提示或重定向。这只改善体验,接口仍要鉴权。见 权限控制。
<Link> 和 <a> 呢?
站内用 Link 或 navigate,走前端路由。外链和需要整页重新加载的地址用 <a>。下载、邮件链接不要拦下来交给路由。
易错点
- 浏览器模式忘了服务器回落,本地开发正常,刷新线上就 404。
- 路径大小写或末尾斜杠和配置不一致,匹配不到。
- 在渲染期间无条件
navigate,造成重复跳转。放进效果或事件里。