2016-08-16 47 views
13

Şu anda this eğitimini takip ediyorum. Aşağıdaki kodda mapStateToProps karıştığı bir gerginliği biraz isabet ettik: pair pervane gelen iki düğme işlemek gerekiyorduRedux durumu undefined mapStateToProps

import React from 'react'; 
import Vote from './Vote'; 
import Winner from './winner'; 

const Voting = ({pair,vote,hasVoted,winner}) => 
    <div> 
    {winner ? <Winner winner={winner}/> : 
     <Vote pair={pair} vote={vote} hasVoted={hasVoted}/> 
    } 
    </div> 

export default Voting; 

:

İşte
import React from 'react'; 
import Voting from './voting'; 
import {connect} from 'react-redux'; 

const mapStateToProps = (state) => { 
    return { 
    pair: state.getIn(['vote','pair']), 
    winner: state.get('winner') 
    }; 
} 

const VotingContainer = connect(mapStateToProps)(Voting); 
export default VotingContainer; 

aktardıktan Oy bileşenidir. vote prop, tıklatıldığında çalıştırılacak bir işlevdir, hasVoted düğmelerini devre dışı bırakır ve kazanan, yalnızca kazanan bileşeni gösterildiği gibi oluşturur.

Map({ 
    vote:{ 
    pair:List.of('Movie A','Movie B') 
    } 
}); 

Onun yerine devlet state.getIn hattında tanımlanmamış olduğunu belirten bir hata alıyorum:

devlet şöyle bir immutableJS haritası olması bekleniyor.

devlet ayarı kod endeksinde ise:

const store = createStore(reducer); 

const socket = io(document.location.protocol + '//' + document.location.hostname + ':8090'); 
socket.on('state', state => store.dispatch({ 
    type: 'SET_STATE', 
    state 
})); 

ben ayarladıktan sonra store.getState() açmış ve beklendiği gibi ama mapStateToProps içinde undefined. Ayrıca, durum değişkenini yukarıdaki bağlamda da kaydettim ve beklendiği gibi.

Ben de normalde devlet kurmak ve şaşırtıcı işler !:

store.dispatch({ 
    type: 'SET_STATE', 
    state: { 
    vote: { 
     pair: ['Movie A', 'Movie B'] 
    } 
    } 
}); 

yukarıdaki devletin değeri

Son olarak burada redüktör nasıl göründüğü ve sunucudan alınan tam olarak ne gibi:

import React from 'react'; 
import {Map, fromJS} from 'immutable'; 

const reducer = (state = Map(), action) => { 
    switch (action.type) { 
    case 'SET_STATE': 
     return state.merge(action.state); 
    } 
} 

export default reducer; 

Neyi yanlış yapıyorum?

DÜZENLEME: store.dispatch()'dan sonra mapStateToProps'un çağrılmadığını fark ettim. mapStateToProps'un olası nedenleri nedeniyle docs'dan geçtim ve bunlardan biri değil.

+0

çözecektir varsayılan deyimi ekleme

import React from 'react'; import {Map,fromJS} from 'immutable'; const reducer = (state = Map() ,action) => { switch(action.type){ case 'SET_STATE': return state.merge(action.state); default: return state; } } export default reducer; 

mağaza başlangıç ​​durumu olarak döndürülür i redux-logger' 'eklemenizi tavsiye Eylemlerin düzgün bir şekilde gönderilip gönderilmediğini doğrulamak için var olan orta haklara; Bize daha iyi bir fikir verebilir – Deadfish

+0

@Deadfish Öneri için teşekkürler. Ben redux-logger kullandım ve eylem ilk etapta boş bir Harita olduğu için neden önceki durum undefined bilmiyorum rağmen eylem doğru sevk ediliyor. Ayrıca sunucuyu içeren bir kişi için, dağıtımdan sonra mapStateToProps çağrılmadığını fark ettim. – esaminu

+0

"mapStateToProps" ifadesinin, durum mutasyona uğradığında çağrılmadığını düşünüyorum; ama redüktörünüzün kodu iyi görünüyor; Bütün kodunuzu github veya gist ile paylaşır mısınız; – Deadfish

cevap

19

Şalter deyiminde düşürücü varsayılan bir eylem değil. Eğer redüktör params başlangıç ​​durumunu sözü rağmen, bu yüzden de tanımsız sorunu :)

+1

Bu düzeltildi, teşekkürler! – esaminu

İlgili konular