React usePersistedState hook

2022-07-26  本文已影响0人  ikonan

返回一个持久化在localStorage中的有状态值,以及一个更新它的函数。

import { useState,useRef, useEffect } from "react"

const usePersistedState  = (name: string, defaultValue: string) => {
  const [value, setValue] = useState(defaultValue)
  const nameRef = useRef(name)

  useEffect(()=>{
    try {
      const storedValue = localStorage.getItem(name)
      if (storedValue !== null) {
        setValue(storedValue)
      } else {
        localStorage.setItem(name, defaultValue)
      }
    } catch  {
      setValue(defaultValue)
    }
  }, [])

  useEffect(()=>{
    try {
        localStorage.setItem(nameRef.current, value)
    } catch  {
    }
  }, [value])

  useEffect(()=>{
    const lastName = nameRef.current;
    if (name !== lastName) {
      try {
        localStorage.setItem(name, value)
        nameRef.current = name;
        localStorage.removeItem(lastName)
      } catch  {
      }
    }
  }, [name])

  return [ value, setValue]
}

export default usePersistedState

Example

const MyComponent = ({ name }) => {
  const [val, setVal] = usePersistedState(name, 10);
  return (
    <input
      value={val}
      onChange={e => {
        setVal(e.target.value);
      }}
    />
  );
};

const MyApp = () => {
  const [name, setName] = React.useState('my-value');
  return (
    <>
      <MyComponent name={name} />
      <input
        value={name}
        onChange={e => {
          setName(e.target.value);
        }}
      />
    </>
  );
};

ReactDOM.render(<MyApp />, document.getElementById('root'));
上一篇 下一篇

猜你喜欢

热点阅读