在 React router 中通常使用的组件有三种:
关于路由组件,如果我们的应用有服务器响应web的请求,建议使用<BrowserRouter>
组件; 如果使用静态文件服务器,建议使用<HashRouter>
组件
npm install react-router-dom
import React, { Component, Fragment } from 'react';
import { Provider } from 'react-redux';
import { BrowserRouter, Route } from 'react-router-dom';
import store from './store';
import Header from './common/header';
import Home from './pages/home';
import Detail from './pages/detail';
import Login from './pages/login';
class App extends Component {
render() {
return (
<Provider store={store}>
<Fragment>
<BrowserRouter>
<div>
<Header />
<Route path='/' exact component={Home}></Route>
<Route path='/login' exact component={Login}></Route>
<Route path='/detail/:id' exact component={Detail}></Route>
</div>
</BrowserRouter>
</Fragment>
</Provider>
)
}
}
export default App;
BrowserRouter(history模式) 和 HashRouter(hash模式)作为路由配置的最外层容器,是两种不同的模式,可根据需要选择。
class App extends Component {
render() {
return (
<BrowserRouter>
<Header />
<Route path='/' exact component={Home}></Route>
<Route path='/login' exact component={Login}></Route>
<Route path='/detail/:id' exact component={Detail}></Route>
</BrowserRouter>
)
}
}
class App extends Component {
render() {
return (
<HashRouter>
<Header />
<Route path='/' exact component={Home}></Route>
<Route path='/login' exact component={Login}></Route>
<Route path='/detail/:id' exact component={Detail}></Route>
</HashRouter>
)
}
}
有以下几个参数:
<Route path='/about' exact render={() => (<div>about</div>)}></Route>
渲染与该地址匹配的第一个子节点
Link 和 NavLink 都可以用来指定路由跳转,NavLink 的可选参数更多。
两种配置方式:
<Link to='/login'>
<span>登录</span>
</Link>
<Link to={{
pathname: '/login',
search: '?name=cedric',
hash: '#someHash',
state: { fromDashboard: true }
}}>
<span>登录</span>
</Link>
可以看做 一个特殊版本的 Link,当它与当前 URL 匹配时,为其渲染元素添加样式属性。
<Link to='/login' activeClassName="selected">
<span>登录</span>
</Link>
<NavLink
to="/login"
activeStyle={{
fontWeight: 'bold',
color: 'red'
}}
>
<span>登录</span>
</NavLink>
const oddEvent = (match, location) => {
if (!match) {
return false
}
const eventID = parseInt(match.params.eventID)
return !isNaN(eventID) && eventID % 2 === 1
}
<NavLink
to="/login"
isActive={oddEvent}
>login</NavLink>
class Center extends PureComponent {
render() {
const { loginStatus } = this.props;
if (loginStatus) {
return (
<div>个人中心</div>
)
} else {
return <Redirect to='/login' />
}
}
}
也可使用对象形式:
<Redirect
to={{
pathname: "/login",
search: "?utm=your+face",
state: { referrer: currentLocation }
}}
/>
withRouter 可以将一个非路由组件包裹为路由组件,使这个非路由组件也能访问到当前路由的match, location, history对象。
import { withRouter } from 'react-router-dom';
class Detail extends Component {
render() {
··· ···
}
}
const mapStateToProps = (state) => {
return {
··· ···
}
}
const mapDispatchToProps = (dispatch) => {
return {
··· ···
}
}
export default connect(mapStateToProps, mapDispatchToProps)(withRouter(Detail));
项目执行npm run build
后,将打包后的build文件当大 Nginx 配置中。
如果 react-router 路由 使用了 history 模式(即
location / {
··· ···
try_files $uri /index.html;
··· ···
}
}
如果 react-router 路由 使用了 hash 模式(即
原文:https://www.cnblogs.com/cckui/p/11490372.html