Skip to content

Commit 3b8c765

Browse files
authored
Merge pull request #14 from InhiblabCore/dev
feat: 新增 useUrlState 和 useFetch
2 parents f0c118d + 645fd4e commit 3b8c765

File tree

15 files changed

+430
-119
lines changed

15 files changed

+430
-119
lines changed

packages/hooks/docs/.vitepress/config.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { defineConfig } from 'vitepress'
22
import { applyPlugins } from '@vue-hooks-plus/md-demo-plugins'
33
import { genTemp } from '@vue-hooks-plus/vite-plugin-gen-temp'
4+
import { resolve } from 'path'
45

56
const base = process.env.NODE_ENV === 'production' ? '/vue-hooks-plus/docs' : ''
6-
const { resolve } = require('path')
77

88
export default defineConfig({
99
head: [
@@ -123,6 +123,10 @@ function getHooksSidebar() {
123123
text: '节流',
124124
link: '/useRequest/throttle/',
125125
},
126+
{
127+
text: '并行请求',
128+
link: '/useRequest/fetchs/',
129+
},
126130
{
127131
text: '缓存 & SWR',
128132
link: '/useRequest/cache/',
@@ -145,6 +149,7 @@ function getHooksSidebar() {
145149
text: 'State',
146150
items: [
147151
{ text: 'useBoolean', link: '/useBoolean/' },
152+
{ text: 'useUrlState', link: '/useUrlState/' },
148153
{ text: 'useFormatResult', link: '/useFormatResult/' },
149154
{ text: 'useDebounce', link: '/useDebounce/' },
150155
{ text: 'useThrottle', link: '/useThrottle/' },
@@ -162,6 +167,7 @@ function getHooksSidebar() {
162167
items: [
163168
{ text: 'useDebounceFn', link: '/useDebounceFn/' },
164169
{ text: 'useThrottleFn', link: '/useThrottleFn/' },
170+
{ text: 'useFetchs', link: '/useFetchs/' },
165171
{ text: 'useLockFn', link: '/useLockFn/' },
166172
{ text: 'useUpdate', link: '/useUpdate/' },
167173
{ text: 'useInterval', link: '/useInterval/' },

packages/hooks/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"js-cookie": "^2.x.x",
4040
"lodash": "^4.17.21",
4141
"marked": "^4.0.17",
42+
"qs": "^6.11.0",
4243
"query-string": "^7.1.1"
4344
},
4445
"devDependencies": {
@@ -48,6 +49,7 @@
4849
"@types/lodash": "^4.14.178",
4950
"@types/marked": "^4.0.3",
5051
"@types/node": "^17.0.21",
52+
"@types/qs": "^6.9.7",
5153
"@vitejs/plugin-vue": "^2.0.0",
5254
"@vue-hooks-plus/md-demo-plugins": "^1.0.0",
5355
"@vue-hooks-plus/vite-plugin-gen-temp": "1.4.0",

packages/hooks/pnpm-lock.yaml

Lines changed: 27 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/hooks/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import useEventEmitter from './useEventEmitter'
1414
import useFavicon from './useFavicon'
1515
import useFocusWithin from './useFocusWithin'
1616
import useFormatResult from './useFormatResult'
17+
import useFetchs from './useFetchs'
1718
import useHover from './useHover'
1819
import usePreview from './usePreview'
1920
import useInterval from './useInterval'
@@ -58,6 +59,7 @@ export {
5859
useFavicon,
5960
useFocusWithin,
6061
useFormatResult,
62+
useFetchs,
6163
useHover,
6264
useInterval,
6365
useInfiniteScroll,
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<template>
2+
<div>
3+
<div v-for="item in datas" :key="item.key">
4+
{{ item.data }}
5+
</div>
6+
</div>
7+
</template>
8+
9+
<script lang="ts" setup>
10+
import { computed } from 'vue'
11+
import { useFetchs } from 'vue-hooks-plus'
12+
13+
async function getUsername(params: { desc: string }): Promise<string> {
14+
return new Promise(resolve => {
15+
setTimeout(() => {
16+
resolve(`vue-hooks-plus ${params.desc}`)
17+
}, 2000)
18+
})
19+
}
20+
21+
const arr = ['', '小牛', '中牛', '大牛']
22+
23+
const { fetchRun, fetchs } = useFetchs(
24+
getUsername,
25+
{ manual: true },
26+
{
27+
fetchKey: params => {
28+
return params.desc
29+
},
30+
},
31+
)
32+
33+
arr.forEach(item => {
34+
fetchRun({ desc: item })
35+
})
36+
37+
const datas = computed(() =>
38+
Object.keys(fetchs.value).map(key => ({
39+
name: fetchs.value[key].key,
40+
data: fetchs.value[key].data,
41+
loading: fetchs.value[key].loading,
42+
key: fetchs.value[key].key,
43+
})),
44+
)
45+
</script>
46+
47+
<style scoped lang="less"></style>

packages/hooks/src/useFetchs/index.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: /useFetchs
5+
---
6+
7+
# useFetchs
8+
9+
基于 `useRequest` 实现强大的并行请求的能力,优雅的管理多个相同url请求,不同参数的请求。
10+
11+
## 代码演示
12+
13+
### 基础用法
14+
15+
<demo src="./demo/demo.vue"
16+
language="vue"
17+
title="基本用法"
18+
desc="多个请求同时进行的请求状态管理">
19+
</demo>
20+
21+
22+
## API
23+
24+
```typescript
25+
const { fetchRun, fetchs } = useFetchs(
26+
service,
27+
options,
28+
{
29+
fetchKey: params => string | number
30+
},
31+
)
32+
```
33+
34+
### Params
35+
36+
| 参数 | 说明 | 类型 | 默认值 |
37+
| ------- | --------------------- | ----------------------------------------------------------- | ------ |
38+
| fetchs | 收集的所有请求状态 | ` FetchType<TData, TParams> ` | - | |
39+
| fetchRun | 需要运行的函数 | `(...args) => void` | - | |
40+
| options | 额外的配置项 | `useRequest Options` | - |
41+
42+
### Options
43+
44+
参考 `useRequest` 的option,注意,` fetchRun ` 需要在手动模式下 `manual` 强制为 `true`
45+
46+
| 参数 | 说明 | 类型 |
47+
| ------------- | ------------------ | --------- |
48+
| fetchKey | 获取key,用于注入useRequest的cacheKey | `(...args) => string \| number` |
49+
50+

packages/hooks/src/useFetchs/index.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { Service, Options } from '@/useRequest/types'
2+
import { ref, watch } from 'vue'
3+
import useRequest from '../useRequest/index'
4+
5+
const DEFAULT_KEY = 'VUE_HOOKS_PLUS_USE_REQUEST_DEFAULT_KEY'
6+
7+
type FetchType<TData, TParams> = Record<
8+
string | number,
9+
{
10+
data: TData | undefined
11+
params: TParams
12+
loading: boolean
13+
key: string | number
14+
}
15+
>
16+
17+
type ParamsType<P> = P extends any[] ? any[] : any
18+
19+
function useFetchs<TData, TParams>(
20+
service: Service<TData, ParamsType<TParams>>,
21+
options: Options<TData, ParamsType<TParams>, any> & {
22+
manual: true
23+
},
24+
self: {
25+
fetchKey?: (...args: ParamsType<TParams>) => string
26+
},
27+
) {
28+
const fetchKeyPersist = ref(self?.fetchKey)
29+
30+
const fetchs = ref<FetchType<TData, TParams>>({})
31+
const newFetchs = ref<FetchType<TData, TParams>>({})
32+
33+
const getFetchs = (fetchs_: Record<string | number, any>) => {
34+
newFetchs.value = fetchs_
35+
}
36+
37+
const fetchRun = (...args: TParams extends any[] ? any[] : any) => {
38+
const newstFetchKey = ref()
39+
const cacheKey = fetchKeyPersist.value?.(...args) ?? DEFAULT_KEY
40+
newstFetchKey.value = cacheKey
41+
42+
const { data, run, params, loading } = useRequest(service, {
43+
...options,
44+
cacheKey,
45+
manual: true,
46+
})
47+
48+
// @ts-ignore
49+
fetchs.value[cacheKey as string] = { key: cacheKey, data, params, loading }
50+
51+
getFetchs(fetchs.value)
52+
53+
run(...args)
54+
55+
watch([data, params, loading, newstFetchKey], curr => {
56+
const [
57+
newData = undefined,
58+
newParams = undefined,
59+
newLoading = false,
60+
key = DEFAULT_KEY,
61+
] = curr
62+
fetchs.value[key as string] = {
63+
key: key as string | number,
64+
// @ts-ignore
65+
data: newData,
66+
// @ts-ignore
67+
params: newParams,
68+
// @ts-ignore
69+
loading: newLoading,
70+
}
71+
getFetchs(fetchs.value)
72+
})
73+
}
74+
75+
return {
76+
fetchs: newFetchs,
77+
fetchRun,
78+
}
79+
}
80+
81+
export default useFetchs

packages/hooks/src/useFocusWithin/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import useEventListener from "../useEventListener";
22
import type { BasicTarget } from "../utils/domTarget";
3-
import { useBoolean } from "..";
3+
import useBoolean from "../useBoolean";
44

55
export interface Options {
66
onFocus?: (e: FocusEvent) => void;

0 commit comments

Comments
 (0)