Los documentos de Redux para bindActionCreators establecen que:
El único caso de uso
bindActionCreators
es cuando desea pasar algunos creadores de acciones a un componente que no conoce Redux, y no desea pasarle el envío o la tienda de Redux.
¿Cuál sería un ejemplo donde bindActionCreators
se usaría / necesitaría?
¿Qué tipo de componente no conocería Redux ?
¿Cuáles son las ventajas / desventajas de ambas opciones?
//actionCreator
import * as actionCreators from './actionCreators'
function mapStateToProps(state) {
return {
posts: state.posts,
comments: state.comments
}
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(actionCreators, dispatch)
}
vs
function mapStateToProps(state) {
return {
posts: state.posts,
comments: state.comments
}
}
function mapDispatchToProps(dispatch) {
return {
someCallback: (postId, index) => {
dispatch({
type: 'REMOVE_COMMENT',
postId,
index
})
}
}
}
fuente
#3
una abreviatura de la opción#1
?mapDispatchToProps
:function
,object
y desaparecidos. Cómo manejar cada caso se define aquíredux
yconnect
yaddDispatchToProps
para el componente simple parece exagerado si puedo pasar un apoyo hacia abajo. Pero hasta donde yo sé, casi todos los casos demapDispatch
accesorios serán opciones#1
o se#3
mencionarán en la respuestaEl 99% de las veces, se utiliza con la función React-Redux
connect()
, como parte delmapDispatchToProps
parámetro. Puede usarse explícitamente dentro de lamapDispatch
función que proporciones, o automáticamente si usas la sintaxis abreviada del objeto y le pasas un objeto lleno de creadores de accionesconnect
.La idea es que al vincular previamente los creadores de acciones, el componente al que pasa
connect()
técnicamente "no sabe" que está conectado, solo sabe que debe ejecutarsethis.props.someCallback()
. Por otro lado, si no vinculó a los creadores de acciones y los llamóthis.props.dispatch(someActionCreator())
, ahora el componente "sabe" que está conectado porque esperaprops.dispatch
existir.Escribí algunas ideas sobre este tema en la publicación de mi blog Idiomatic Redux: ¿Por qué usar creadores de acciones? .
fuente
Ejemplo más completo, pase un objeto lleno de creadores de acciones para conectarse:
fuente
Intentaré responder las preguntas originales ...
Componentes inteligentes y tontos
En su primera pregunta, básicamente pregunta por qué
bindActionCreators
se necesita en primer lugar y qué tipo de componentes no deben conocer Redux.En resumen, la idea aquí es que los componentes deben dividirse en componentes inteligentes (contenedor) y tontos (presentación). Los componentes tontos funcionan sobre la base de la necesidad de saber. Su trabajo principal es renderizar los datos dados a HTML y nada más. No deben estar al tanto del funcionamiento interno de la aplicación. Pueden verse como la capa frontal profunda de su aplicación.
Por otro lado, los componentes inteligentes son una especie de pegamento, que prepara datos para los componentes tontos y preferiblemente no hace renderizado HTML.
Este tipo de arquitectura promueve un acoplamiento flexible entre la capa de interfaz de usuario y la capa de datos subyacente. Esto, a su vez, permite un fácil reemplazo de cualquiera de las dos capas por otra (es decir, un nuevo diseño de la interfaz de usuario), que no romperá la otra capa.
Para responder a su pregunta: los componentes tontos no deberían estar al tanto de Redux (o cualquier detalle de implementación innecesario de la capa de datos para el caso) porque es posible que deseemos reemplazarlo con algo más en el futuro.
Puede encontrar más sobre este concepto en el manual de Redux y en mayor profundidad en el artículo Componentes de presentación y contenedor de Dan Abramov.
Que ejemplo es mejor
La segunda pregunta se refería a las ventajas / desventajas de los ejemplos dados.
En el primer ejemplo, los creadores de acciones se definen en un
actionCreators
archivo / módulo separado , lo que significa que se pueden reutilizar en otro lugar. Es prácticamente la forma estándar de definir acciones. Realmente no veo ninguna desventaja en esto.El segundo ejemplo define a los creadores de acciones en línea, que tiene múltiples desventajas:
consts
separados, de modo que se pueda hacer referencia a ellos en los reductores, lo que reduciría la posibilidad de errores de escritura.El segundo ejemplo tiene una ventaja sobre el primero: ¡es más rápido de escribir! Entonces, si no tiene planes más amplios para su código, podría estar bien.
Espero haber logrado aclarar un poco las cosas ...
fuente
Un posible uso de
bindActionCreators()
es "mapear" múltiples acciones juntas como un solo accesorio.Un envío normal se ve así:
Asigne un par de acciones de usuario comunes a los accesorios.
En proyectos más grandes, el mapeo de cada envío por separado puede resultar difícil de manejar. Si tenemos un montón de acciones relacionadas entre sí, podemos combinar estas acciones . Por ejemplo, un archivo de acción de usuario que realizó todo tipo de acciones relacionadas con el usuario. En lugar de llamar a cada acción como un envío separado, podemos usar en
bindActionCreators()
lugar dedispatch
.Múltiples despachos usando bindActionCreators ()
Importe todas sus acciones relacionadas. Es probable que estén todos en el mismo archivo en la tienda redux.
Y ahora, en lugar de usar dispatch, use bindActionCreators ()
Ahora puedo usar el accesorio
userAction
para llamar a todas las acciones en su componente.IE:
userAction.login()
userAction.editEmail()
othis.props.userAction.login()
this.props.userAction.editEmail()
.NOTA: No es necesario que asigne bindActionCreators () a un solo accesorio. (El adicional al
=> {return {}}
que se asignauserAction
). También puede usarbindActionCreators()
para mapear todas las acciones de un solo archivo como accesorios separados. Pero encuentro que hacer eso puede ser confuso. Prefiero que cada acción o "grupo de acciones" reciba un nombre explícito. También me gusta nombrar elownProps
para ser más descriptivo acerca de qué son estos "accesorios para niños" o de dónde vienen. Cuando se usa Redux + React, puede resultar un poco confuso dónde se proporcionan todos los accesorios, por lo que cuanto más descriptivos, mejor.fuente
al usar
bindActionCreators
, puede agrupar múltiples funciones de acción y pasarlas a un componente que no conoce Redux (Componente tonto) como talfuente
También estaba buscando saber más sobre bindActionsCreators y así es como lo implementé en mi proyecto.
En su componente React
fuente
Un buen caso de uso
bindActionCreators
es para la integración con redux-saga usando redux-saga-routines . Por ejemplo:Tenga en cuenta que este patrón podría implementarse usando React Hooks (a partir de React 16.8).
fuente
La declaración de documentos es muy clara:
Este es claramente un caso de uso que puede surgir en la siguiente y solo una condición:
Digamos que tenemos los componentes A y B:
Inyectar para react-redux: (A)
Inyectado por react-redux: (B)
¿Has notado lo siguiente?
Actualizamos la tienda redux a través del componente A mientras no conocíamos la tienda redux en el componente B.
No estamos actualizando en el componente A. Para saber exactamente a qué me refiero, puede explorar esta publicación . Espero que tengas una idea.
fuente