将列表更改保存到 React 中的本地存储

Saving list changes to local storage in React

我有一个名为 allLists 的列表集合,当我在 allLists 中进行添加新列表或更新现有列表等更改时,我希望将更改保存到本地存储。我遇到了这个问题,当我刷新时它似乎不起作用。

自定义本地存储挂钩:

export function useLocalStorage(key, defaultValue, mapper = (str) => str) {
  const getInitialValue = () =>
    localStorage.getItem(key) !== null
      ? mapper(localStorage.getItem(key))
      : defaultValue;
  const [value, setValue] = useState(getInitialValue);
  const setAndStoreValue = (newValue) => {
    if (newValue !== "") {
      setValue(newValue);
      localStorage.setItem(key, newValue);
    }
  };
  return [value, setAndStoreValue];
}

我如何使用保存到 allList 到本地存储

const [allLists, setAllLists] = useLocalStorage('allLists', [initialLists]);

Codesandbox 示例: link

由于缺少有效的 serializerdeserializer,无法从 localStorage 中保存和获取值。您可以更新您的 useLocalStorage 挂钩以实现具有默认 serializer (JSON.stringify) 和 deserializer (JSON.parse) 的实现,如下所示:-

export function useLocalStorage(key, defaultValue, {serializer = JSON.stringify,deserializer=JSON.parse}={}) {
  const getInitialValue = () =>
    localStorage.getItem(key) !== null
      ? deserializer(localStorage.getItem(key))
      : defaultValue;
  const [value, setValue] = useState(getInitialValue);
  const setAndStoreValue = (newValue) => {
    if (newValue !== "") {
      setValue(newValue);
      localStorage.setItem(key, serializer(newValue));
    }
  };
  return [value, setAndStoreValue];
}

Forked Codesandbox :-

注意:- 您可能需要额外的逻辑来处理您尝试使用 JSON.parse(..) 字符串 反序列化 的情况一个字符串化的对象,因为这会导致错误。您可以将自定义函数传递给您的挂钩,它会为您处理所有这一切。