作用:把不是通过路由切换过来的组件中,将react-router 的 history、location、match 三个对象传入props对象上
介绍一个简单应用
通过withRouter将三个属性传入组件的props上,路径变化,属性就会变化,属性变化,就会触发componentWillReciveProps这个钩子,我们可以利用这个钩子做一些处理,而要监听路由的变化,就要监听整个项目的路由,所以我们要找到最大的组件 最大的组件是App,但是他是函数式组件,所以我们找到下一级组件Main
Main.js
//当从浏览器中直接输入地址时,withRouter将路由属性传入Main组件的this.props中,通过componentWillReceiveProps全局监测到路由变化,进行逻辑操作 import { withRouter } from 'react-router-dom' //引入withRouter class Main extends Component { constructor(props) { super(props) this.state = { } } componentWillReceiveProps(nextProps) { if (nextProps.location.hash !== this.props.location.hash) { window.leftMenu.forceUpdate(); //当路由不同时,强制更新左边栏组件 } } render() { return ( <div> <Header/> <LeftMenu ref={el => {window.leftMenu = el}}/> <Module/> </div> ) } } export default withRouter(Main) //包裹App.js
根组件中需要使用BrowserRouter包裹,否则会报错信息 You should not use <Route> or withRouter() outside a <Router>
import { BrowserRouter } from "react-router-dom"; function App() { ReactDOM.render( <BrowserRouter> <ConfigProvider locale={locale}> <Main /> </ConfigProvider> </BrowserRouter>, document.getElementById("root") ); } App() if (module.hot) { module.hot.accept('./view/Main.js', function () { App() }) }