1- import { computed , Ref } from 'vue-demi' ;
1+ import { computed , reactive , Ref , watch } from 'vue-demi' ;
22
33import { useRoute , useRouter } from './helpers' ;
44import { queueQueryUpdate } from './queue-query-update' ;
55import { RouteQueryTransformer } from './transformers' ;
66import { RouteQuery } from './types' ;
7+ import { isObject } from './utils' ;
78
89export function useRouteQuery ( key : string , defaultValue : string ) : Ref < string > ;
910export function useRouteQuery ( key : string , defaultValue : string | null ) : Ref < string | null > ;
@@ -16,39 +17,60 @@ export function useRouteQuery<T>(key: string, defaultValue: T, transformer?: Rou
1617 queueQueryUpdate ( router , route . value . query , key , newValue ) ;
1718 }
1819
19- return computed ( {
20- get ( ) {
21- if ( ! ( key in route . value . query ) ) {
22- return defaultValue ;
23- }
20+ function get ( ) : T {
21+ if ( ! ( key in route . value . query ) ) {
22+ return defaultValue ;
23+ }
2424
25- const value = getQueryValue ( route . value . query , key ) ;
25+ const value = getQueryValue ( route . value . query , key ) ;
2626
27- if ( ! value ) {
28- return defaultValue ;
29- }
27+ if ( ! value ) {
28+ return defaultValue ;
29+ }
3030
31- if ( ! transformer ) {
32- // we know for sure that the value is a T (really a string) here if transformer is not provided
33- return value as unknown as T ;
34- }
31+ if ( ! transformer ) {
32+ // we know for sure that the value is a T (really a string) here if transformer is not provided
33+ return value as unknown as T ;
34+ }
3535
36- const transformedValue = transformer . fromQuery ( value ) ;
37- if ( transformedValue === undefined ) {
38- return defaultValue ;
39- }
36+ const transformedValue = transformer . fromQuery ( value ) ;
37+ if ( transformedValue === undefined ) {
38+ return defaultValue ;
39+ }
40+
41+ return transformedValue ;
42+ }
4043
41- return transformedValue ;
44+ function set ( value : T ) {
45+ if ( ! transformer ) {
46+ // we know for sure that the value is a string or null here if transformer is not provided
47+ updateQueryParam ( value as unknown as string | null ) ;
48+ return ;
49+ }
50+
51+ const transformedValue = transformer . toQuery ( value ?? undefined ) ;
52+ updateQueryParam ( transformedValue ) ;
53+ }
54+
55+ let valueWatchStopHandle : ( ( ) => void ) | undefined ;
56+
57+ return computed ( {
58+ get ( ) {
59+ const value = get ( ) ;
60+ if ( isObject ( value ) ) {
61+ const reactiveValue = reactive ( value ) as T & object ;
62+ valueWatchStopHandle ?.( ) ;
63+ valueWatchStopHandle = watch ( reactiveValue , ( newValue ) => {
64+ set ( newValue ) ;
65+ } ) ;
66+ return reactiveValue ;
67+ }
68+ return value ;
4269 } ,
4370 set ( value ) {
44- if ( ! transformer ) {
45- // we know for sure that the value is a string or null here if transformer is not provided
46- updateQueryParam ( value as unknown as string | null ) ;
47- return ;
48- }
71+ valueWatchStopHandle ?.( ) ;
4972
50- const transformedValue = transformer . toQuery ( value ?? undefined ) ;
51- updateQueryParam ( transformedValue ) ;
73+ set ( value ) ;
5274 } ,
5375 } ) ;
5476}
0 commit comments