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
ALERT_ACTION
es esa la función de acción o latype
que se devuelve de la función de acción? : / tan desconcertadoBásicamente es una taquigrafía. Entonces, en lugar de tener que escribir:
Usaría mapDispatchToProps como se muestra en su código de ejemplo, y luego escribiría en otro lugar:
o más probablemente en este caso, lo tendrías como el controlador de eventos:
Hay un video útil de Dan Abramov sobre esto aquí: https://egghead.io/lessons/javascript-redux-generating-containers-with-connect-from-react-redux-visibletodolist
fuente
mapDispatch
función, Redux utilizará un valor predeterminado. EsamapDispatch
función predeterminada simplemente toma ladispatch
referencia de función y se la da comothis.props.dispatch
.mapStateToProps()
es una utilidad que ayuda a su componente a obtener un estado actualizado (que es actualizado por algunos otros componentes),mapDispatchToProps()
es una utilidad que ayudará a su componente a activar un evento de acción (acción de envío que puede causar un cambio en el estado de la aplicación)fuente
mapStateToProps
,mapDispatchToProps
Yconnect
de lareact-redux
biblioteca proporciona una manera conveniente de acceder a sustate
edispatch
función de su tienda. Básicamente, connect es un componente de orden superior, también puede pensar como un contenedor si esto tiene sentido para usted. Por lo tanto, cada vez questate
se modifiquemapStateToProps
, se llamará con su nuevo componentestate
y, a medida queprops
actualice el componente, se ejecutará la función de representación para representar su componente en el navegador.mapDispatchToProps
también almacena valores-clave enprops
su componente, generalmente toman la forma de una función. De esta manera, puede desencadenarstate
cambios desde su componenteonClick
,onChange
eventos.De documentos:
También asegúrese de estar familiarizado con React funciones sin estado y componentes de orden superior
fuente
mapStateToProps
recibe elstate
yprops
y le permite extraer accesorios del estado para pasar al componente.mapDispatchToProps
recibedispatch
yprops
está destinado a que usted obligue a los creadores de acciones a despachar, de modo que cuando ejecuta la función resultante, la acción se despacha.Creo que esto solo le evita tener que hacerlo
dispatch(actionCreator())
dentro de su componente, lo que lo hace un poco más fácil de leer.https://github.com/reactjs/react-redux/blob/master/docs/api.md#arguments
fuente
dispatch
método? ¿De dónde viene?<Provider/>
mismo. Realiza su propia magia de componentes de alto orden para garantizar que el envío esté disponible en sus componentes secundarios.Ahora suponga que hay una acción para redux como:
Cuando lo importas,
Como dice el nombre de la función
mapDispatchToProps()
, mapadispatch
acción a accesorios (los accesorios de nuestros componentes)Por lo tanto, prop
onTodoClick
es una clave para lamapDispatchToProps
función que delega más allá para despachar accionesaddTodo
.Además, si desea recortar el código y omitir la implementación manual, puede hacerlo,
Que significa exactamente
fuente