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
ALERT_ACTIONes esa la función de acción o latypeque 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
mapDispatchfunción, Redux utilizará un valor predeterminado. EsamapDispatchfunción predeterminada simplemente toma ladispatchreferencia 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,mapDispatchToPropsYconnectde lareact-reduxbiblioteca proporciona una manera conveniente de acceder a sustateedispatchfunció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 questatese modifiquemapStateToProps, se llamará con su nuevo componentestatey, a medida quepropsactualice el componente, se ejecutará la función de representación para representar su componente en el navegador.mapDispatchToPropstambién almacena valores-clave enpropssu componente, generalmente toman la forma de una función. De esta manera, puede desencadenarstatecambios desde su componenteonClick,onChangeeventos.De documentos:
También asegúrese de estar familiarizado con React funciones sin estado y componentes de orden superior
fuente
mapStateToPropsrecibe elstateypropsy le permite extraer accesorios del estado para pasar al componente.mapDispatchToPropsrecibedispatchypropsestá 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
dispatchmé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(), mapadispatchacción a accesorios (los accesorios de nuestros componentes)Por lo tanto, prop
onTodoClickes una clave para lamapDispatchToPropsfunció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