2016-11-30 8 views
0

私のReactアプリケーションルートはreact-routerreact-router-reduxで管理しています。ディスパッチ機能で何も起こらず、エラーもない

私は次のような構成でルータを設定

import {Provider} from 'react-redux' 
import {Router, browserHistory} from 'react-router' 
import {createStore, combineReducers} from 'redux' 
import {routerReducer} from 'react-router-redux'; 
import {syncHistoryWithStore} from 'react-router-redux' 

import Reducers from './reducers'; // contains all my reducers, 

const store = createStore(combineReducers(
    {...Reducers, routerReducer} 
)); 

const history = syncHistoryWithStore(browserHistory, store); 

const AppRoute = (
    <Provider store={store}> 
     <Router history={history}> 
      <Route path='login' components={PageLogin}/> 
      <Route path='system' components={PageSystem}> 
       <Route path="profile" component={PageProfile}/> 
      </Route> 
     </Router> 
    </Provider> 
); 

export default AppRoute; 

が、私は任意のルータ機能を派遣してみてください。

import React from 'react'; 
import {Link, Route} from 'react-router'; 
import {connect} from 'react-redux'; 
import {replace, push} from 'react-router-redux'; 

class SystemMenu extends React.Component { 
    constructor(props) { 
     super(props); 
     this.logout = this.logout.bind(this); 
    } 

    logout() { 
     this.props.logout(); 
    } 

    render() { 
     return (
      <ul className="system-menu"> 
       <li className={this.isActual("/system/profile")}> 
        <Link to="/system/profile">Profile</Link> 
       </li> 
       <li className={this.isActual("/system/unit")}> 

        <Link to="/system/unit">Units</Link> 
       </li> 
       <li> 
        <button onClick={this.logout}>Logout</button> 
       </li> 
      </ul> 
     ) 
    } 
} 

const mapStateToProps = (state) => { 
    return { 
     router: state.router, 
     actualPage: state.menu.actualPage 
    }; 
}; 

const mapDispatchToProps = (dispatch) => { 
    return { 
     logout() { 
      dispatch(push('/login')); 
     } 
    }; 
}; 

export default connect(mapStateToProps, mapDispatchToProps)(SystemMenu); 

私はQUE Linkコンポーネントをクリックすると、ページが変更され、しかし、私はLogoutをクリックすると、ボタンを押してデバッグすると、dispatch(push('/login'));行が実行されていますが、何も起こっておらず、コンソールにエラーが発生していません。

構成が悪いのは何ですか?


私はmapDispatchToProps関数内console.loglogoutを試みたが、logout is not defined

const mapDispatchToProps = (dispatch) => { 
    console.log(push, logout); 

    return { 
     logout() { 
      dispatch(push('/login')); 
     } 
    }; 
}; 
+0

? –

+0

@DavinTryonこのテストの結果を挿入する質問を更新しました。 ( 'logout is not defined') – Lai32290

+0

' browserHistory.push( '/') 'を使わないのはなぜですか?あなたは 'browserHistory'を' store'と同期させているので、すべては問題ありません。 –

答えて

1

combineReducersを返すことは、このような最初の引数としてオブジェクトを取る必要があります:あなたがしている

const store = createStore(
    combineReducers({ 
    ...reducers, 
    routing: routerReducer 
    }) 
) 

代わりにArrayを与えます。 ルータレデューサーが正しく登録されていないため、pushが機能しない理由が考えられます。

+0

申し訳ありませんが、これは私の実際のコードでは、ポストエディションで私の失敗は、オブジェクトです、私は私の質問の投稿を更新しました。 – Lai32290

+0

問題はありませんが、まだルータレデューサーを正しく登録していません。 '' combineReducers({... Reducers、routing:routerReducer}) '' 'でなければなりません。彼らは '' routerReducer'''キーの下に登録しています –

-1

この問題は解決しました。

react-router redux`ミドルウェアを使用していないため、この問題が発生しています。そのため、ディスパッチするとブラウザURLを状態で更新していない可能性があります。

私のルート設定後:あなた `` mapDispatchToProps`ログアウト() `関数内` console.log`は、あなたがログを見なければ

import {Provider} from 'react-redux' 
import {Router, browserHistory} from 'react-router' 
import {createStore, combineReducers, applyMiddleware} from 'redux' 
import {routerReducer} from 'react-router-redux'; 
import {syncHistoryWithStore, routerMiddleware} from 'react-router-redux' 

import Reducers from './reducers'; // contains all my reducers, 

const middleware = [routerMiddleware(browserHistory)]; 

const store = createStore(combineReducers(Reducers), compose(
    applyMiddleware(...middleware) 
)); 

const history = syncHistoryWithStore(browserHistory, store); 

const AppRoute = (
    <Provider store={store}> 
     <Router history={history}> 
      <Route path='login' components={PageLogin}/> 
      <Route path='system' components={PageSystem}> 
       <Route path="profile" component={PageProfile}/> 
      </Route> 
     </Router> 
    </Provider> 
); 

export default AppRoute; 
関連する問題