2016-12-21 4 views
0

Neuling hier versuchen, einige Redux zu lernen. ZIEL: Um eine Schaltfläche zum Klicken und Anmelden/Abmelden zu erhalten, aktualisieren Sie den Store als True/False-Status auf jeden Fall.REDUX: Warum liefert der Store keine Daten an meine Komponente?

const store = createStore(myReducer) Erstellt mein Geschäft, vorbei in meinem Reducer.

Dies ist ein Standardzustand von ausgeloggt. Und kehrt das Gegenteil zurück, wenn die Schaltfläche geklickt wird.

Ich weiß, dass diese Aktion durch Debugging funktioniert.

function myReducer(state = { isLoggedIn: false }, action) { 
    switch (action.type) { 
    case 'TOGGLE': 
    return { 
     isLoggedIn: !state.isLoggedIn 
    } 
    default: 
    return state 
    } 
} 

Das Problem beginnt hier - wenn ich versuchen die store.getState() Daten zuzugreifen.

class Main extends React.Component { 
    render() { 
    return (
     <div> 
     <h1>Login Status: { state.isLoggedIn }</h1> 
     <button onClick={this.props.login}>Login</button> 
     </div> 
    ) 
    } 
} 

const render =() => { 
    ReactDOM.render(<Main status={store.getState().isLoggedIn} login={() => store.dispatch({ type: 'TOGGLE' })}/>,  document.getElementById('root')); 
} 

store.subscribe(render); 
render(); 

Ich habe versucht, store.getState() isLoggedIn & store.getState() & this.props.status und dann den store.getState Zuordnung() isLoggedIn in der Hauptkomponente -.. Aber nichts funktioniert.

Kann mir jemand sagen, wo ich falsch liege?

Antwort

2

Sie können nicht direkt auf das Geschäft zugreifen, indem Sie getState verwenden, um Daten zu finden. Die Redux docs erklären den Prozess in der Tiefe, aber im Grunde werden Sie jede Komponente mit dem Redux-Speicher verbinden mit connect Methode des react-redux Pakets.

Hier ist ein Beispiel dafür, wie dies für die obige Komponente funktionieren könnte:

import React, { Component } from 'react' 
import { connect } from 'react-redux' 
import Main from '../components/Main' 

class MainContainer extends Component { 
    render() { 
    return <Main {...this.props} /> 
    } 
} 

const mapStateToProps = state => ({ 
    isLoggedIn: state.isLoggedIn, 
}) 

const mapDispatchToProps = dispatch => ({ 
    login() { 
    dispatch({type: 'TOGGLE'}) 
    }, 
}) 

MainContainer = connect(
    mapStateToProps, 
    mapDispatchToProps, 
)(MainContainer) 

export default MainContainer 

Sie würden dann die MainContainer anstelle der Main Komponente machen möchten. Der Container wird isLoggedIn und login als Requisiten an Main übergeben, wenn es es rendert.

+0

Danke @MarkChandler - ich folgte dem Dan Abramov Tutorial und seine Todos (und damit toggle todo) Liste scheint noch nicht mapStateToProps zu verwenden, in dieser Toggle-Phase? Vielleicht bin ich vor mir selbst - aber ist connect() und die oben genannten notwendig, wenn Sie nur in einem div angemeldet 'wahr' oder 'falsch' zeigen wollen? – NewbieAid

+0

@NewbieAid: Sie können auf den Status andere Möglichkeiten zugreifen, wie das Importieren des Speichers aus der Datei, in der er erstellt wurde, und den Aufruf von 'store.getState()', aber dies ist der idiomatische Weg, Dinge zu tun. Ich würde sagen, du kommst dir selbst voraus, da ich weiß, dass er später in mapStateToProps einsteigt. Dan hat auch zwei kostenlose Video-Komplettlösungen für Redux auf egghead.io, die in einige ziemlich fortgeschrittene Themen gehen. Ich empfehle sie definitiv, wenn Sie gut von Videos lernen! –

+0

Ja, ich bin gerade auf dem Egghead, danke. Es macht nur meine Nuss, weil die Idee, einen Toggle-Button zu haben, der sich an- oder abmeldet (true/false) und dann erscheint, scheint so einfach zu sein. & ich kann es in der Konsole zeigen ... also ja, ich habe meinen Kopf für 5 Stunden gegen den Bildschirm geschlagen! Haha. – NewbieAid

Verwandte Themen