2015-12-24 53 views
29

Oturum açtıktan sonra kapsayıcıda "LoginPage" (akıllı bileşen) yönlendirmesini kullanmak istiyorum. Böyle şey:Reak-redux, mapStateToProps, MapDispatchToProps ve redux-router ile nasıl bağlanır

handleSubmit(username, pass, nextPath) { 
    function redirect() { 
     this.props.pushState(null, nextPath); 
    } 
    this.props.login(username, pass, redirect); //action from LoginAcitons 
    } 

kullanıcı adı ve dilsiz-bileşeninden geldi geçiren.

Akıllı bileşen ben redux-yönlendiricinizden pushState ekleyebilir nasıl

function mapStateToProps(state) { 
    return { 
    user: state.app.user 
    }; 
} 

function mapDispatchToProps(dispatch) { 
    return bindActionCreators(LoginActions, dispatch) 
} 

bağlamak? Yoksa yanlış yolda mıyım?

export default connect(mapStateToProps, {pushState})(LoginPage); //works, but haven't actions 

export default connect(mapStateToProps, mapDispatchToProps)(LoginPage); //works, but haven't pushState 

export default connect(mapStateToProps, mapDispatchToProps, {pushState})(LoginPage); //Uncaught TypeError: finalMergeProps is not a function 
+0

Ben benzer bir sorun şaşırıp. Burada LoginActions nelerdir? –

+0

Bunun neden bileşenin kendisinde yapılması gerekiyor? Sadece merak. – xckpd7

cevap

26
function mapStateToProps(state) { 
    return { 
    user: state.app.user 
    }; 
} 

function mapDispatchToProps(dispatch) { 
    return { 
    actions: bindActionCreators(LoginActions, dispatch), 
    routerActions: bindActionCreators({pushState}, dispatch) 
    } 
} 

export default connect(mapStateToProps, mapDispatchToProps)(LoginPage); 
+24

Burada önemli olan şey, mapStateToProps'ta "durum" öğesinin yalnızca nesnenin yerel durumu değil, redux uygulamasının tek durumu olduğunun fark edilmesiydi. Eğilimin sadece {user: state.user} dönüşünü kullanabileceğinizi düşünmek olduğunu düşünüyorum çünkü büyük olasılıkla (kullanıcı: ''} bu bileşenin eylemlerine, redüktörlerine vb. Yerel olarak sahip olduğunuz şeydir. – netpoetica

+0

@netpoetica Teşekkürler! Bu redux belgelerinde azalıyor, aynı şey hakkında kafam karıştı. Verilmiş, muhtemelen çok hızlı XD kaymış – pixelpax

0

Basit iskelet:

import React from 'react'; 
import ReactDOM from 'react-dom' 
import { createStore,applyMiddleware, combineReducers } from 'redux' 
import { connect, Provider } from 'react-redux' 
import thunk from 'redux-thunk' 
import logger from 'redux-logger' 

import View from './view'; 
import {playListReducer, artistReducers} from './reducers' 


/*create rootReducer*/ 


const rootReducer = combineReducers({ 
    playlist: playListReducer, 
    artist: artistReducers 
}) 

/* create store */ 
let store = createStore(rootReducer,applyMiddleware(logger ,thunk)); 


/* connect view and store */ 
const App = connect(
    state => ({ 
    //same key as combineReducers 
    playlist:state.playlist, 
    artist:state.artist 
    }), 
    dispatch => ({ 

    }) 
)(View); 



ReactDOM.render(
    <Provider store={store}> 
    <App /> 
    </Provider> , 
    document.getElementById('wrapper')); 
İlgili konular