1
1
import { useRouteQuery } from '@vueuse/router' ;
2
2
import { computed } from 'vue' ;
3
+ import { useStorage } from '@vueuse/core' ;
3
4
4
- export { useQueryParam } ;
5
+ export { useQueryParam , useQueryParamOrStorage } ;
5
6
6
7
const transformers = {
7
8
number : {
@@ -16,6 +17,12 @@ const transformers = {
16
17
fromQuery : ( value : string ) => value . toLowerCase ( ) === 'true' ,
17
18
toQuery : ( value : boolean ) => ( value ? 'true' : 'false' ) ,
18
19
} ,
20
+ object : {
21
+ fromQuery : ( value : string ) => {
22
+ return JSON . parse ( value ) ;
23
+ } ,
24
+ toQuery : ( value : object ) => JSON . stringify ( value ) ,
25
+ } ,
19
26
} ;
20
27
21
28
function useQueryParam < T > ( { name, defaultValue } : { name : string ; defaultValue : T } ) {
@@ -33,3 +40,27 @@ function useQueryParam<T>({ name, defaultValue }: { name: string; defaultValue:
33
40
} ,
34
41
} ) ;
35
42
}
43
+
44
+ function useQueryParamOrStorage < T > ( { name, storageName, defaultValue } : { name : string ; storageName : string ; defaultValue : T } ) {
45
+ const type = typeof defaultValue ;
46
+ const transformer = transformers [ type as keyof typeof transformers ] ?? transformers . string ;
47
+
48
+ const storageRef = useStorage ( storageName , defaultValue ) ;
49
+ const proxyDefaultValue = transformer . toQuery ( defaultValue as never ) ;
50
+ const proxy = useRouteQuery ( name , proxyDefaultValue ) ;
51
+
52
+ const r = ref ( defaultValue ) ;
53
+
54
+ watch ( r ,
55
+ ( value ) => {
56
+ proxy . value = transformer . toQuery ( value as never ) ;
57
+ storageRef . value = value as never ;
58
+ } ,
59
+ { deep : true } ) ;
60
+
61
+ r . value = ( proxy . value && proxy . value !== proxyDefaultValue
62
+ ? transformer . fromQuery ( proxy . value ) as unknown as T
63
+ : storageRef . value as T ) as never ;
64
+
65
+ return r ;
66
+ }
0 commit comments