ReactTraining/react-router的github地址: https://reacttraining.com/react-router/
相關(guān)文檔:View the docs here
相關(guān)組件介紹
HashRouter 有#號蔓纠,錨點實現(xiàn)
整個路由容器苞慢,將來配置路由,是一定要有一個HashRouter
BrowserRouter 沒有#號 <h5><h5>實現(xiàn)
路由鏈接 <Link>: to
Link: to屬性,表示的點擊這個Link,跳轉(zhuǎn)到的路由, Link最終渲染成a標簽
相當于vue中 router-link 配置路由的連接,最終會渲染成一個a標簽
路由鏈接<NavLink>
作用和Link是一樣的,路由跳轉(zhuǎn) NavLink比Link更強大的一點是可以指定樣式
配置路由規(guī)則
如何在react項目中使用react-router惫霸?
- 安裝react-router包:npm i react-router-dom
- 需要引入一些組件
import React from 'react'
import Home from './components/Home.jsx'
import User from './components/User.jsx'
import Login from './components/Login.jsx'
import News from './components/News.jsx'
import Nested from './components/Nested.jsx'
import { BrowserRouter, Link, Route, Redirect } from 'react-router-dom';
class App extends React.Component {
// HashRouter 有#號猫缭,錨點實現(xiàn)
// BrowserRouter 沒有#號 <h5><h5>實現(xiàn)
render() {
return (
<BrowserRouter>
<ul>
<li>
<Link to="/home">首頁</Link>
</li>
<li>
<Link to="/user">用戶</Link>
</li>
<li>
<Link to="/login">登陸</Link>
</li>
<li>
<Link to="/nested">嵌套</Link>
</li>
</ul>
{/* 路由都匹配上exact表示精確匹配 */}
{/* <Route path="/" component={Home} exact></Route> */}
{/* Redirect: 表示路由的重定向 */}
<Redirect from="/" to="/home"></Redirect>
<Route path="/home" component={Home}></Route>
<Route path="/user" component={User}></Route>
<Route path="/login" component={Login}></Route>
<Route path="/nested" component={Nested}></Route>
{/* /news/:id 表示匹配 /news/xx /news/a /news/b */}
{/* <Route path="/news/:id" component={News}></Route> */}
<Route path="/news/:type/:id" component={News}></Route>
</BrowserRouter>
)
}
}
export default App
Home.jsx
import React from 'react'
export default class Home extends React.Component {
render() {
return <div>首頁</div>
}
}
<Switch>
使用Switch把一組route包裹起來,保證只顯示一個組件
<Switch>
<Route path="/home" component={Home} />
<Route path="/user" component={User} />
<Route path="/login" component={Login} />
</Switch>
exact
path="/" 只要是/xxx的路由都匹配上exact表示精確匹配
<Route path="/" component={Home} exact></Route>
路由參數(shù)
/news/:id 表示匹配 /news/xx /news/a /news/b
通過props.match就可以獲取到路由的參數(shù)
news.jsx
import React from 'react'
export default class News extends React.Component {
render() {
// console.log(this.props)
let { match } = this.props
console.log(match)
return (
<div>這是News組件</div>
)
}
}
Redirect: 表示路由的重定向
<Redirect exact from="/" to="/home" />
withRouter : js來實現(xiàn)react中路由的跳轉(zhuǎn)
react-router編程式導(dǎo)航實現(xiàn)路由跳轉(zhuǎn)
如果想要通過js來實現(xiàn)react中路由的跳轉(zhuǎn)
- 導(dǎo)入withRouter方法
- 使用withRouter包裹住當前組件
- withRouter把當前組件包裹后它褪,在當前組件的props中就能夠獲取history對象饵骨,通過history對象就可以實現(xiàn)路由的額跳轉(zhuǎn)
Login.jsx相關(guān)代碼
import React from 'react'
import {withRouter} from 'react-router-dom'
class Login extends React.Component {
render() {
console.log(this.props.history)
let {history} = this.props
return (
<div>
這是Login組件{' '}
<button onClick={() => history.push('./home')}>點擊redirect</button>
</div>
)
}
}
export default withRouter(Login)
嵌套路由
import React from 'react'
import {NavLink, Switch, Route} from 'react-router-dom'
export default class Nested extends React.Component {
render() {
return (
<div>
<ul>
<li>
<NavLink to="/nested/roles">角色管理</NavLink>
</li>
<li>
<NavLink to="/nested/list">列表管理</NavLink>
</li>
<li>
<NavLink to="/nested/product">商品管理</NavLink>
</li>
</ul>
<Switch>
<Route path="/nested/roles" component={Roles}></Route>
<Route path="/nested/list" component={List}></Route>
<Route path="/nested/product" component={Product}></Route>
</Switch>
</div>
)
}
}
function Roles() {
return <div>這是roles組件</div>
}
function List() {
return <div>這是list組件</div>
}
function Product() {
return <div>這是product組件</div>
}