2016-05-19 18 views
14

Zastanawiam się, czy nadal istnieje punkt przy użyciu mapDispatchToProps dziś. pracuję na redux documentation tutorials (zbudować listę todo) gdzie VisibleTodoList jest opisany jako:mapDispatchToProps: dowolny 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 

Jednak powiedziano mi, że dzisiaj, po prostu nie mogę zdefiniować mapDispatchToProps i połączyć wszystko poprzez:

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

Czy to prawda? A jeśli tak, jaki jest sens napisania mapDispatchToProps? Czy są jakieś wady po prostu zwróceniu akcji?

Dzięki!

Odpowiedz

23

Aby wyjaśnić komentarz drugiego Marka:

Drugi argument connect() może przybrać dwie główne formy. Jeśli jako argument zostanie przesłana funkcja, connect() zakłada, że ​​chcesz samemu przygotować się do wysyłki, wywołuje funkcję z argumentem dispatch i scala wynik na rekwizyty dla komponentu.

Jeśli przekazujesz obiekt jako drugi argument do connect(), zakłada on, że nadałeś mu mapę nazw rekwizytów dla twórców akcji, więc automatycznie uruchamia je wszystkie za pomocą narzędzia bindActionCreators i używa wyniku jako rekwizyty.

Jednak przechodząc pojedynczy twórcy działania jako drugi argument, zgodnie z przykładem wydaje się zrobić, nie będzie robić to, co chcesz, jak connect() zinterpretuje to jako funkcję preparatu i nie jest twórcą działania, które muszą być granica.

Tak, connect() obsługuje skróconą składnię przekazywania obiektu pełnego twórców akcji jako drugiego argumentu, ale nadal istnieją dobre przypadki użycia do przekazywania rzeczywistej funkcji mapDispatchToProps do samodzielnego robienia rzeczy (szczególnie, jeśli przygotowujesz wysyłkę w pewnym stopniu opiera się na rzeczywistych wartościach nośnych).

Możesz chcieć odnieść się do the API docs for `connect().

+0

Ah ... dlaczego mówisz, że 'mapDispatch' pobiera _trzec_ argumenty? Na źródło, jest to tylko raz wywoływane z jednym lub dwoma. – markerikson

+0

Po prostu chcę dodać, że ostatnia linia, szczególnie jeśli twoja wysyłka prep opiera się na rzeczywistych wartościach prop w jakiś sposób, właśnie dlatego wciąż sam przygotowuję niektórych moich twórców akcji. W rzeczywistości rzadko orzekł, że mapDispatchToProps rzeczywiście przyjmuje 2 argumenty, z których drugi to selfProps, a jego tutaj mogę wprowadzić domyślne argumenty do moich twórców akcji z rekwizytów obiektów kontenerowych i nie trzeba ich przekazywać do komponentów podrzędnych. (Dzięki za przypomnienie markerikson, nie mogłem edytować komentarza ponownie, więc po prostu przeredagowałem go z poprawką). – JMac

7

connect() automatycznie powiązać wysyłkę z twoimi działaniami, jeśli zostaną przekazane jako obiekt nazw funkcji.

Nie, nie musisz implementować mapStateToProps. Zamiast tego można po prostu przekazać ci działania tak:

export default connect((state) => state, { 
    action1, 
    action2, 
})(MyComponent); 
Powiązane problemy