Главная / Статьи

Сохранение состояния React useReducer в sessionStorage

Сохранять состояние React useReducer в sessionStorage при повторных загрузках с использованием механизмов сериализации, чтобы интерфейс оставался доступным после обновления без утечки конфиденциальных данных в хранилище.

Издатель: REACTAPP.TOP2 мин чтения540 слов

Источники: How to Persist React useReducer State with sessionStorage

Решение

Документируйте одновременно путь успешного выполнения и путь восстановления. Повторные попытки и обработка некорректных сообщений являются частью продукта. Разделяйте политику поиска информации и политику генерации ответов. Заведомо повреждённые документы могут влиять на ответы без изменения параметров модели.

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)
}

Как это работает

Разделяйте политику поиска информации и политику генерации ответов. Заведомо повреждённые документы могут влиять на ответы без изменения параметров модели.

Краткий пример использования

Разделяйте политику поиска информации и политику генерации ответов. Заведомо повреждённые документы могут влиять на ответы без изменения параметров модели.

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>
  )
}

Скачайте код

Фиксируйте время выполнения и затраты рядом с функциональными результатами. Раннее видимость данных предотвращает неожиданные счёты в общих средах. Разделяйте политику поиска информации и политику генерации ответов. Заведомо повреждённые документы могут влиять на ответы без изменения параметров модели.

Чек-лист операций

Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее отображение информации предотвращает неожиданные счета в общедоступных средах.

Проверяйте и очищайте принимаемый контент. Рассматривайте ненадежные источники данных как потенциальную угрозу.

Постоянство превращает демонстрационные версии в полноценные системы: для работы потоков, участия людей в процессе и отладки с использованием механизмов «путешествия во времени» оно необходимо.

Размещайте типы рядом с компонентами и ограничивайте количество передаваемых параметров. Чрезмерное количество параметров приводит к проблемам, которые TypeScript предназначен был предотвратить.

Напишите краткий руководство по эксплуатации: процедуры смены ключей, опорожнения очередей, отката последних изменений.

Чтобы усилить безопасность, заранее определите входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии системы.

Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее отображение информации предотвращает неожиданные счета в общедоступных средах.

Разделяйте политику получения данных и политику генерации. Отравленные документы могут влиять на ответы без изменения весов модели.

Для усиления защиты согласно примечанию 1 определите входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.

Документируйте как успешный, так и восстановительный пути работы. Повторные попытки и обработка некорректных сообщений являются частью продукта.

Проверяйте и очищайте принимаемый контент. Рассматривайте ненадежные корпуса данных как потенциальную зону атаки.