¿Por qué los objetos en Redux deben ser inmutables?
¿Por qué los objetos en Redux deben ser inmutables? Sé que algunos frameworks como Angular2 usarán OnPush y pueden aprovechar la inmutabilidad para comparar estados de vistas para un renderizado más rápido, pero me pregunto si hay otras razones, ya que Redux es agnóstico del framework y, sin embargo, menciona dentro de sus propios documentos el uso de inmutabilidad (independientemente del framework).
Agradecemos cualquier comentario.
3 answers
Redux es una pequeña biblioteca que representa el estado como objetos (inmutables). Y nuevos estados pasando el estado actual a través de funciones puras para crear un estado de objeto/aplicación completamente nuevo.
Si tienes los ojos vidriosos allí no te preocupes. En resumen, Redux no representa cambios en el estado de su aplicación modificando objetos ( como lo haría con paradigmas orientados a objetos). En su lugar, los cambios de estado se representan como la diferencia entre la entrada objeto y el objeto de salida (var output = reducer(input)
). Si muta input
o output
invalida el estado.
Para resumir de otra manera, la inmutabilidad es un requisito de Redux porque Redux representa el estado de su aplicación como "instantáneas de objetos congelados". Con estas instantáneas discretas, puede guardar su estado, o invertirlo, y generalmente tener más "contabilidad" para todos los cambios de estado.
El estado de tu app es solo cambiado por una categoría de funciones puras llamadas reductores. Los reductores tienen 2 propiedades importantes:
- Ellos nunca mutan , devolviendo objetos de nueva construcción: Esto permite razonar sobre entrada + salida sin efectos secundarios
- Su firma es siempre
function name(state, action) {}
, así que hace que sea fácil de componer:
Supongamos que el estado se ve así:
var theState = {
_2ndLevel: {
count: 0
}
}
Queremos incrementar la cuenta, así que hacemos estos reductores{[15]]}
const INCR_2ND_LEVEL_COUNT = 'incr2NdLevelCount';
function _2ndlevel (state, action) {
switch (action.type) {
case INCR_2ND_LEVEL_COUNT:
var newState = Objectd.assign({}, state);
newState.count++
return newState;
}
}
function topLevel (state, action) {
switch (action.type) {
case INCR_2ND_LEVEL_COUNT:
return Objectd.assign({}, {_2ndLevel: _2ndlevel(state._2ndlevel)});
}
}
Tenga en cuenta el uso de Objectd.assign({}, ...)
para crear un nuevos objetos en cada reductor:
Suponiendo que hemos conectado Redux a estos reductores, entonces si usamos el sistema de eventos de Redux para desencadenar un cambio de estado ...
dispatch({type: INCR_2ND_LEVEL_COUNT})
...Redux llamará:
theNewState = topLevel(theState, action);
NOTA: action
es de dispatch()
Ahora theNewState
es un objeto completamente nuevo.
Nota: Puede imponer la inmutabilidad con una biblioteca (o nuevas características del lenguaje ), o simplemente tenga cuidado de no mutar nada: D
Para una mirada más profunda, te recomiendo encarecidamente checkout este video por Dan Abramov (el creador). Debe responder a cualquier pregunta persistente que tenga.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-17 18:47:36
Los siguientes beneficios de la inmutabilidad se mencionan en la documentación de Redux:
- Tanto Redux como React-Redux emplean comprobación de igualdad superficial. Especialmente:
- La utilidad combineReducers de Redux comprueba superficialmente los cambios de referencia causados por los reductores que llama.
- El método connect de React-Redux genera componentes que verifican superficialmente los cambios de referencia al estado raíz y los valores devueltos desde la función mapStateToProps para ver si los componentes envueltos realmente necesitan volver a renderizarse. Tal comprobación superficial requiere inmutabilidad para funcionar correctamente.
- La gestión de datos inmutables en última instancia hace que el manejo de datos sea más seguro.
- La depuración de viajes en el tiempo requiere que los reductores sean funciones puras sin efectos secundarios, para que pueda saltar correctamente entre diferentes estados.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-05 10:14:33
Gran artículo https://medium.cobeisfresh.com/how-redux-can-make-you-a-better-developer-30a094d5e3ec
Junto con los datos inmutables, las funciones puras son uno de los conceptos centrales de programación funcional
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-28 15:55:42