问题重现

当同时使用两者时,在代码中切换router并不会重新reRender组件,代码如下:

export default connect((state: any) => {  return {    x: state.common.x,  }})(withRouter(Index))

问题原因

connect本身将组件变为pureComponent,next的withRouter并没有对router做任何处理,而是直接返回。

connect 源码return function connect(  mapStateToProps,  mapDispatchToProps,  mergeProps,  {    pure = true,    areStatesEqual = strictEqual,    areOwnPropsEqual = shallowEqual,    areStatePropsEqual = shallowEqual,    areMergedPropsEqual = shallowEqual,    ...extraOptions  } = {}) {}
withRouter源码render() {  return <ComposedComponent    router={this.context.router}    {...this.props as any}  />}

解决方案

1、将withRouter包在connect外层使用。

export default withRouter(  connect((state: any) => {    return {      x: state.common.x,    }  })(Index),)

2、在使用connect时将组件pure的值默认改为false。