React Router 路由模式
声明式路由怎样接入应用?
- 适用范围: 以下讨论 react-router 的声明式组件路由,数据加载与框架模式有额外能力,不能混用不同模式的接口假设;
- 入口包: 使用与项目版本匹配的 react-router,先创建一个 Router 上下文,再在内部使用 Route、Link 和路由 Hook;
npm install react-router
BrowserRouter 怎样把页面位置映射到 URL?
- History 模式: 使用浏览器路径和 History API,导航可在不整页刷新的情况下更新位置;
- 部署条件: 服务器需要让应用路径回退到入口 HTML,否则直接打开或刷新子路径可能返回 404;
import { BrowserRouter } from "react-router";
const app = (
<BrowserRouter>
<App />
</BrowserRouter>
);
无法配置服务器路径回退时如何选择?
- HashRouter: 把应用路径放在 URL 的 hash 中,hash 不会随普通 HTTP 请求路径发给服务器,因此不需要逐条配置服务端路由回退;
- 取舍: URL 形式、外部链接与服务端可见性不同,应按部署约束选择,不能简单认定 hash 一定不能用于产品;
测试中如何独立控制导航历史?
- MemoryRouter: 在内存维护历史栈,可通过 initialEntries 和 initialIndex 设置起点,适合测试或没有浏览器地址栏的环境;
- 隔离作用: 不修改真实浏览器 URL,便于为某个路由直接构建测试状态;
import { MemoryRouter } from "react-router";
const testView = (
<MemoryRouter initialEntries={["/users/1"]}>
<App />
</MemoryRouter>
);
服务端如何按指定位置渲染路由?
- StaticRouter: 接收请求 location 渲染匹配结果,不执行客户端式有状态导航;
- 模式区别: 带 loader/action 的服务端数据路由需要相应的数据路由集成,不能只包一个 StaticRouter 就假定数据已加载;