Skip to content

Commit 19c1d7d

Browse files
committed
docs: useUrlState
1 parent ffefbd3 commit 19c1d7d

File tree

17 files changed

+309
-19
lines changed

17 files changed

+309
-19
lines changed

docs/.vitepress/config/zh.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ export const zh = defineConfig({
135135
base: '/zh/hooks/', items: [
136136
...sidebarGuide(),
137137
...siderbarUseRequest(),
138+
...siderbarUseRequestPlugin(),
138139
...sidebarHooks()
139140
]
140141
}

docs/demo/useUrlState/demo.vue

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<template>
2+
<div>
3+
<vhp-button @click="() => addCount()">add</vhp-button>
4+
<vhp-button style="margin-left: 16px;" @click="() => subCount()">sub</vhp-button>
5+
<vhp-button style="margin-left: 16px;" @click="() => addPage()">add-page</vhp-button>
6+
<vhp-button style="margin-left: 16px;" @click="() => subPage()">sub-page</vhp-button>
7+
<vhp-button style="margin-left: 16px;" @click="() => clear()">
8+
clear
9+
</vhp-button>
10+
<br />
11+
<div>count: {{ state.count }}</div>
12+
<div>page: {{ state.page }}</div>
13+
</div>
14+
</template>
15+
16+
<script lang="ts" setup>
17+
import useUrlState from '@vue-hooks-plus/use-url-state'
18+
19+
const defaultState = { count: 0, page: 1 }
20+
const state = useUrlState(defaultState, {
21+
localStorageKey: 'localStorageKey',
22+
})
23+
const addCount = () => state.value.count++
24+
const subCount = () => state.value.count--
25+
const addPage = () => state.value.page++
26+
const subPage = () => state.value.page--
27+
const clear = () => (state.value = Object.assign({}, defaultState))
28+
</script>

docs/en/hooks/useUrlState.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
map:
3+
# 映射到docs的路径
4+
path: /useUrlState
5+
---
6+
7+
# useUrlState
8+
9+
A hook that store the state into url query.
10+
11+
## Install
12+
13+
```bash
14+
npm i @vue-hooks-plus/use-url-state
15+
```
16+
17+
18+
## Code demonstration
19+
20+
<demo src="useUrlState/demo.vue"
21+
language="vue"
22+
title="Default usage"
23+
desc="Store the state into url query. By set the value to undefined, the attribute can be removed from the url query."> </demo>
24+
25+
## API
26+
27+
```typescript
28+
const state = useUrlState(defaultState, {
29+
localStorageKey: 'localStorageKey',
30+
routerPushFn,
31+
})
32+
33+
interface UseUrlStateOptions {
34+
localStorageKey?: string
35+
}
36+
```
37+
38+
## Params
39+
40+
| Property | Description | Type | Default |
41+
| --- | --- | --- | --- |
42+
| initialState | default | `S` \| `() => S` | - |
43+
| options | When setting `localStorageKey`, if url has no parameter, the value of localStorage is used |
44+
| UseUrlStateOptions | - | | routerPushFn | In general, the `router.push` method of passing the vue-router just works | `function` | - |
45+
46+
## Result
47+
48+
| Property | Description | Type |
49+
| -------- | ---------------- | ---- |
50+
| state | Url query object | - |

docs/zh/hooks/useUrlState.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---
2+
map:
3+
# 映射到docs的路径
4+
path: /useUrlState
5+
---
6+
7+
# useUrlState
8+
9+
通过 url query 来管理 state 的 Hook。
10+
11+
## 安装
12+
13+
```bash
14+
npm i @vue-hooks-plus/use-url-state
15+
```
16+
17+
## 代码演示
18+
19+
<demo src="useUrlState/demo.vue"
20+
language="vue"
21+
title="基本用法"
22+
desc="将状态同步到 url query 中。通过设置值为 undefind, 可以从 url query 上彻底删除某个属性,从而使用默认值。"> </demo>
23+
24+
## API
25+
26+
```typescript
27+
const state = useUrlState(defaultState, {
28+
localStorageKey: 'localStorageKey',
29+
routerPushFn,
30+
})
31+
32+
interface UseUrlStateOptions {
33+
localStorageKey?: string
34+
}
35+
```
36+
37+
## Params
38+
39+
| 参数 | 说明 | 类型 | 默认值 |
40+
| --- | --- | --- | --- |
41+
| initialState | 默认值 | `S` \| `() => S` | - |
42+
| options | 设置`localStorageKey`的话,若 url 没有参数,会使用存在 localStorage 的值 | UseUrlStateOptions | - |
43+
| routerPushFn | 一般来说,传 vue-router 的 `router.push`方法就行 | `function` | - |
44+
45+
## Result
46+
47+
| 参数 | 说明 | 类型 |
48+
| ----- | ------ | ---- |
49+
| state | 状态值 | - |

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"@vue-hooks-plus/use-request": "workspace:^2.0.0",
4646
"@vue-hooks-plus/use-request-plugins": "workspace:^2.0.0",
4747
"@vue-hooks-plus/use-worker": "workspace:^1.0.0",
48+
"@vue-hooks-plus/use-url-state": "workspace:^1.0.0",
4849
"@vue-hooks-plus/vite-plugin-gen-temp": "^2.6.6",
4950
"@vue-hooks-plus/vitepress": "^1.2.4",
5051
"@vue-hooks-plus/vitepress-demo-block": "workspace:^1.0.0",

packages/hooks/package.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "vue-hooks-plus",
3-
"version": "2.3.0-beta.1",
3+
"version": "2.3.0-beta.2",
44
"description": "Vue hooks library",
55
"files": [
66
"dist",
@@ -31,8 +31,6 @@
3131
"@vue/devtools-api": "^6.5.0",
3232
"js-cookie": "^3.0.1",
3333
"lodash-es": "^4.17.21",
34-
"qs": "^6.11.0",
35-
"query-string": "^7.1.1",
3634
"screenfull": "^5.0.0"
3735
},
3836
"peerDependencies": {

packages/hooks/src/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ import useTimeout from './useTimeout'
4545
import useTitle from './useTitle'
4646
import useTrackedEffect from './useTrackedEffect'
4747
import useUpdate from './useUpdate'
48-
import useUrlState from './useUrlState'
4948
import useVirtualList from './useVirtualList'
5049
import useWhyDidYouUpdate from './useWhyDidYouUpdate'
5150
import useWinResize from './useWinResize'
@@ -102,7 +101,6 @@ export {
102101
useTitle,
103102
useTrackedEffect,
104103
useUpdate,
105-
useUrlState,
106104
useVirtualList,
107105
useWhyDidYouUpdate,
108106
useWinResize,

packages/resolvers/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@vue-hooks-plus/resolvers",
3-
"version": "1.2.5",
3+
"version": "1.3.0",
44
"description": "",
55
"type": "module",
66
"main": "dist/index.cjs",

packages/resolvers/src/unplugin-auto-import-resolver/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { resolveModule } from 'local-pkg'
33
import { readFileSync } from 'node:fs'
44
import VueHooksPlusUseWorkerResolver from './useWorkerResolver'
55
import VueHooksPlusUseImmerResolver from './useImmerResolver'
6+
import VueHooksPlusUseUrlStateResolver from './useUrlStateResolver'
67

78
let hooks: string[] | undefined
89

@@ -57,4 +58,4 @@ function VueHooksPlusResolver(options: VueHooksPlusResolverOptions = {}): Resolv
5758
}
5859
}
5960

60-
export { VueHooksPlusUseImmerResolver, VueHooksPlusUseWorkerResolver, VueHooksPlusResolver }
61+
export { VueHooksPlusUseImmerResolver, VueHooksPlusUseWorkerResolver, VueHooksPlusResolver, VueHooksPlusUseUrlStateResolver }
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { Resolver } from 'unplugin-auto-import/types'
2+
let hooks: string[] | undefined
3+
4+
export type VueHooksPlusResolverOptions = {
5+
/**
6+
* prefix for name of components
7+
*
8+
* @default ''
9+
*/
10+
prefix?: string
11+
}
12+
13+
function queryMetaData() {
14+
try {
15+
hooks = ['useUrlState ']
16+
} catch (e) {
17+
console.error(e)
18+
throw new Error(
19+
'[@vue-hooks-plus/use-url-state:plugins] failed to load @vue-hooks-plus/use-url-state, have you installed it?',
20+
)
21+
}
22+
}
23+
24+
function resolveHooks(name: string, options: VueHooksPlusResolverOptions) {
25+
if (!hooks) return
26+
27+
const { prefix } = options
28+
if (prefix) {
29+
if (!name.startsWith(prefix)) return
30+
name = name.substring(prefix.length)
31+
}
32+
if (!hooks.includes(name)) return
33+
34+
return {
35+
name,
36+
from: '@vue-hooks-plus/use-url-state',
37+
}
38+
}
39+
40+
export default function VueHooksPlusUseUrlStateResolver(
41+
options: VueHooksPlusResolverOptions = {},
42+
): Resolver {
43+
return name => {
44+
if (!hooks) {
45+
queryMetaData()
46+
}
47+
return resolveHooks(name, options)
48+
}
49+
}

0 commit comments

Comments
 (0)