Przechowywanie stanu React useReducer w sessionStorage
Zachowaj stan React useReducer w sessionStorage podczas ponownych załadowań, z mechanizmami serializacji, aby interfejs pozostał nienaruszony po odświeżeniu i nie wyciekły żadne tajne dane do pamięci przechowawczej.
Źródła: How to Persist React useReducer State with sessionStorage
Rozwiązanie
Zdokumentuj razem ścieżkę prawidłowego działania oraz ścieżkę przywracania. Powtórne próby i obsługa wiadomości błędnych stanowią część produktu. Oddziel politykę wyszukiwania od polityki generowania. Zainfekowane dokumenty mogą kierować odpowiedziami bez zmiany wag modelu.
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)
}
Jak to działa
Oddziel politykę wyszukiwania od polityki generowania. Zainfekowane dokumenty mogą kierować odpowiedziami bez zmiany wag modelu.
Szybki przykład użycia
Oddziel politykę wyszukiwania od polityki generowania. Zainfekowane dokumenty mogą kierować odpowiedziami bez zmiany wag modelu.
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>
)
}
Pobierz kod
Zapisz czasy wykonywania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega niespodziewanym rachunkom w środowiskach współdzielonych. Oddziel politykę wyszukiwania od polityki generowania. Zainfekowane dokumenty mogą kierować odpowiedziami bez zmiany wag modelu.
Listwa kontrolna operacyjna
Zapisuj czas trwania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega nieoczekiwanym rachunkom w środowiskach współdzielonych.
Waliduj i oczyszczaj przyjmowany treść. Traktuj niezaufane zbiory danych jako powierzchnię ataku.
Persistencja przekształca demonstracje w systemy: wątki, udział ludzi oraz debugowanie typu „podróż w czasie” od niej zależą.
Rozmieszczaj typy obok komponentów i utrzymuj ograniczoną liczbę właściwości. Zbyt liczne właściwości stają się długiem, którego TypeScript miał zapobiec.
Napisz krótki przewodnik operacyjny: rotuj klucze, opróżniaj kolejki, cofnij ostatnią zmianę.
Aby wzmocnić bezpieczeństwo, zdefiniuj wejścia, osobę odpowiedzialną za daną czynność oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie wykonać tę czynność na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Zapisuj czas trwania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega nieoczekiwanym rachunkom w środowiskach współdzielonych.
Rozdziel politykę wyodrębniania informacji od polityki generowania. Zatrute dokumenty mogą kierować odpowiedziami bez zmiany wag modelu.
Aby wzmocnić zabezpieczenia, zdefiniuj dane wejściowe, osobę odpowiedzialną za daną etap oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić daną etap na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Zdokumentuj zarówno prawidłowy przebieg procesu, jak i ścieżkę naprawczą. Próby ponownych działań oraz obsługa nieudanych zapytań stanowią część produktu.
Zwaliduj i oczyszcz treści przyjmowane do obработки. Traktuj niezaufane zbiory danych jako powierzchnię ataku.