共计 2686 个字符,预计需要花费 7 分钟才能阅读完成。
本次使用 react-router 版本为 5.0.1
本教程前提是你的应用程序是一个 web 应用程序,使用’react-router-dom‘包来实现页面的路由
在 React router 中有三种类型的组件,一是 路由组件
第二种是 路径匹配组件
第三种是 导航组件
。
路由组件: BrowserRouter
和 HashRouter
路径匹配的组件: Route
和 Switch
导航组件: Link
安装
npm install react-router-dom
简单用法
import React from 'react'
import TodoList from './components/TodoList'
import {BrowserRouter as Router, Route, Link} from 'react-router-dom'
import './App.css'
const App: React.FC = () => {
return (
<div className='App'>
<Router>
<Link to='/'>root</Link> <br />
<Link to='/hello'>hello</Link> <br />
<Link to='/todolist'>todolist</Link>
<div>
<Route path='/' exact render={() => {return <div>root page</div>}} />
<Route path='/hello' render={() => {return <div>hello world</div>}} />
<Route path='/todolist' component={TodoList} />
</div>
</Router>
</div>
)
}
export default App
通过上面的代码我么就实现了我们项目的基本路由功能,Router
组件决定了我们使用 html5 history api,Route
组件定义了路由的匹配规则和渲染内容,使用 Link
组件进行路由之间的导航。使用 exact
属性来定义路径是不是精确匹配。
使用 url 传参数
<Route path='/hello/:name' render={({match}) => {return <div>hello {match.params.name}</div>
}} />
使用 <Route>
匹配的 react 组件会在 props 中包含一个 match
的属性, 通过match.params
可以获取到参数对象
调用方法跳转
<Route path='/hello/:name' render={({match, history}) => {
return <div>
hello {match.params.name}
<button onClick={()=>{history.push('/hello')
}}>to hello</button>
</div>
}} />
使用 <Route>
匹配的 react 组件会在 props 中包含一个history
的属性,history 中的方法
- history.push(url) 路由跳转
- hisroty.replace(url) 路由跳转不计入历史记录
- history.go(n) 根据索引前进或者后退
- history.goBack() 后端
- history.goForward() 前进
常用组件介绍
BrowserRouter
使用 HTML5 历史记录 API(pushState,replaceState 和 popstate 事件)的 <Router>,以使您的 UI 与 URL 保持同步。
属性:
1.basename: string 如果你的项目在服务器上的一个子目录那么这个 basename 就是目录的名称例如/calendar
<BrowserRouter basename="/calendar" />
<Link to="/today"/> // renders <a href="/calendar/today">
2.getUserConfirmation
function getConfirmation(message, callback) {const allowTransition = window.confirm(message);
callback(allowTransition);
}
<BrowserRouter getUserConfirmation={getConfirmation} />;
3.forceRefresh:bool 如果为 true 在页面导航的时候后采用整个页面刷新的形式。
4.keyLength location.key(表示当前位置的唯一字符串)的长度。默认为 6。
5.children:node 要渲染的子元素。
Route
主要职责是当 Route 的位置和路径匹配的时候渲染对应的 ui
属性:
用于渲染的 props
1.component
一个 react 组件,将在 path
匹配的时候自动渲染
2.render:func
通过编写一个方法,方法返回一个 react dom , 当 path 匹配的时候自动渲染
3.children:func
同样是一个方法,匹配规则时无论 path 是否匹配都会渲染, 但是 match 属性只有在路由匹配的时候才会有值。这样方便你根据路由是否匹配渲染不同的 ui
<Route path='/hello' exact children={({match, history, location}) => {
return <div>
hello {match ? 'match' : ''}
</div>
}}></Route>
上面的三种方法都能在组件中获取到 route 传过去的三个 propshistory / location / match
其他属性:
4.path:string | string[]
需要匹配的路径或者路径数组
5.exact:bool
如果为 true,则仅在路径与 location.pathname 完全匹配时才匹配。
6.strict
如果为 true,则具有尾部斜杠的路径将仅匹配具有尾部斜杠的 location.pathname。当 location.pathname 中有其他 URL 段时,这不起作用。
7.sensitive:bool
匹配规则对大小写是否敏感,true 的话为区分大小写。
Link
导航到指定的路由
属性:
1.to:string|object
如果值为字符串,则导航到字符串所在的路由
object:
- pathname : 表示链接到的路径的字符串
/hello
- search :query 参数
?name=cfl
- hash : hash 的值
#weixin
- state
Switch
呈现于于 location.pathname 所匹配的第一个 <Route> 或 <Redirect>。