React useSessionStorage钩子

创建一个持久化到sessionStorage的有状态值,并提供一个更新它的函数。

  • 使用useState()钩子和一个函数来惰性地初始化它的值。
  • 使用try...catch块和Storage.getItem()尝试从Window.sessionStorage获取值。如果没有找到值,则使用Storage.setItem()defaultValue存储起来并将其作为初始状态。如果发生错误,则使用defaultValue作为初始状态。
  • 定义一个函数,该函数将使用传递的值更新状态变量,并使用Storage.setItem()将其存储起来。
const useSessionStorage = (keyName, defaultValue) => {
  const [storedValue, setStoredValue] = React.useState(() => {
    try {
      const value = window.sessionStorage.getItem(keyName);

      if (value) {
        return JSON.parse(value);
      } else {
        window.sessionStorage.setItem(keyName, JSON.stringify(defaultValue));
        return defaultValue;
      }
    } catch (err) {
      return defaultValue;
    }
  });

  const setValue = newValue => {
    try {
      window.sessionStorage.setItem(keyName, JSON.stringify(newValue));
    } catch (err) {}
    setStoredValue(newValue);
  };

  return [storedValue, setValue];
};

const MyApp = () => {
  const [name, setName] = useSessionStorage('name', 'John');

  return <input value={name} onChange={e => setName(e.target.value)} />;
};

ReactDOM.createRoot(document.getElementById('root')).render(
  <MyApp />
);