2016-04-11 11 views
11

Ich lerne Reagieren und nach ein paar Tutorials, ich kam in diesem Code ist:Was die Verwendung von @connect Dekorateur in reagieren-redux

import React     from 'react'; 
import TodosView    from 'components/TodosView'; 
import TodosForm    from 'components/TodosForm'; 
import { bindActionCreators } from 'redux'; 
import * as TodoActions  from 'actions/TodoActions'; 
import { connect }   from 'react-redux'; 

@connect(state => ({ todos: state.todos })) 

export default class Home extends React.Component { 
    render() { 
    const { todos, dispatch } = this.props; 

    return (
     <div id="todo-list"> 
     <TodosView todos={todos} 
      {...bindActionCreators(TodoActions, dispatch)} /> 

     <TodosForm 
      {...bindActionCreators(TodoActions, dispatch)} /> 
     </div> 
    ); 
    } 
} 

Dies ist eine ToDo-Anwendung und das ist die Hauptseite, es lädt 2 weitere kleine components. Ich verstand fast alles, aber ich konnte nicht wenige Dinge bekommen:

  • Was macht ? Ich weiß, dass du 4 Params bestehen musst (ich konnte nicht genau herausfinden, was diese 4 Variablen sind).
  • Wie ist die Implementierung von @connect Dekorateur, wie der Code nach dem transpilieren aussehen wird?

Vielen Dank im Voraus :)

+1

Redux- und react-redux-Dokumentationen sind zu diesem Thema ziemlich vollständig. Auf was 'connect' für Sie wirkt: http://redux.js.org/docs/basics/UsageWithReact.html, auf' connect's API und was sind die vier Argumente: https://github.com/reactjs/reaktivieren-redux/blob/master/docs/api.md # connectmapstatetoprops-mapdispatchtoprops-meregprops-Optionen – VonD

+0

Nun, ich habe über die 4 Argumente aus dem gleichen Link wissen, aber ich konnte es nicht richtig von dort verstehen, deshalb habe ich hier eine Frage gestellt :) :) –

+0

Ok ich Ich werde eine schnelle Antwort schreiben, aber ich bezweifle, dass ich es besser machen kann als die Dokumentation! :) – VonD

Antwort

26

Redux hält Zustand Ihrer Anwendung in einem einzigen Objekt der Laden genannt. connect ermöglicht es Ihnen, Ihre React-Komponenten mit dem Status Ihres Geschäfts zu verbinden, damit Sie den Status Ihres Geschäfts als props übergeben können.

Ohne die Dekorateur Syntax, Export Ihrer Komponente würde aussehen wie

export default connect(state => ({todos: state.todos}))(Home); 

Was sie tut, ist, dass es Ihre Komponente nimmt (hier Home) und gibt eine neue Komponente, die richtig mit dem Speicher verbunden ist.

Verbunden hier bedeutet: Sie erhalten den Status des Geschäfts als props, und wenn dieser Status aktualisiert wird, erhält diese neue verbundene Komponente die neuen Requisiten. Verbunden bedeutet auch, dass Sie Zugriff auf die Funktion dispatch des Geschäfts haben, mit der Sie den Status des Geschäfts ändern können.

Die vier Argumente sind:

  • mapStateToProps Sie wollen wahrscheinlich nicht alle Zustand Ihres Shops in allen angeschlossenen Komponenten zu injizieren. Mit dieser Funktion können Sie definieren, an welchen Statusabschnitten Sie interessiert sind, oder als neue Daten, die aus dem Status des Geschäfts stammen, an props übergeben. Man könnte so etwas wie state => ({todosCount: state.todos.length}) tun und die Home Komponente würde die todosCount prop

  • mapDispatchToProps macht das gleiche für die Dispatch-Funktion erhalten. Sie könnte etwas tun, wie dispatch => ({markTodoAsCompleted: todoId => dispatch(markTodoAsCompleted(todoId))})

  • mergeProps Sie eine benutzerdefinierte Funktion zu definieren, erlaubt es, die Requisiten Ihre Komponente erhält fusionieren, diejenigen von mapStateToProps und die, die kommen aus mapDispatchToProps

  • Optionen gut kommt, einige Optionen ...

+0

@BharatSoni Die Decorator-Syntax wird erklärt: Sie schreibt Ihre Klassendeklaration als 'connect (connectOptions) (MyComponent)', das ist alles. 'connect' gibt eine Funktion zurück, die eine Komponente als Parameter akzeptiert und eine neue Komponente zurückgibt. Für den Rest ist es kein Copy-Paste, aber egal, tut mir leid, wenn es dir nicht mehr hilft als die Docs, ich habe mein bestes getan :) – VonD

+0

Vielen Dank für diese brillante Erklärung über das Reagieren mit Redux, das ist die beste Erklärung bisher. –