整合开关和 Storage

前面的章节中已经实现了支持布尔量切换的 atom 创建,如果再需要将布尔量保存到 storage 中,那么就又要费一番操作。这里提供一个将两种操作结合起来的方法。这种结合方法在结合其他操作的时候也非常常用。

export function atomWithToggleAndStorage(
  key: string,
  initialValue?: boolean,
  storage?: any
): WritableAtom<boolean, [boolean?], void> {
  const anAtom = atomWithStorage(key, initialValue, storage);
  const derivedAtom = atom(
    (get) => get(anAtom),
    (get, set, nextValue?: boolean) => {
      const update = nextValue ?? !get(anAtom);
      void set(anAtom, update);
    }
  );

  return derivedAtom as WritableAtom<boolean, [boolean?], void>;
}