React Router v6 官方文档翻译 (四) ---- 各种类型的Router
原文路径:https://reactrouter.com/docs/en/v6/routers/browser-router
BrowserRouter
类型声明:
declare function BrowserRouter(
props: BrowserRouterProps
): React.ReactElement;
interface BrowserRouterProps {
basename?: string;
children?: React.ReactNode;
window?: Window;
}
BrowserRouter是React Router推荐使用的接口。BrowserRouter基于浏览器内置(H5 API)的history stack来存储当前浏览器地址栏的location信息。
<BrowserRouter window>
默认会使用当前document的defaultView
,他在业务使用中还也可用来在另外一个浏览器window环境下(比如iframe中)追溯URL的变化。
使用范例:
import * as React from "react";
import * as ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";
ReactDOM.render(
<BrowserRouter>
{/* The rest of your app goes here */}
</BrowserRouter>,
root
);
HashRouter
类型声明:
declare function HashRouter(
props: HashRouterProps
): React.ReactElement;
interface HashRouterProps {
basename?: string;
children?: React.ReactNode;
window?: Window;
}
HashRouter用在基于浏览器的web项目中,而且不需要通过后端服务来控制路由跳转。他的原理是基于浏览器的锚点,通过设置不同的锚点来达到跳转页面的效果。
也可以有<HashRouter window>
的写法,作用同<BrowserRouter window>
。
使用范例:
import * as React from "react";
import * as ReactDOM from "react-dom";
import { HashRouter } from "react-router-dom";
ReactDOM.render(
<HashRouter>
{/* The rest of your app goes here */}
</HashRouter>,
root
);
官方优先推荐使用BrowserRouter,他是基于H5标准制定的,更加规范,有原生的API可以使用;同时,BrowserRouter还可以将当前路由信息发送给server,便于数据同步;此外在一些特殊场景下,会丢失hash信息,以至于HashRouter不能使用,比如将URL使用微信分享。
HistoryRouter
类型声明:
declare function HistoryRouter(
props: HistoryRouterProps
): React.ReactElement;
interface HistoryRouterProps {
basename?: string;
children?: React.ReactNode;
history: History;
}
<unstable_HistoryRouter>
提供一个将history作为prop的实例对象。可以使用它在非React的上下文环境或全局变量中使用Router。
范例:
import * as React from "react";
import * as ReactDOM from "react-dom";
import { unstable_HistoryRouter as HistoryRouter } from "react-router-dom";
import { createBrowserHistory } from "history";
const history = createBrowserHistory({ window });
ReactDOM.render(
<HistoryRouter history={history}>
{/* The rest of your app goes here */}
</HistoryRouter>,
root
);
此API的前缀为“unstable_”,因为您可能会无意中将历史库的两个版本都添加到应用程序中。如果您使用的开发工具允许,建议不要将history添加为直接依赖项,而是依赖react-router包中的嵌套依赖项。一旦我们有了检测不匹配版本的机制,这个API将删除其“unstable_”的前缀。
MemoryRouter
类型声明:
declare function MemoryRouter(
props: MemoryRouterProps
): React.ReactElement;
interface MemoryRouterProps {
basename?: string;
children?: React.ReactNode;
initialEntries?: InitialEntry[];
initialIndex?: number;
}
<MemoryRouter>
将location信息存在一个数组中. 不同于 <BrowserHistory>
和 <HashHistory>
, 他不使用额外的资源(比如浏览器history stack)。它适用于你想要完全控制history stack的场景。比如单元测试。
他有两个参数:
<MemoryRouter initialEntries>
默认为["/"]
(单一入口’/‘) 他是历史堆栈中的位置数组。这些对象可以是包含{pathname, search, hash, state}
的完整位置对象,也可以是简单的字符串url<MemoryRouter initialIndex>
默认为initialEntries
的最后一个索引,可传递任意的索引位置
Tip: 大多数React Router的测试都是用了
<MemoryRouter>
作为路由入口, 这里有很多测试范例:browsing through our tests.
使用范例:
import * as React from "react";
import { create } from "react-test-renderer";
import {
MemoryRouter,
Routes,
Route,
} from "react-router-dom";
describe("My app", () => {
it("renders correctly", () => {
let renderer = create(
<MemoryRouter initialEntries={["/users/mjackson"]}>
<Routes>
<Route path="users" element={<Users />}>
<Route path=":id" element={<UserProfile />} />
</Route>
</Routes>
</MemoryRouter>
);
expect(renderer.toJSON()).toMatchSnapshot();
});
});
NaviteRouter
类型声明:
declare function NativeRouter(
props: NativeRouterProps
): React.ReactElement;
interface NativeRouterProps extends MemoryRouterProps {}
<NativeRouter>
是React Router推荐的在React Native App中使用的路由类型。
他有两个可选参数:
<NativeRouter initialEntries>
默认为["/"]
<NativeRouter initialIndex>
默认为initialEntries
的最后一个索引
使用范例:
import * as React from "react";
import { NativeRouter } from "react-router-native";
function App() {
return (
<NativeRouter>
{/* The rest of your app goes here */}
</NativeRouter>
);
}
StaticRouter
类型声明:
declare function StaticRouter(
props: StaticRouterProps
): React.ReactElement;
interface StaticRouterProps {
basename?: string;
children?: React.ReactNode;
location?: Path | LocationPieces;
}
<StaticRouter>
用于在 node 中渲染React Router。其通过 location
prop 来提供路由信息。
有一个可选参数:
<StaticRouter location>
默认是"/"
使用范例:
import * as React from "react";
import * as ReactDOMServer from "react-dom/server";
import { StaticRouter } from "react-router-dom/server";
import http from "http";
function requestHandler(req, res) {
let html = ReactDOMServer.renderToString(
<StaticRouter location={req.url}>
{/* The rest of your app goes here */}
</StaticRouter>
);
res.write(html);
res.end();
}
http.createServer(requestHandler).listen(3000);
Router (不推荐)
类型声明:
declare function Router(
props: RouterProps
): React.ReactElement | null;
interface RouterProps {
basename?: string;
children?: React.ReactNode;
location: Partial<Location> | string;
navigationType?: NavigationType;
navigator: Navigator;
static?: boolean;
}
<Router>
接口是上述其他类型Router所共享的核心组件,为其他高级Router提供理由信息上下文(context provider),使用优先级最低。
开发者几乎不需要直接使用这个API,推荐使用上边更高阶的路由。
他有一个参数:
<Router basename>
使用basename共享一个根路由。在大型项目或者多入口工程化文件中使用有奇效。
That's All. 下期讲内置组件的使用。