官方文档

一、withRouter的使用

withRouter可以包装任何自定义组件,将react-router 的 history,location,match 三个对象传入。

  1. <Route exact path="/Home" component={Home}/>
  1. 只有包裹在Route组件里的才能使用this.props.location
  2. 假如有个需求,是面包屑或者导航组件里需要拿到this.props.location(导航组件或者面包屑一般不会包裹在Route里吧),那么直接这么写显然就不行了,这个时候withRouter修饰一下,就可以这么写了。


二、使用withRouter跳转页面

关于this.props.history
在 React 中正常来说只有在 包裹的组件中才能在 this.props 属性中找到 history 对象。但有些情况下我们就是希望在一个没被 包裹的组件中用到 history 对象,我们可以这样用

  1. import { withRouter } from 'react-router-dom'
  2. export default withRouter(YourComponent)
  3. //此时就可以在组件中使用this.props.history跳转路由了
  4. this.props.history.push({pathname:"/path/"});

三、路由传参

3-1 params方式传参

  1. <Route path='/path/:name' component={Path}/>
  2. <Link to="/path/2">xxx</Link>
  3. this.props.history.push({pathname:"/path/" + name});
  4. 读取参数用:this.props.match.params.name

优势 : 刷新地址栏,参数依然存在
缺点 : 只能传字符串,并且如果传的值太多的话,url会变得长而丑陋。

3-2 query方式传参

  1. <Route path='/query' component={Query}/>
  2. <Link to={{ pathname : ' /query' , query : { name : 'sunny' }}}>
  3. this.props.history.push({pathname:"/query",query: { name : 'sunny' }});
  4. 读取参数用: this.props.location.query.name

优势:传参优雅,传递参数可传对象;
缺点:刷新地址栏,参数丢失

3-3 state方式传参

  1. <Route path='/sort ' component={Sort}/>
  2. <Link to={{ pathname : ' /sort ' , state : { name : 'sunny' }}}>
  3. this.props.history.push({pathname:"/sort ",state : { name : 'sunny' }});
  4. 读取参数用: this.props.location.state.name

优势:传参优雅,传递参数可传对象,state传的参数是加密的
缺点:刷新地址栏,参数丢失

3-4 search方式传参

  1. <Route path='/web/departManange ' component={DepartManange}/>
  2. <link to="web/departManange?tenantId=12121212">xxx</Link>
  3. this.props.history.push({pathname:"/web/departManange?tenantId" + row.tenantId});
  4. 读取参数用: this.props.location.search

优势 : 刷新地址栏,参数依然存在
缺点 : 只能传字符串,并且如果传的值太多的话,url会变得长而丑陋。

四、组件懒加载

React.lazy 函数能让你像渲染常规组件一样处理动态引入(的组件)。
如果在 MyComponent 渲染完成后,包含 OtherComponent 的模块还没有被加载完成,我们可以使用加载指示器为此组件做优雅降级。这里我们使用 Suspense 组件来解决。

  1. import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
  2. import React, { Suspense, lazy } from 'react';
  3. const Home = lazy(() => import('./routes/Home'));
  4. const About = lazy(() => import('./routes/About'));
  5. const App = () => (
  6. <Router>
  7. //fallback 属性接受任何在组件加载过程中你想展示的 React 元素
  8. <Suspense fallback={<div>Loading...</div>}>
  9. <Switch>
  10. <Route exact path="/" component={Home}/>
  11. <Route path="/about" component={About}/>
  12. </Switch>
  13. </Suspense>
  14. </Router>
  15. );