diff --git a/src/create-storage-hook/index.ts b/src/create-storage-hook/index.ts index 6a1d7b81..924acba9 100644 --- a/src/create-storage-hook/index.ts +++ b/src/create-storage-hook/index.ts @@ -84,7 +84,22 @@ export function createStorage(type: StorageType) { } }; - return function useStorage( + const useSetStorage = (key: string, serializer: Serializer) => useCallback( + (v: T | null) => { + try { + if (v === null) { + removeStorageItem(key); + } else { + setStorageItem(key, serializer(v)); + } + } catch (e) { + console.warn(e); + } + }, + [key, serializer] + ); + + function useStorage( key: string, serverValue?: NotUndefined | undefined, options: UseStorageRawOption | UseStorageParserOption = { @@ -167,5 +182,10 @@ export function createStorage(type: StorageType) { }, [deserializer, key, serializer, serverValue]); return [deserialized ?? serverValue ?? null, setState] as const; + } + + return { + useStorage, + useSetStorage }; } diff --git a/src/use-local-storage/index.ts b/src/use-local-storage/index.ts index ea3c050b..9e3afdf8 100644 --- a/src/use-local-storage/index.ts +++ b/src/use-local-storage/index.ts @@ -7,7 +7,7 @@ export type { UseStorageParserOption as UseLocalStorageParserOption } from '../create-storage-hook'; -const useLocalStorage = createStorage('localStorage'); +const { useStorage: useLocalStorage, useSetStorage: useSetLocalStorage } = createStorage('localStorage'); /** @see https://foxact.skk.moe/use-local-storage */ -export { useLocalStorage }; +export { useLocalStorage, useSetLocalStorage }; diff --git a/src/use-session-storage/index.ts b/src/use-session-storage/index.ts index f08024fa..693fb03a 100644 --- a/src/use-session-storage/index.ts +++ b/src/use-session-storage/index.ts @@ -7,7 +7,7 @@ export type { UseStorageParserOption as UseSessionStorageParserOption } from '../create-storage-hook'; -const useSessionStorage = createStorage('sessionStorage'); +const { useStorage: useSessionStorage, useSetStorage: useSetSessionStorage } = createStorage('sessionStorage'); /** @see https://foxact.skk.moe/use-session-storage */ -export { useSessionStorage }; +export { useSessionStorage, useSetSessionStorage };