BrowserRouter
类型声明
declare function BrowserRouter(
props: BrowserRouterProps
): React.ReactElement;
interface BrowserRouterProps {
basename?: string;
children?: React.ReactNode;
window?: Window;
}
官方推荐BrowserRouter作为React Router在web浏览器中的运行路由。它在浏览器地址栏中使用简洁的URL存储着当前的location信息,并用内置的history栈导航。
<BrowserRouter window>
默认使用当前document.defaultView。
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
有时候出于某些考虑,URL不能发给服务端,这时候需要用HashRouter,比如在一些共享主机的情况,对服务端没有完整的控制权限。在这个情景下,HashRouter允许用hash码存储当前location信息。
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
);
官网不建议使用HashRouter。
HistoryRouter
<unstable_HistoryRouter>
将history的实例当做了props,可以在无React环境使用该实例,或者将其作为一个全局变量。
import React from 'react'
import ReartDOM 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>
)
这个Api带有一个unstable_的前缀,因为你可能会无意识的在项目中添加两个版本的history库,因为不管React Router用的哪个版本,你都必须把一个库添加到package.json。官方并不推荐将history作为直接依赖添加,而是推荐用react-router的内置版本。等官网有了新的机制去检查不匹配的版本,就会去除unstable_前缀。
MemoryRouter
MemoryRouter用数组的方式存储其location信息。和BrowserHistory和HashHistory不同,它不和外部源绑定,如BrowserHistory和HashHistory都和浏览器的history栈有关。这使得它能解决一些特殊场景:在测试中,你可以完全控制history栈,因为它是在内存中控制history
-
<MemoryRouter initialEntries>:默认location为['/'] -
<MemoryRouter initialIndex>:默认指向initialEntries最后一个index
Tip:
大多数React Router测试都是用MemoryRouter,如React Router源码中的一些测试例子就是用的MemoryRouter
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();
});
});
NativeRouter
NativeRouter推荐用在React Native app中
-
<NativeRouter initialEntries>:初始入口默认为['/'] -
<NativeRouter initialIndex>:默认指向初始入口最后一个indeximport * as React from "react"; import { NativeRouter } from "react-router-native";
function App() { return ( {/* The rest of your app goes here */} ); }
Router
Router是被所有router组件(像和)共享的低阶接口。在React中,Router是一个context provider,为app各个部分提供路由信息。
你不需要手动渲染一个Route>,相反,你需要根据环境使用高阶路由。
<Router basename>
属性可用于所有的routes和links,它们的Url的pathname都相对与这个‘base’定位。当渲染一个大型app或者app有多个入口点的时候,这个属性很有用。
StaticRouter
StaticRouter用于在node中渲染React Router app
通过location属性提供当前位置信息。
-
<StaticRouter location>默认为'/