Inicio / Artículos

Mantener el estado de React useReducer en sessionStorage

Mantener el estado de React useReducer en sessionStorage tras las recargas, con mecanismos de serialización para que la interfaz siga funcionando tras un refresh sin que se filtren secretos al almacenamiento.

Editor: REACTAPP.TOP2 min de lectura540 palabras

Fuentes: How to Persist React useReducer State with sessionStorage

La solución

Dokumente tanto el camino óptimo como el de recuperación. Las reintentos y el manejo de mensajes no entregados forman parte del producto. Separe la política de recuperación de la política de generación. Los documentos dañinos pueden influir en las respuestas sin cambiar los pesos del modelo.

import { useCallback, useReducer, type Dispatch } from 'react'
import { useSessionStorage } from 'react-use'

type ReducerFn<State, Action> = (state: State, action: Action) => State

export default function useSessionStorageReducer<State, Action>(
  key: string,
  reducer: ReducerFn<State, Action>,
  initialState: State
): [State, Dispatch<Action>] {
  const [sessionStorageValue, setSessionStorageValue] = useSessionStorage(
    `reducer:${key.replaceAll(/\s+/g, '_')}`,
    initialState
  )

  const reducerLocalStorage = useCallback(
    (state: State, action: Action) => {
      const newState = reducer(state, action)
      setSessionStorageValue(newState)
      return newState
    },
    [reducer, setSessionStorageValue]
  )

  return useReducer(reducerLocalStorage, sessionStorageValue)
}

Cómo funciona

Separe la política de recuperación de la política de generación. Los documentos dañinos pueden influir en las respuestas sin cambiar los pesos del modelo.

Ejemplo rápido de uso

Separe la política de recuperación de la política de generación. Los documentos dañinos pueden influir en las respuestas sin cambiar los pesos del modelo.

type State = { count: number }
type Action = { type: 'INCREMENT' } | { type: 'DECREMENT' }

function counterReducer(state: State, action: Action): State {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 }
    case 'DECREMENT':
      return { count: state.count - 1 }
    default:
      return state
  }
}

export function Counter() {
  const [state, dispatch] = useSessionStorageReducer('counter_key', counterReducer, { count: 0 })

  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button>
      <button onClick={() => dispatch({ type: 'DECREMENT' })}>-</button>
    </div>
  )
}

Obtenga el código

Registre los tiempos y costos junto con los resultados funcionales. La visibilidad temprana evita facturas inesperadas en entornos compartidos. Separe la política de recuperación de la política de generación. Los documentos dañinos pueden influir en las respuestas sin cambiar los pesos del modelo.

Lista de verificación operativa

Registre los tiempos y costos junto a los resultados funcionales. La visibilidad temprana evita facturas inesperadas en entornos compartidos.

Valide y sane el contenido ingerido. Trate los corpus no confiables como una superficie de ataque.

La persistencia convierte las demostraciones en sistemas: los hilos, la intervención humana y la depuración mediante viajes en el tiempo dependen de ella.

Aloje los tipos junto a los componentes y mantenga las propiedades limitadas. Un gran número de propiedades genera la deuda que TypeScript estaba destinado a prevenir.

Escriba un manual breve: rotar claves, vaciar colas y revertir el último cambio.

Para el fortalecimiento número 0, defina las entradas, el responsable de la tarea y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar la tarea desde un punto de control conocido sin tener que adivinar el estado oculto.

Registre los tiempos y costos junto a los resultados funcionales. La visibilidad temprana evita facturas inesperadas en entornos compartidos.

Separar la política de recuperación de la política de generación. Los documentos contaminados pueden influir en las respuestas sin cambiar los pesos del modelo.

Para reforzar el punto 1, defina las entradas, el responsable de la etapa y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar la etapa a partir de un punto de control conocido sin tener que adivinar el estado oculto.

Documente tanto la ruta óptima como la ruta de recuperación. Las intentonas repetidas y el manejo de mensajes no entregados forman parte del producto.

Valide y sanee el contenido ingerido. Trate los corpus no confiables como una superficie de ataque.

Lecturas relacionadas

  • Context vs Redux Toolkit vs Zustand para el estado de React — Compare Context, Redux Toolkit y Zustand para un portal de videos, y luego combine las tiendas del cliente con TanStack Query para el estado del servidor.