2016-07-12 30 views
28

Ich mache gerade eine einfache App, um Async mit Redux zu lernen. Ich habe alles in Ordnung gebracht, jetzt möchte ich nur den aktuellen Zustand auf der Webseite anzeigen. Wie kann ich nun in der Rendermethode auf den Status des Geschäfts zugreifen?Wie kann ich auf den Speicherstatus in React Redux zugreifen?

Hier ist mein Code (alles auf einer Seite ist, weil ich lerne gerade):

const initialState = { 
     fetching: false, 
     fetched: false, 
     items: [], 
     error: null 
    } 

const reducer = (state=initialState, action) => { 
    switch (action.type) { 
     case "REQUEST_PENDING": { 
      return {...state, fetching: true}; 
     } 
     case "REQUEST_FULFILLED": { 
      return { 
       ...state, 
       fetching: false, 
       fetched: true, 
       items: action.payload 
      } 
     } 
     case "REQUEST_REJECTED": { 
      return {...state, fetching: false, error: action.payload} 
     } 
     default: 
      return state; 
    } 
}; 

const middleware = applyMiddleware(promise(), thunk, logger()); 
const store = createStore(reducer, middleware); 

store.dispatch({ 
    type: "REQUEST", 
    payload: fetch('http://localhost:8000/list').then((res)=>res.json()) 
}); 

store.dispatch({ 
    type: "REQUEST", 
    payload: fetch('http://localhost:8000/list').then((res)=>res.json()) 
}); 

render(
    <Provider store={store}> 
     <div> 
      { this.props.items.map((item) => <p> {item.title} </p>)} 
     </div> 
    </Provider>, 
    document.getElementById('app') 
); 

also in der Render-Methode des Staates Ich möchte alle aus dem Laden, um die item.title zur Liste aus.

Dank

+1

Sie sind fast da. Sie müssen eine mit dem Speicher verbundene Komponente mithilfe der Bibliothek "react-redux" erstellen. Ich empfehle Ihnen, Ihr Verständnis von redux mit dem kostenlosen Kurs des Autors zu verbessern: https://egghead.io/courses/getting-started-with-redux – ctrlplusb

+1

Sie tun 'store.getState()', um tatsächlich den Zustand zu lesen dein Laden. http://redux.js.org/docs/api/Store.html#getState –

+1

Danke für das Tutorial. Ich verstehe Redux nicht vollständig und dieses Tutorial wird mir sehr helfen. – Parkicism

Antwort

24

Sie sollten separate Komponente erstellen, die Zustandsänderungen werden zu hören und auf jeder Statusänderung Aktualisierung:

class Items extends Component { 
    constructor(props) { 
    super(props); 

    this.state = { 
     items: [], 
    }; 

    store.subscribe(() => { 
     // When state will be updated(in our case, when items will be fetched), 
     // we will update local component state and force component to rerender 
     // with new data. 

     this.setState({ 
     items: store.getState().items; 
     }); 
    }); 
    } 

    render() { 
    return (
     <div> 
     {this.state.items.map((item) => <p> {item.title} </p>)} 
     </div> 
    ); 
    } 
}; 

render(<Items />, document.getElementById('app')); 
+0

Vielen Dank für Ihre Hilfe! – Parkicism

+23

@ 1ven wie bekommen wir 'store' Variable definiert hier? –

+2

@BangDao wir können davon ausgehen, dass wir es aus einer externen Datei importieren. 'store'-Variable - es handelt sich um eine Redux-Store-Instanz. – 1ven

5

Sie müssen Store.getState() verwenden aktuellen Status Ihres Shop zu bekommen.

Für weitere Informationen über getState() Uhr this kurze Video.

+0

Also ändere ich einfach 'this.props.items' in' store.getState(). Items'? Wenn ich es gemacht habe, gibt es nicht den 'item.title' aus. – Parkicism

+0

@Parkicism erhalten Sie einige Fehler? – semanser

+0

keine Fehler, es wird nur nichts ausgegeben – Parkicism

3

Sie wollen mehr tun, als nur getState. Sie möchten auf Änderungen im Geschäft reagieren.

Wenn Sie nicht reagieren-redux verwenden, können Sie dies tun:

function rerender() { 
    const state = store.getState(); 
    render(
     <div> 
      { state.items.map((item) => <p> {item.title} </p>)} 
     </div>, 
     document.getElementById('app') 
    ); 
} 

// subscribe to store 
store.subscribe(rerender); 

// do initial render 
rerender(); 

// dispatch more actions and view will update 

Aber besser ist reagieren-redux zu verwenden. In diesem Fall verwenden Sie den Provider, wie Sie bereits erwähnt haben, aber verwenden Sie dann connect, um Ihre Komponente mit dem Geschäft zu verbinden.

+0

Die OP fragte speziell nach React-Redux. Warum eine Lösung für etwas anderes als die Anfrage bereitstellen? –

Verwandte Themen