Siento que ninguna de las respuestas ha cristalizado por qué mapDispatchToProps
es útil.
Esto realmente solo se puede responder en el contexto del container-component
patrón, que encontré mejor entendido por primera lectura: Componentes del contenedor y luego Uso con reacción .
En pocas palabras, components
se 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 containers
están.
Por lo tanto, un "bien diseñado" component
en 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 mapDispatchToProps
entra: 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 component
en el patrón, FancyAlerter
que hace el renderizado, no necesita saber nada de eso: obtiene su método para llamar al onClick
botón, a través de sus accesorios.
Y ... mapDispatchToProps
fue 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 mapStateToProps
para el mismo propósito que mapDispatchToProps
por la razón básica por la que no tiene acceso al dispatch
interior mapStateToProp
. Por lo tanto, no puede usar mapStateToProps
para 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