核心组件
react-router 中有三种主要类型的组件,分别是
- 路由: 如
<BrouwserRouter>,
<HashRouter>
- 路由匹配器: 如
<Route>
,<Switch>
- 导航:如
<Link>
,<NavLink>
,<Redirect>
通常,导航也称为路径变更器。
所有在 web 应用中使用的组件都应该从 react-router-dom 包中引入
路由
所有 react-router 应用的核心组件都是路由组件。 对于 web 应用,react-router-dom 提供了
<BrowserRouter>
使用 url 路径来导航。通常情况下,这是最美观和优雅的方式。但是前提是 web 服务器的被正确的配置。也就是说,你的 web 服务器必须将所有 react-router-dom 在客户端管理的路由指向相同的页面(index.html),否则在你刷新页面的时候就会因为无法找到服务器资源而返回 404 错误。Create React App 在开发环境中已经默认开启了这项配置,同时也提供了在生产环境中的配置向导<HashRouter
在 url 中的 hash 部分存储路径, 所以路径长得会像是这样:http://example.com/#/your/page
。 因为 hash 部分在发起服务器请求是会被自动忽略,所以服务端不需要特殊的配置即可支持这种路由。
使用路由的过程中,请确保路由组件正确包裹所有需要渲染的路由路径。通常情况下,我们推荐用路由组件包裹整个 react 项目的根组件:
import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter } from 'react-router-dom'
function App() {
return <h1>Hello React Router</h1>
}
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
)
路径匹配器
react-router-dom 提供了两个路由匹配组件:Switch 和 Route。当<Switch>
被渲染,它会搜索其 children <Route>
内容找到一个其 path 当前的 URL 匹配。当找到时,它将渲染该对象。 而<Route>
而忽略所有其他对象。这意味着您应将<Route>
的特定性更高(通常情况下代表更长的)放在不那么特定的路径之前。(比如/post/aaa/bbb
应该放在/post/aaa
之前,防止 Switch 组件渲染后者对应的组件)
如果没有
<Route>
匹配项,则<Switch>
渲染器不呈现任何内容
import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom'
function App() {
return (
<div>
<Switch>
{/* If the current URL is /about, this route is rendered
while the rest are ignored */}
<Route path="/about">
<About />
</Route>
{/* Note how these two routes are ordered. The more specific
path="/contact/:id" comes before path="/contact" so that
route will render when viewing an individual contact */}
<Route path="/contact/:id">
<Contact />
</Route>
<Route path="/contact">
<AllContacts />
</Route>
{/* If none of the previous routes render anything,
this route acts as a fallback.
Important: A route with path="/" will *always* match
the URL because all URLs begin with a /. So that's
why we put this one last of all */}
<Route path="/">
<Home />
</Route>
</Switch>
</div>
)
}
ReactDOM.render(
<Router>
<App />
</Router>,
document.getElementById('root')
)
注意:
<Route path>
仅仅代表从路由的开头开始匹配,而不是匹配整个 url。 所以<Route path="/">
会始终匹配所有的 url。因此,我们通常将其放在<Switch>
的最后一项。另一种可能的解决方案是使用<Route exact path="/">
注:尽管 react-router 支持在
<Switch>
组件之外渲染<Route>
,在 5.1 版本之后,我们建议您使用 useRouteMatch() hook。并且。我们不建议您渲染没有 path 的<Route>
,而是使用 hooks 来获得你需要的与路由相关的参数。
导航
react-router 提供了<Link>
组件在 web 应用中提供路由跳转。<Link>
组件会在你的 dom 中生成一个<a>
元素。
<Link to="/">Home</Link>
// <a href="/">Home</a>
<NavLink>
是一种特殊的<Link>
,当他代表的路由正在被渲染是他会获得 active 的 css 类名,
<NavLink to="/react" activeClassName="hurray">
React
</NavLink>
// When the URL is /react, this renders:
// <a href="/react" className="hurray">React</a>
// When it's something else:
// <a href="/react">React</a>
当你想要强制路由跳转时,你可以渲染一个<Redirect>
组件,他会将页面跳转到 to 属性描述的路由中
<Redirect to="/login" />