Сохранение состояния React useReducer в sessionStorage
Сохранять состояние React useReducer в sessionStorage при повторных загрузках с использованием механизмов сериализации, чтобы интерфейс оставался доступным после обновления без утечки конфиденциальных данных в хранилище.
Источники: 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 определите входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Документируйте как успешный, так и восстановительный пути работы. Повторные попытки и обработка некорректных сообщений являются частью продукта.
Проверяйте и очищайте принимаемый контент. Рассматривайте ненадежные корпуса данных как потенциальную зону атаки.