首页 / 文章

将 React 的 useReducer 状态持久化到 sessionStorage 中

在页面重新加载时将React useReducer状态保存在sessionStorage中,并通过序列化保护机制确保UI在刷新后仍能正常显示,同时防止敏感信息泄露到存储中。

发布者:REACTAPP.TOP阅读约 2 分钟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 所要避免的债务问题。

编写简短的操作手册:包括密钥轮换、队列清空以及回滚最新更改的方法。

为增强安全性,请在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。

在功能结果旁记录执行时间和成本。提前了解情况可避免在共享环境中出现意外账单。

将检索策略与生成策略分开。被污染的文档可以在不改变模型权重的情况下影响答案。

为增强安全性,需在修改代码之前明确输入内容、各步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。

同时记录正常流程和故障恢复流程。重试机制及错误处理都是产品功能的一部分。

需对输入内容进行验证和净化。将不可信的语料库视为攻击面。