@@ -2,7 +2,7 @@ import type { Awaitable, ConfigurableEventFilter, ConfigurableFlush, MaybeRefOrG
2
2
import type { ConfigurableWindow } from '../_configurable'
3
3
import type { StorageLike } from '../ssr-handlers'
4
4
import { pausableWatch , tryOnMounted } from '@vueuse/shared'
5
- import { nextTick , ref , shallowRef , toValue } from 'vue'
5
+ import { computed , nextTick , ref , shallowRef , toValue , watch } from 'vue'
6
6
import { defaultWindow } from '../_configurable'
7
7
import { getSSRHandler } from '../ssr-handlers'
8
8
import { useEventListener } from '../useEventListener'
@@ -121,19 +121,19 @@ export interface UseStorageOptions<T> extends ConfigurableEventFilter, Configura
121
121
initOnMounted ?: boolean
122
122
}
123
123
124
- export function useStorage ( key : string , defaults : MaybeRefOrGetter < string > , storage ?: StorageLike , options ?: UseStorageOptions < string > ) : RemovableRef < string >
125
- export function useStorage ( key : string , defaults : MaybeRefOrGetter < boolean > , storage ?: StorageLike , options ?: UseStorageOptions < boolean > ) : RemovableRef < boolean >
126
- export function useStorage ( key : string , defaults : MaybeRefOrGetter < number > , storage ?: StorageLike , options ?: UseStorageOptions < number > ) : RemovableRef < number >
127
- export function useStorage < T > ( key : string , defaults : MaybeRefOrGetter < T > , storage ?: StorageLike , options ?: UseStorageOptions < T > ) : RemovableRef < T >
128
- export function useStorage < T = unknown > ( key : string , defaults : MaybeRefOrGetter < null > , storage ?: StorageLike , options ?: UseStorageOptions < T > ) : RemovableRef < T >
124
+ export function useStorage ( key : MaybeRefOrGetter < string > , defaults : MaybeRefOrGetter < string > , storage ?: StorageLike , options ?: UseStorageOptions < string > ) : RemovableRef < string >
125
+ export function useStorage ( key : MaybeRefOrGetter < string > , defaults : MaybeRefOrGetter < boolean > , storage ?: StorageLike , options ?: UseStorageOptions < boolean > ) : RemovableRef < boolean >
126
+ export function useStorage ( key : MaybeRefOrGetter < string > , defaults : MaybeRefOrGetter < number > , storage ?: StorageLike , options ?: UseStorageOptions < number > ) : RemovableRef < number >
127
+ export function useStorage < T > ( key : MaybeRefOrGetter < string > , defaults : MaybeRefOrGetter < T > , storage ?: StorageLike , options ?: UseStorageOptions < T > ) : RemovableRef < T >
128
+ export function useStorage < T = unknown > ( key : MaybeRefOrGetter < string > , defaults : MaybeRefOrGetter < null > , storage ?: StorageLike , options ?: UseStorageOptions < T > ) : RemovableRef < T >
129
129
130
130
/**
131
131
* Reactive LocalStorage/SessionStorage.
132
132
*
133
133
* @see https://vueuse.org/useStorage
134
134
*/
135
135
export function useStorage < T extends ( string | number | boolean | object | null ) > (
136
- key : string ,
136
+ key : MaybeRefOrGetter < string > ,
137
137
defaults : MaybeRefOrGetter < T > ,
138
138
storage : StorageLike | undefined ,
139
139
options : UseStorageOptions < T > = { } ,
@@ -154,6 +154,7 @@ export function useStorage<T extends (string | number | boolean | object | null)
154
154
} = options
155
155
156
156
const data = ( shallow ? shallowRef : ref ) ( typeof defaults === 'function' ? defaults ( ) : defaults ) as RemovableRef < T >
157
+ const keyComputed = computed < string > ( ( ) => toValue ( key ) )
157
158
158
159
if ( ! storage ) {
159
160
try {
@@ -177,6 +178,8 @@ export function useStorage<T extends (string | number | boolean | object | null)
177
178
{ flush, deep, eventFilter } ,
178
179
)
179
180
181
+ watch ( keyComputed , ( ) => update ( ) , { flush } )
182
+
180
183
if ( window && listenToStorageChanges ) {
181
184
tryOnMounted ( ( ) => {
182
185
/**
@@ -205,7 +208,7 @@ export function useStorage<T extends (string | number | boolean | object | null)
205
208
// send custom event to communicate within same page
206
209
if ( window ) {
207
210
const payload = {
208
- key,
211
+ key : keyComputed . value ,
209
212
oldValue,
210
213
newValue,
211
214
storageArea : storage as Storage ,
@@ -222,16 +225,16 @@ export function useStorage<T extends (string | number | boolean | object | null)
222
225
223
226
function write ( v : unknown ) {
224
227
try {
225
- const oldValue = storage ! . getItem ( key )
228
+ const oldValue = storage ! . getItem ( keyComputed . value )
226
229
227
230
if ( v == null ) {
228
231
dispatchWriteEvent ( oldValue , null )
229
- storage ! . removeItem ( key )
232
+ storage ! . removeItem ( keyComputed . value )
230
233
}
231
234
else {
232
235
const serialized = serializer . write ( v as any )
233
236
if ( oldValue !== serialized ) {
234
- storage ! . setItem ( key , serialized )
237
+ storage ! . setItem ( keyComputed . value , serialized )
235
238
dispatchWriteEvent ( oldValue , serialized )
236
239
}
237
240
}
@@ -244,11 +247,11 @@ export function useStorage<T extends (string | number | boolean | object | null)
244
247
function read ( event ?: StorageEventLike ) {
245
248
const rawValue = event
246
249
? event . newValue
247
- : storage ! . getItem ( key )
250
+ : storage ! . getItem ( keyComputed . value )
248
251
249
252
if ( rawValue == null ) {
250
253
if ( writeDefaults && rawInit != null )
251
- storage ! . setItem ( key , serializer . write ( rawInit ) )
254
+ storage ! . setItem ( keyComputed . value , serializer . write ( rawInit ) )
252
255
return rawInit
253
256
}
254
257
else if ( ! event && mergeDefaults ) {
@@ -276,7 +279,7 @@ export function useStorage<T extends (string | number | boolean | object | null)
276
279
return
277
280
}
278
281
279
- if ( event && event . key !== key )
282
+ if ( event && event . key !== keyComputed . value )
280
283
return
281
284
282
285
pauseWatch ( )
0 commit comments