反应路由器终极版滞后一个历史的一步,当路由器接收状态behing(React router redu

2019-09-30 16:59发布

这里是全代码演示问题回购- https://github.com/Misiur/ReactRouterReduxBug

在线- https://codesandbox.io/s/v88B5LG0

看看这个代码

class Main extends Component {
  componentWillReceiveProps(nextProps) {
    if (this.props.match.params.page !== nextProps.match.params.page) {
      console.log(`Page changed to ${nextProps.match.params.page}`);
    } else {
      console.log('Page did not change');
      console.log(newProps.location.pathname);
      console.log(newProps.history.location.pathname);
    }
  }

  render() {
    const page = this.props.match.params.page;

    return (
      <div>
        <strong>Current page is {page}</strong><br />
        <Link to="/1">Page 1</Link><br />
        <Link to="/2">Page 2</Link><br />
        <Link to="/3">Page 3</Link><br />
        <Link to="/4">Page 4</Link><br />
        <Link to="/5">Page 5</Link>
      </div>
    );
  }
}

const RawRouting = (props) => {
  // Do something with this.props.state
  // console.log(props);

  return (
    <Route path="/:page(\d+)?" component={Main} />
  );
};

const Routing = connect(state => ({ state }))(RawRouting);

const App = () => {
  return (
    <Provider store={store}>
      <ConnectedRouter history={history}>
        <Routing />
      </ConnectedRouter>
    </Provider>
  );
};

我们有App该脚手架商店和路由器, Routing定义路由,是connect编的状态Main成分显示页面和链接的网页。

当你点击链接,一切工作正常。 然而,当你把浏览器的后退按钮,第一次URL的变化,但路线参数不对,因为newProps.location.pathname的背后是一个历史的一步newProps.history.location.pathname

我已经挖得足够深,找出什么原因造成的,但不是原因:在connect上我们的Routing 。 当它被删除,后退按钮正常工作。 这不是解决办法,因为我需要的状态存在。

所以:

  1. 如何使后退/前进按钮的工作而不删除我的状态映射
  2. 为什么是现在这个样子?

Answer 1:

答案是包装在withRouter 。 见https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/redux.md#blocked-updates



文章来源: React router redux lags one history step behing when router receives state