Головна / Статті

Зберігання стану 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, визначте вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не здогадуючись про прихований стан.

Одночасно задокументуйте шлях успішного виконання та шлях відновлення. Повторні спроби та обробка некоректних повідомлень є частиною продукту.

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