【问题标题】:React router v4 not working with ReduxReact 路由器 v4 不适用于 Redux
【发布时间】:2017-12-16 18:59:33
【问题描述】:

使用 React 路由器 v4 开发 React 应用程序。在我在我的应用程序中引入 Redux 之前,一切都运行良好。从那时起,单击链接更改路由时,浏览器 url 会发生变化,但与路由对应的组件没有被加载。如果我注释掉 Redux 代码,效果会很好。这可能是什么原因造成的?这是我的路由代码:

import React, { Component } from 'react';
import { Switch, Route, Link } from 'react-router-dom';
import LeftSubDefault from './../components/left-sub-default.component';
import LeftSubOne from './../components/left-sub-one.component';
import LeftSubTwo from './../components/left-sub-two.component';
import { withRouter } from 'react-router-dom';
import { connect } from "react-redux";
import { goToLeftDefault, goToLeftOne, goToLeftTwo } from "./../actions/leftRouteActions.js";

class LeftComponent extends Component {
  render() {
    return (
      <div className="col-xs-6">
          <p>
            Current sub route: {this.props.currentRoute}
          </p>
          <ul>
            <li onClick={this.props.goToDefault}><Link to={'/'}>Go To Default</Link></li>
            <li onClick={this.props.goToSub1}><Link to={'/left-sub1'}>Go To One</Link></li>
            <li onClick={this.props.goToSub2}><Link to={'/left-sub2'}>Go To Two</Link></li>
          </ul>
          <Switch>
            <Route exact path='/' component={LeftSubDefault} />
            <Route exact path='/left-sub1' component={LeftSubOne} />
            <Route exact path='/left-sub2' component={LeftSubTwo} />
          </Switch>
      </div>
    );
  }
}
const mapStateToProps = (store) => {
  return {
    currentRoute: store.routes.currentRoute
  };
}
const mapDispatchToProps = (dispatch) => {
  return {
    goToDefault: () => {
      dispatch(goToLeftDefault())
    },
    goToSub1: () => {
      dispatch(goToLeftOne())
    },
    goToSub2: () => {
      dispatch(goToLeftTwo())
    }
  };
}
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(LeftComponent));

PS:我在控制台中没有错误。代码运行干净,只是组件不加载。这是 github 上的一个类似线程:4671。我在各个网站上看到了很多帖子,但没有一个可以解决这个问题。

【问题讨论】:

标签: reactjs redux react-redux react-router-v4 react-router-component


【解决方案1】:

哈,现在我也在用 react-router 和 redux 做一个项目 =)。

查看redux集成的官方文档https://reacttraining.com/react-router/web/guides/redux-integration

我认为重点是withRouterconnect Hocs 的顺序。

问题在于 Redux 实现了 shouldComponentUpdate 并且如果它没有从路由器接收到 props,则没有任何迹象表明有任何改变。这很容易解决。找到连接组件的位置并将其包装在 withRouter 中。

来自官方文档。

更新

import { withRouter } from 'react-router-dom';
import { connect } from 'react-redux';

class Home extends React.Component {...}

export default withRouter(
    connect(mapStateToPropsFunc)(Home)
);

【讨论】:

  • connect 默认情况下会阻止重新渲染。它对道具进行shallow-equal 比较,这就是您的路线无法更新的原因。
  • 我应该做些什么改变?
  • withRouter 工作,非常感谢!我以前在路由不起作用的 Leftcomponent 中这样做。但是,我必须在导入父组件的地方进行。 LeftComponent 在 app.js 中使用,所以在 app.js 中我必须在 app.js 中使用 withRouter 而不是在 LeftComponent js 中。
  • 拯救了我的一天!谢谢
  • 很棒的解决方案哥们
【解决方案2】:

我正在使用 react-router-dom v4.1.1。它对我有用。这是我的演示

import React from 'react';

import Reducer1 from 'yourReducer1';
import Reducer2 from 'yourReducer2';


import {
    Route,
    Switch as RouterSwitch
} from 'react-router-dom';

const App =()=> (
<RouterSwitch>
    <Route path="/link1" exact component={Reducer1}/>
    <Route path="/link2" exact component={Reducer2}/>     
</RouterSwitch>
);

export default App;

希望对你有帮助^^

【讨论】:

  • 我应该怎么做才能升级到 4.1.1?这个版本有什么语法变化吗?
  • 试试:“npm update all”。我没有用过这个:D。上级链接Update npm
  • 请您分享您的连接语法。这就是问题所在。请更新我的问题。
  • 这是我的索引^^ ReactDOM.render(, document.getElementById('root') ); registerServiceWorker();'
  • withRouter 工作,非常感谢!我以前在路由不起作用的 Leftcomponent 中这样做。但是,我必须在导入父组件的地方进行。 LeftComponent 在 app.js 中使用,所以在 app.js 中我必须在 app.js 中使用 withRouter 而不是在 LeftComponent js 中。
猜你喜欢
  • 2018-12-31
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2019-08-23
  • 2018-03-13
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多