withRouter有什么用,为什么没有withRouter的组件也一样使用

背景:

有人说:

“withRouter可以包装任何自定义组件,将react-router 的 history,location,match 三个对象传入。
无需一级级传递react-router 的属性,当需要用的router
属性的时候,将组件包一层withRouter,就可以拿到需要的路由信息”

还有人说:

如果使用了react-router-redux,则可以直接从state
中的router属性中获取location。不需要再使用withRouter 获取路由信息了

withRouter 就为了获取this.props.location吗,还有没有哪些没注意的地方但是withRouter起了很大作用的例子?

阅读 18.9k
5 个回答

目的就是让被修饰的组件可以从属性中获取history,location,match,
路由组件可以直接获取这些属性,而非路由组件就必须通过withRouter修饰后才能获取这些属性了,
比如

<Route path='/' component={App}/>

App组件就可以直接获取路由中这些属性了,但是,如果App组件中如果有一个子组件Foo,那么Foo就不能直接获取路由中的属性了,必须通过withRouter修饰后才能获取到。

对,就是为了获取location这些参数而已,本质上是个高阶组件,提供一个context。

不是所有需要路由参数的组件都直接与路由相连,withRouter就是解决这个问题的。

个人理解
比如:

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

举个栗子说:当你需要使用使用url做判断,或者需要在组件内部需要url信息来使用,这个时候withRouter这个hoc可以的组件立马拥有路由信息例如: query, params, location, url,search等等

新手上路,请多包涵

原来还有这个好玩意儿,搞的我每次组件要用到路由属性 都要一级一级传下去,真的太烦了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题