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 mapDispatchToProps
hữu ích.
Điều này thực sự chỉ có thể được trả lời trong ngữ cảnh của container-component
mẫ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ì containers
dành cho.
Do đó, một "thiết kế tốt" component
trong 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 component
mẫu, FancyAlerter
kế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 onClick
nút, thông qua các đạo cụ của nó.
Và ... mapDispatchToProps
là 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 mapStateToProps
cho cùng mục đích vì mapDispatchToProps
lý do cơ bản là bạn không có quyền truy cập vào dispatch
bê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ụ