返回 slidev
route.ts
根目录 / packages / client / logic / route.ts
1 import type { WritableComputedRef } from 'vue'
2 import { computed, nextTick, unref } from 'vue'
3 import { useRouter } from 'vue-router'
4
5 export function useRouteQuery<T extends string | string[]>(
6 name: string,
7 defaultValue?: T,
8 {
9 mode = 'replace',
10 } = {},
11 ): WritableComputedRef<T> {
12 const router = useRouter()
13
14 return computed<any>({
15 get() {
16 const data = router.currentRoute.value.query[name]
17 if (data == null)
18 return defaultValue ?? null
19 if (Array.isArray(data))
20 return data.filter(Boolean)
21 return data
22 },
23 set(v) {
24 nextTick(() => {
25 const oldValue = router.currentRoute.value.query[name]
26 if ((oldValue ?? defaultValue?.toString()) === v.toString())
27 return
28 router[unref(mode) as 'replace' | 'push']({
29 query: {
30 ...router.currentRoute.value.query,
31 [name]: `${v}` === defaultValue ? undefined : v,
32 },
33 })
34 })
35 },
36 })
37 }
38
38 lines TYPESCRIPT