当使用 hash
或 history
的方式去改变网址路径(path)
时,并不会刷新网页或发出请求
通过监听 hash
或 history
的变化来动态的切换组件的显示
据此,可以维护 path(路径)
跟 component(组件)
的 一对一的路由
而管理这些route(路由)
的就是router(路由器)
路由的实现,是基于BOM的history,从而实现网页不刷新,局部更新页面。
yarn add react-router-dom
import React from 'react'
import ReactDOM from 'react-dom'
import {BrowserRouter} from 'react-router-dom'
import App from './App'
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>
, document.getElementById('root'))
import React, { Component } from 'react'
import { Link, Route } from 'react-router-dom'
import About from './components/About'
import Home from './components/Home'
export default class App extends Component {
render() {
return (
<div>
<div className="row">
<div className="col-xs-offset-2 col-xs-8">
<div className="page-header"><h2>React Router Demo</h2></div>
</div>
</div>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
{/* About
Home */}
<Link className="list-group-item" to="/home">Home</Link>
<Link className="list-group-item" to="/about">About</Link>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
<Route path="/home" component={About}></Route>
<Route path="/about" component={Home}></Route>
</div>
</div>
</div>
</div>
</div>
)
}
}
import React, { Component } from 'react'
export default class Home extends Component {
render() {
return (
<div>
<h3>我是Home的内容</h3>
</div>
)
}
}
import React, { Component } from 'react'
export default class About extends Component {
render() {
return (
<div>
<h3>我是About的内容</h3>
</div>
)
}
}
明确好界面中的导航区、展示区
导航区的a
标签改为Link
标签
<Link to="/xxxxx">Demo</Link>
<Route path='/xxxx' component={Demo}/>
的最外侧包裹了一个
或
Link
用于更改 path
Route
用于注册路由BrowserRouter
为 history
模式路由器,需要包裹在 App
标签外,以保证所有路由都受它管理HashRouter
为 hash
模式路由器,需要包裹在 App
标签外,以保证所有路由都受它管理NavLink
: 相比于 Link
, 在激活时会应用 active
类名,该类名可以通过 activeClassName
<NavLink activeClassName="active" path="/about" component={About}>About</NavLink>
//当该link被点击时,会在类中添加一个 active类,从而实现样式的添加
Switch
: 选择路由时,匹配成功就停止不再继续向下匹配,如下<!-- 如果当前 路径为 /home 那么最后两个组件都会被显示 -->
<Route path="/about" component={About} />
<Route path="/home" component={Home} />
<Route path="/home" component={Home} />
<!-- 如果使用 Switch 包裹路由 那么在第一次成功匹配后,就不会再继续向下匹配,因此只显示第二个组件-->
<Switch>
<Route path="/about" component={About} />
<Route path="/home" component={Home} />
<Route path="/home" component={Home} />
</Switch>
//1.通常情况下,path和component是一一对应的关系。
//2.Switch可以提高路由匹配效率(单一匹配)。
Redirect
: 重定向,一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由
<Switch>
<Route path="/about" component={About} />
<Route path="/home" component={Home} />
<!-- 当其他路由都匹配不上时,将当前路由路径重定向到 /home -->
<Redirect to="/home" />
</Switch>
/home/a/b/c
,那么 以下路由会显示,因为 /home
模糊匹配成功<Route path="/home" component={Home} />
严格匹配(指定exact)
,则必须路由路径完全相同<Route exact path="/home" component={Home} /> // 不显示
<Route exact path="/home/a/b/c" component={Home} /> // 显示
react
都会从最开始注册的路由,到最后注册的路由,依次进行匹配<Route path="/home/news" component={news} />
一般组件:
路由组件:
<Link replace to="/home/news">news</Link>
this.props.history
上的方法进行导航(注意区分,路由组件所独有的history属性)this.props.history.push(pathname, state)
this.props.history.replace(pathname, state)
this.props.history.go(n)
this.props.history.goBack()
this.props.history.goForward()
import {withRouter} from 'react-router-dom'
class Header extends Component {
...
}
export default withRouter(Header) // 导出包装后的对象