Tôi cảm thấy như không có câu trả lời nào kết tinh tại sao lại mapDispatchToPropshữu ích.
Điều này thực sự chỉ có thể được trả lời trong ngữ cảnh của container-componentmẫu mà tôi thấy rõ nhất khi đọc lần đầu: Thành phần Container sau đó là Cách sử dụng với React .
Tóm lại, bạn componentsđược cho là chỉ quan tâm đến việc hiển thị nội dung. Nơi duy nhất họ có nghĩa vụ phải lấy thông tin là đạo cụ của họ .
Tách từ "hiển thị công cụ" (thành phần) là:
- làm thế nào bạn có được những thứ để hiển thị,
- và cách bạn xử lý các sự kiện.
Đó là những gì containersdành cho.
Do đó, một "thiết kế tốt" componenttrong mẫu trông như thế này:
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
Xem cách thành phần này nhận thông tin mà nó hiển thị từ các đạo cụ (xuất phát từ cửa hàng redux thông qua mapStateToProps) và nó cũng có chức năng hành động từ các đạo cụ của nó : sendTheAlert().
Đó là nơi mapDispatchToPropsđến: trong tương ứngcontainer
// FancyButtonContainer.js
function mapDispatchToProps(dispatch) {
return({
sendTheAlert: () => {dispatch(ALERT_ACTION)}
})
}
function mapStateToProps(state) {
return({fancyInfo: "Fancy this:" + state.currentFunnyString})
}
export const FancyButtonContainer = connect(
mapStateToProps, mapDispatchToProps)(
FancyAlerter
)
Tôi tự hỏi nếu bạn có thể nhìn thấy, bây giờ đó là container 1 người biết về redux, công văn và lưu trữ và trạng thái và ... công cụ.
Trong componentmẫu, FancyAlerterkết xuất đồ họa không cần biết về bất kỳ thứ gì trong số đó: nó có phương thức gọi onClicknút, thông qua các đạo cụ của nó.
Và ... mapDispatchToPropslà phương tiện hữu ích mà redux cung cấp để cho phép container dễ dàng chuyển chức năng đó vào thành phần được bọc trên các đạo cụ của nó.
Tất cả điều này trông rất giống ví dụ việc cần làm trong tài liệu, và một câu trả lời khác ở đây, nhưng tôi đã cố gắng đưa nó ra dưới ánh sáng của mẫu để nhấn mạnh lý do tại sao .
(Lưu ý: bạn không thể sử dụng mapStateToPropscho cùng mục đích vì mapDispatchToPropslý do cơ bản là bạn không có quyền truy cập vào dispatchbên trong mapStateToProp. Vì vậy, bạn không thể sử dụng mapStateToPropsđể cung cấp cho thành phần được bao bọc một phương thức sử dụng dispatch.
Tôi không biết lý do tại sao họ chọn chia nó thành hai chức năng ánh xạ - có thể đã gọn gàng hơn khi có mapToProps(state, dispatch, props) một chức năng IE để thực hiện cả hai!
1 Lưu ý rằng tôi cố tình đặt tên cho container một cách rõ ràng FancyButtonContainer, để làm nổi bật rằng đó là một "vật" - danh tính (và do đó tồn tại!) Của container là "một vật" đôi khi bị mất trong tốc ký
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
cú pháp được hiển thị trong hầu hết các ví dụ