web-dev-qa-db-ja.com

Reactルータv4がReduxで機能しない

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 。さまざまなサイトで多くのスレッドを見てきましたが、この問題の解決策はありません。

19
Vishal Gulati

ああ、今はリアクションルーターとreduxも使用してプロジェクトを作成しています=)。

Redux統合に関する公式ドキュメントをご覧ください https://reacttraining.com/react-router/web/guides/redux-integration

主なポイントは、withRouterconnect Hocsの順序だと思います。

問題は、ReduxがshouldComponentUpdateを実装しており、ルーターから小道具を受け取っていない場合に何かが変更されたことを示すものがないことです。これは簡単に修正できます。コンポーネントを接続する場所を見つけ、withRouterでラップします。

公式ドキュメントから。

UPD

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

class Home extends React.Component {...}

export default withRouter(
    connect(mapStateToPropsFunc)(Home)
);
53
Ivan Burnaev

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;

お役に立てば幸いです^^

3
Voi Mập