Siento que ninguna de las respuestas ha cristalizado por qué mapDispatchToPropses útil.
Esto realmente solo se puede responder en el contexto del container-componentpatrón, que encontré mejor entendido por primera lectura: Componentes del contenedor y luego Uso con reacción .
En pocas palabras, componentsse supone que debes preocuparte solo por mostrar cosas. El único lugar del que se supone que deben obtener información es sus accesorios .
Separado de "mostrar cosas" (componentes) es:
- cómo obtienes las cosas para mostrar,
- y cómo manejas los eventos.
Para eso containersestán.
Por lo tanto, un "bien diseñado" componenten el patrón se ve así:
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
Ver cómo este componente se pone la información se muestra de puntales (que entró en la tienda a través de redux mapStateToProps) y también consigue su función de acción de sus puntales: sendTheAlert().
Ahí es donde mapDispatchToPropsentra: en el correspondientecontainer
// 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
)
Me pregunto si puedes ver, ahora que es el container 1 que sabe acerca de redux y despacho y tienda y estado y ... cosas.
El componenten el patrón, FancyAlerterque hace el renderizado, no necesita saber nada de eso: obtiene su método para llamar al onClickbotón, a través de sus accesorios.
Y ... mapDispatchToPropsfue el medio útil que proporciona redux para permitir que el contenedor pase fácilmente esa función al componente envuelto en sus puntales.
Todo esto se parece mucho al ejemplo de todo en los documentos, y otra respuesta aquí, pero he tratado de lanzarlo a la luz del patrón para enfatizar por qué .
(Nota: no puede usarlo mapStateToPropspara el mismo propósito que mapDispatchToPropspor la razón básica por la que no tiene acceso al dispatchinterior mapStateToProp. Por lo tanto, no puede usar mapStateToPropspara darle al componente empaquetado un método que use dispatch.
No sé por qué eligieron dividirlo en dos funciones de mapeo: ¡podría haber sido más ordenado tener mapToProps(state, dispatch, props) IE una función para hacer ambas cosas!
1 Tenga en cuenta que deliberadamente denominé explícitamente el contenedor FancyButtonContainer, para resaltar que es una "cosa": la identidad (y, por lo tanto, la existencia) del contenedor como "una cosa" a veces se pierde en la taquigrafía
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
sintaxis que se muestra en la mayoría de los ejemplos