significa react que objetos mutabilidad inmutables inmutable inmutabilidad immutable español javascript angular reactjs redux immutability

javascript - react - ¿Por qué los objetos en Redux deben ser inmutables?



objetos inmutables (3)

¿Por qué los objetos en Redux deben ser inmutables? Sé que algunos frameworks como Angular2 utilizarán onPush y pueden aprovechar la inmutabilidad para comparar estados de vistas para una renderización más rápida, pero me pregunto si hay otras razones, ya que Redux es agnóstico de framework y sin embargo menciona en sus propios documentos para usar inmutabilidad (independientemente del marco).

Apreciar cualquier comentario.


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 objeto / aplicación completamente nuevo.

Si tienes los ojos vidriosos, no te preocupes. En resumen, Redux no representa cambios en el estado de su aplicación modificando objetos (como lo haría con los paradigmas orientados a objetos). En cambio, los cambios de estado se representan como la diferencia entre el objeto de entrada y el objeto de salida ( var output = reducer(input) ). Si muta la input o la output , invalida el estado.

Para resumir de otra manera, la inmutabilidad es un requisito de Redux porque Redux representa su estado de aplicación como "instantáneas de objetos congelados". Con estas instantáneas discretas , puede guardar su estado o revertir el estado, y generalmente tiene más "contabilidad" para todos los cambios de estado.

El estado de su aplicación solo cambia por una categoría de funciones puras llamadas reductores. Los reductores tienen 2 propiedades importantes:

  1. Nunca cambian , devolviendo objetos recién construidos: Esto permite razonar sobre la entrada + salida sin efectos secundarios
  2. Su firma siempre es function name(state, action) {} , por lo que es más fácil componerlas:

Supongamos que el estado se ve así:

var theState = { _2ndLevel: { count: 0 } }

Queremos incrementar el conteo, entonces hacemos estos reductores

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 objetos completamente nuevos en cada reductor:

Suponiendo que hayamos conectado Redux a estos reductores, entonces si usamos el sistema de eventos de Redux para activar un cambio de estado ...

dispatch({type: INCR_2ND_LEVEL_COUNT})

... Redux llamará:

theNewState = topLevel(theState, action);

NOTA: la action es de dispatch()

Ahora theNewState es un objeto completamente nuevo .

Nota: Puede aplicar la inmutabilidad con una biblioteca (o nuevas funciones de idioma ), o simplemente tenga cuidado de no mutar nada: D

Para una mirada más profunda, le recomiendo que revise este video de Dan Abramov (el creador). Debe responder a cualquier pregunta persistente que tengas.


Los siguientes beneficios de inmutabilidad se mencionan en la documentación de Redux: