From 985e72e847b6cb4a6944dec2881d93ddf5daf725 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Sun, 24 Jul 2022 18:04:57 +0800 Subject: [PATCH] chore: update --- packages/core/useStorage/index.md | 2 +- packages/core/useStorage/index.test.ts | 15 ++++++++++----- packages/core/useStorage/index.ts | 10 +++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/core/useStorage/index.md b/packages/core/useStorage/index.md index 95b3a0aacd6..ff6fa241d94 100644 --- a/packages/core/useStorage/index.md +++ b/packages/core/useStorage/index.md @@ -60,7 +60,7 @@ console.log(state.hello) // 'nihao', from storage console.log(state.greeting) // 'hello', from merged default value ``` -When setting it to true, it will perform a **shallow merge** for objects/arrays. You can pass a custom merge function or deep merge, for example: +When setting it to true, it will perform a **shallow merge** for objects. You can pass a function to perform custom merge (e.g. deep merge), for example: ```ts const state = useStorage( diff --git a/packages/core/useStorage/index.test.ts b/packages/core/useStorage/index.test.ts index e726efce839..51b2e563c3d 100644 --- a/packages/core/useStorage/index.test.ts +++ b/packages/core/useStorage/index.test.ts @@ -336,21 +336,26 @@ describe('useStorage', () => { // basic storage.setItem(KEY, '0') const basicRef = useStorage(KEY, 1, storage, { mergeDefaults: true }) - expect(basicRef.value).toBe(1) + expect(basicRef.value).toBe(0) // object storage.setItem(KEY, JSON.stringify({ a: 1 })) const objectRef = useStorage(KEY, { a: 2, b: 3 }, storage, { mergeDefaults: true }) - expect(JSON.stringify(objectRef.value)).toBe(JSON.stringify({ a: 2, b: 3 })) + expect(objectRef.value).toEqual({ a: 1, b: 3 }) // array storage.setItem(KEY, JSON.stringify([1])) const arrayRef = useStorage(KEY, [2], storage, { mergeDefaults: true }) - expect(JSON.stringify(arrayRef.value)).toBe(JSON.stringify([1, 2])) + expect(arrayRef.value).toEqual([1]) // custom function storage.setItem(KEY, JSON.stringify([{ a: 1 }])) - const customRef = useStorage(KEY, [{ a: 3 }], storage, { mergeDefaults: (value, initial) => ([...initial, ...value]) }) - expect(JSON.stringify(customRef.value)).toBe(JSON.stringify([{ a: 3 }, { a: 1 }])) + const customRef = useStorage(KEY, [{ a: 3 }], storage, { mergeDefaults: (value, initial) => [...initial, ...value] }) + expect(customRef.value).toEqual([{ a: 3 }, { a: 1 }]) + + // custom function 2 + storage.setItem(KEY, '1') + const customRef2 = useStorage(KEY, 2, storage, { mergeDefaults: (value, initial) => value + initial }) + expect(customRef2.value).toEqual(3) }) }) diff --git a/packages/core/useStorage/index.ts b/packages/core/useStorage/index.ts index 8f1abcbc06f..f2ca68b9e52 100644 --- a/packages/core/useStorage/index.ts +++ b/packages/core/useStorage/index.ts @@ -78,8 +78,8 @@ export interface UseStorageOptions extends ConfigurableEventFilter, Configura /** * Merge the default value with the value read from the storage. * - * When setting to true, it will perform a shallow merge for objects/arrays. - * You can pass a custom merge function or deep merge. + * When setting it to true, it will perform a **shallow merge** for objects. + * You can pass a function to perform custom merge (e.g. deep merge), for example: * * @default false */ @@ -198,9 +198,9 @@ export function useStorage const value = serializer.read(rawValue) if (isFunction(mergeDefaults)) return mergeDefaults(value, rawInit) - else if (type === 'object') - return Array.isArray(value) ? [...rawInit as any, ...value] : { ...rawInit as any, ...value } - return rawInit + else if (type === 'object' && !Array.isArray(value)) + return { ...rawInit as any, ...value } + return value } else if (typeof rawValue !== 'string') { return rawValue