2016-05-19 2 views
14

Ich frage mich, ob es heute noch einen Punkt gibt, der mapDispatchToProps verwendet. Ich arbeite an der redux documentation tutorials (eine To-do-Liste erstellen), wo VisibleTodoList wird wie folgt beschrieben:mapDispatchToProps: Irgendein Punkt?

import { connect } from 'react-redux' 
import { toggleTodo } from '../actions' 
import TodoList from '../components/TodoList' 

const getVisibleTodos = (todos, filter) => { 
    switch (filter) { 
    case 'SHOW_ALL': 
     return todos 
    case 'SHOW_COMPLETED': 
     return todos.filter(t => t.completed) 
    case 'SHOW_ACTIVE': 
     return todos.filter(t => !t.completed) 
    } 
} 

const mapStateToProps = (state) => { 
    return { 
    todos: getVisibleTodos(state.todos, state.visibilityFilter) 
    } 
} 

const mapDispatchToProps = (dispatch) => { 
    return { 
    onTodoClick: (id) => { 
     dispatch(toggleTodo(id)) 
    } 
    } 
} 

const VisibleTodoList = connect(
    mapStateToProps, 
    mapDispatchToProps 
)(TodoList) 

export default VisibleTodoList 

Allerdings habe ich gesagt, dass heute, konnte ich einfach nicht mapDispatchToProps zu definieren und verbinden alles durch:

const VisibleTodoList = connect(
    mapStateToProps, 
    toggleTodo 
)(TodoList) 

Ist es richtig? Und wenn ja, was ist der Punkt, ein mapDispatchToProps zu schreiben? Gibt es irgendwelche Nachteile, die Aktion einfach zurück zu geben?

Danke!

Antwort

23

die andere Mark Kommentar zu klären:

Das zweite Argument für connect() zwei Hauptformen annehmen kann. Wenn Sie eine Funktion als Argument übergeben, geht connect() davon aus, dass Sie die Versandvorbereitung selbst abwickeln möchten, ruft Ihre Funktion mit dispatch als Argument auf und führt das Ergebnis in die Requisiten für Ihre Komponente zusammen.

Wenn Sie in einem Objekt als zweites Argument zu connect() passieren, nimmt man eine Karte von prop Namen Aktion Schöpfer gegeben haben, und es läuft so automatisch alle von ihnen durch die bindActionCreators Dienstprogramm und verwendet das Ergebnis als Requisiten.

jedoch einen Einzel Aktion Schöpfer als zweites Argument übergeben, wie Ihr Beispiel zu tun, scheint nicht das tun, was Sie wollen, wie connect() dass als Vorbereitung Funktion interpretieren würde und nicht eine Aktion Schöpfer, der sein muss gebunden.

Also ja, unterstützt connect() eine Kurz Syntax voller Action Schöpfer als das zweite Argument in einem Objekt vorbei, aber es gibt immer noch gute Anwendungsfälle für in einer tatsächlichen mapDispatchToProps Funktion übergeben, sich Dinge zu tun (vor allem, wenn Ihr Versand prep verlässt sich auf die tatsächlichen Prop-Werte in irgendeiner Weise).

Sie könnten sich auf the API docs for `connect() beziehen.

+0

10 Ah ... warum sagst du 'mapDispatch' nimmt _three_args? Pro Quelle wird es immer nur mit einem oder zwei aufgerufen. – markerikson

+0

Ich möchte nur hinzufügen, dass die letzte Zeile, vor allem wenn Ihre Dispatch Prep auf die tatsächlichen Prop-Werte in irgendeiner Weise beruht, genau das ist, warum ich noch einige meiner Action-Ersteller selbst vorbereite. In der Tat hat es selten gesagt, dass mapDispatchToProps tatsächlich 2 Argumente hat, das zweite ist ownProps und hier kann ich Standard-Argumente in meine Aktions-Ersteller von den Containerobjekt-Requisiten einfügen und sie nicht an untergeordnete Komponenten übergeben. (Danke für die Erinnerung markerikson, ich konnte den Kommentar nicht noch einmal bearbeiten, also habe ich es gerade mit der Korrektur veröffentlicht). – JMac

7

connect() bindet den Versand automatisch an Ihre Aktionen, wenn sie als Objekt von Funktionsnamen übergeben werden.

Also nein, Sie müssen MapStateToProps nicht implementieren. Stattdessen können Sie nur Ihnen Aktionen wie diese passieren:

export default connect((state) => state, { 
    action1, 
    action2, 
})(MyComponent);