Estoy tratando de entender el método de conexión de react-redux y las funciones que toma como parámetros. En particular mapStateToProps()
.
Según tengo entendido, el valor de retorno de mapStateToProps
será un objeto derivado del estado (como vive en la tienda), cuyas claves se pasarán a su componente de destino (al que se aplica la conexión del componente) como accesorios.
Esto significa que el estado tal como lo consume su componente de destino puede tener una estructura muy diferente del estado tal como se almacena en su tienda.
P: ¿Está bien?
P: ¿Se espera esto?
P: ¿Es esto un antipatrón?
javascript
reactjs
redux
react-redux
Pablo Barría Urenda
fuente
fuente
this.props.someData
en lugar dethis.props.someKey[someOtherKey].someData
... ¿tiene sentido?Respuestas:
Q:
Is this ok?
A: sí
P:
Is this expected?
Sí, esto se espera (si está utilizando react-redux).
P:
Is this an anti-pattern?
R: No, esto no es un antipatrón.
Se llama "conectar" su componente o "hacerlo inteligente". Es por diseño.
Le permite desacoplar su componente de su estado una vez más, lo que aumenta la modularidad de su código. También le permite simplificar el estado de su componente como un subconjunto del estado de su aplicación que, de hecho, lo ayuda a cumplir con el patrón de Redux.
Piénselo de esta manera: se supone que una tienda debe contener todo el estado de su aplicación.
Para aplicaciones grandes, esto podría contener docenas de propiedades anidadas en muchas capas de profundidad.
No desea transportar todo eso en cada llamada (caro).
Sin
mapStateToProps
o algún análogo del mismo, estaría tentado a dividir su estado de otra manera para mejorar el rendimiento / simplificar.fuente
(1) -
Acceso profundo más fácil(2) -
Evitar errores en los que un componente podría estropear el estado que no le perteneceSi es correcto. Es solo una función auxiliar para tener una forma más simple de acceder a sus propiedades de estado
Imagina que tienes una
posts
clave en tu aplicaciónstate.posts
Y componente
Posts
Por defecto
connect()(Posts)
, todos los accesorios de estado estarán disponibles para el Componente conectadoAhora, cuando asigna el
state.posts
componente a su componente, se vuelve un poco más agradablemapDispatchToProps
normalmente tienes que escribir
dispatch(anActionCreator())
con
bindActionCreators
usted puede hacerlo también más fácilmente comoAhora puedes usarlo en tu Componente
Actualización sobre actionCreators ..
Un ejemplo de un actionCreator:
deletePost
Entonces,
bindActionCreators
solo tomará sus acciones, las envolverá en ladispatch
llamada. (No leí el código fuente de redux, pero la implementación podría verse así:fuente
dispatch => bindActionCreators({fetchPosts, deletePost}, dispatch)
obtienen las accionesfetchPosts
y sedeletePost
pasan?state => state.posts
(lamapStateToProps
función) le dirá a React qué estados desencadenarán una nueva representación del componente cuando se actualice.Tienes la primera parte correcta:
Sí
mapStateToProps
tiene el estado Store como argumento / parámetro (proporcionado porreact-redux::connect
) y se usa para vincular el componente con cierta parte del estado store.Al vincular me refiero al objeto devuelto por
mapStateToProps
se proporcionará en el momento de la construcción como accesorios y cualquier cambio posterior estará disponible a través decomponentWillReceiveProps
.Si conoce el patrón de diseño de Observer, es exactamente eso o una pequeña variación del mismo.
Un ejemplo ayudaría a aclarar las cosas:
Puede haber otro componente de reacción llamado
itemsFilters
que maneja la pantalla y persiste el estado del filtro en el estado de Redux Store, el componente de demostración está "escuchando" o "suscrito" a los filtros de estado de Redux Store, por lo que cada vez que los filtros almacenan cambios de estado (con la ayuda defiltersComponent
) -redux detecta que hubo un cambio y notifica o "publica" todos los componentes de escucha / suscritos enviando los cambios a ellos, locomponentWillReceiveProps
que en este ejemplo activará un refiltro de los elementos y actualizará la pantalla debido a que el estado de reacción ha cambiado .Avíseme si el ejemplo es confuso o no es lo suficientemente claro como para proporcionar una mejor explicación.
En cuanto a: Esto significa que el estado consumido por su componente de destino puede tener una estructura muy diferente del estado tal como se almacena en su tienda.
¡No recibí la pregunta, pero solo sé que el estado de reacción (
this.setState
) es totalmente diferente del estado de Redux Store!El estado de reacción se utiliza para manejar el rediseño y el comportamiento del componente de reacción. El estado de reacción está contenido exclusivamente en el componente.
El estado de Redux Store es una combinación de estados de reductores de Redux, cada uno es responsable de administrar una pequeña porción de la lógica de la aplicación. ¡Se puede acceder a esos atributos reductores con la ayuda de
react-redux::connect@mapStateToProps
cualquier componente! Lo que hace que el estado de la tienda Redux sea accesible en toda la aplicación, mientras que el estado del componente es exclusivo para sí mismo.fuente
Este ejemplo de reacción y reducción se basa en el ejemplo de Mohamed Mellouki. Pero valida usando reglas de prettify y linting . Tenga en cuenta que definimos nuestros accesorios y métodos de envío utilizando PropTypes para que nuestro compilador no nos grite. Este ejemplo también incluyó algunas líneas de código que faltaban en el ejemplo de Mohamed. Para usar connect necesitará importarlo desde react-redux . Este ejemplo también vincula el método filterItems, esto evitará problemas de alcance en el componente . Este código fuente ha sido formateado automáticamente usando JavaScript Prettify .
Este código de ejemplo es una buena plantilla como punto de partida para su componente.
fuente
React-Redux
connect
se utiliza para actualizar la tienda para cada acción.Es muy simple y claramente explicado en este blog .
Puede clonar el proyecto github o copiar y pegar el código de ese blog para comprender la conexión de Redux.
fuente
Aquí hay un esquema / plantilla para describir el comportamiento de
mapStateToProps
:(Esta es una implementación enormemente simplificada de lo que hace un contenedor Redux).
y después
fuente
}
}
fuente