2016-05-19 23 views
14

Tôi đã tự hỏi nếu vẫn còn một điểm sử dụng mapDispatchToProps ngày hôm nay. Tôi đang làm việc trên redux documentation tutorials (để xây dựng một danh sách todo), nơi VisibleTodoList được mô tả như sau:mapDispatchToProps: bất kỳ điểm nào?

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 

Tuy nhiên, tôi đã được cho biết rằng ngày hôm nay, tôi có thể chỉ đơn giản là không để xác định mapDispatchToProps và kết nối tất cả mọi thứ thông qua:

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

Có đúng không? Và nếu có, điểm viết là mapDispatchToProps là gì? Có bất kỳ hạn chế nào để chỉ trả lại hành động không?

Cảm ơn!

Trả lời

23

Để làm rõ ý kiến ​​khác của các Mark:

Đối số thứ hai để connect() có thể mất hai hình thức chính. Nếu bạn chuyển một hàm làm đối số, connect() giả sử bạn muốn tự xử lý việc gửi đi, hãy gọi hàm của bạn với một đối số và kết hợp kết quả vào các đạo cụ cho thành phần của bạn.

Nếu bạn chuyển đối tượng làm đối số thứ hai cho connect(), nó giả định bạn đã đặt cho nó bản đồ tên tác giả cho người sáng tạo hành động và do đó tự động chạy tất cả chúng thông qua tiện ích bindActionCreators và sử dụng kết quả là đạo cụ. Tuy nhiên, chuyển một đối tượng tác vụ cần phải là bị ràng buộc.

Vì vậy, có, connect() hỗ trợ cú pháp viết tắt trong đối tượng đầy đủ của người tạo hành động như đối số thứ hai, nhưng vẫn có trường hợp sử dụng tốt để chuyển qua một hàm thực tế mapDispatchToProps. dựa vào các giá trị chống đỡ thực tế theo một cách nào đó).

Bạn có thể tham khảo the API docs for `connect().

+0

Ah ... tại sao bạn nói 'mapDispatch' nhận _three_ args? Mỗi nguồn, nó chỉ được gọi với một hoặc hai. – markerikson

+0

Chỉ muốn thêm dòng cuối cùng, đặc biệt nếu chuẩn bị công văn của bạn dựa trên các giá trị thực tế theo một cách nào đó là lý do tại sao tôi vẫn tự chuẩn bị một số người sáng tạo hành động của mình. Trong thực tế, nó hiếm khi nói rằng mapDispatchToProps thực sự lấy 2 đối số, thứ 2 trong số đó là ownProps và ở đây tôi có thể đưa các đối số mặc định vào trong trình tạo đối tượng của tôi từ các đối tượng container và không phải chuyển chúng xuống thành phần con. (Cảm ơn lời nhắc nhở markerikson, tôi không thể chỉnh sửa bình luận một lần nữa vì vậy tôi chỉ reposted nó với sự điều chỉnh). – JMac

7

connect() sẽ tự động ràng buộc gửi đến các hành động của bạn nếu chúng được chuyển vào làm đối tượng của tên hàm.

Vì vậy, không, bạn không cần triển khai mapStateToProps. Thay vào đó bạn chỉ có thể vượt qua bạn hành động như thế này:

export default connect((state) => state, { 
    action1, 
    action2, 
})(MyComponent); 
Các vấn đề liên quan