@zl-ui-kit/components 0.18.7 → 0.18.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +125 -7
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -803,6 +803,16 @@ presetIconifyIcon(icons)
|
|
|
803
803
|
|
|
804
804
|
来源:`@zl-ui-kit/composables`。`service` 统一签名:`(...args) => Promise<R>`。
|
|
805
805
|
|
|
806
|
+
四个 hook 共享同一套状态与方法(`loading` / `data` / `error` / `status` / `run` / `runAsync` /
|
|
807
|
+
`refresh` / `refreshAsync` / `cancel` / `mutate`),差别只在 `data` 怎么取:
|
|
808
|
+
|
|
809
|
+
| Hook | 适用的接口响应 | `data` 内容 |
|
|
810
|
+
| ---------------------- | ------------------------------------ | --------------------------------------------------------------------------- |
|
|
811
|
+
| `useRequest` | 任意 | 原始响应 `R` |
|
|
812
|
+
| `useDataRequest` | 信封对象(如 `{ code, msg, data }`) | 解包后的 `响应[dataKey]`,取不到时回落到 `initialData` |
|
|
813
|
+
| `usePageableRequest` | 数组 **或** 分页对象 | 数组原样返回;对象则 `{ ...响应, pageNum, pageSize }`(页码取本次请求入参) |
|
|
814
|
+
| `usePaginationRequest` | 分页对象 | 行数组,另给 `total` / `current` / `pageSize` / `change*` |
|
|
815
|
+
|
|
806
816
|
#### `useRequest(service, options?, plugins?)` —— 基础形态
|
|
807
817
|
|
|
808
818
|
```ts
|
|
@@ -825,13 +835,82 @@ const { loading, data, error, status, run, runAsync, refresh, refreshAsync, canc
|
|
|
825
835
|
| `options.onBefore/onSuccess/onError/onFinally` | 生命周期回调 |
|
|
826
836
|
| `options.loadingDelay` / `refreshDeps` | 延迟 loading / 依赖变更刷新 |
|
|
827
837
|
|
|
828
|
-
#### `useDataRequest(service, { dataKey = 'data' })` ——
|
|
838
|
+
#### `useDataRequest(service, { dataKey = 'data' })` —— 解包信封响应
|
|
839
|
+
|
|
840
|
+
适用:后端统一返回 `{ code, msg, data }` 这类信封,页面只关心内层业务数据。
|
|
841
|
+
|
|
842
|
+
```ts
|
|
843
|
+
const { data, loading, run, runAsync, refresh } = useDataRequest(getDetailApi)
|
|
844
|
+
// data.value === 响应.data
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
| 选项 | 说明 |
|
|
848
|
+
| ------------- | --------------------------------------------------------------------------------- |
|
|
849
|
+
| `dataKey` | 信封里承载业务数据的字段名,默认 `data` |
|
|
850
|
+
| `initialData` | 解包结果为空(未请求 / 该 key 不存在)时的兜底值,**按解包后的数据形态传** |
|
|
851
|
+
| `manual` | `true` 时挂载不请求,需 `run` / `runAsync` 触发;其余选项与 `useRequest` 完全一致 |
|
|
852
|
+
|
|
853
|
+
真实页面里最常见的三种写法:
|
|
854
|
+
|
|
855
|
+
```ts
|
|
856
|
+
// 1) 自动请求 + 兜底:模板可直接渲染,不必到处判空
|
|
857
|
+
const { data: detail, loading } = useDataRequest(getDetailApi, { initialData: {} })
|
|
858
|
+
|
|
859
|
+
// 2) 手动触发:点击按钮 / 打开抽屉时再查
|
|
860
|
+
const { data: detail, loading, runAsync } = useDataRequest(getDetailApi, { manual: true })
|
|
861
|
+
async function open(row: { id: number }) {
|
|
862
|
+
const res = await runAsync({ id: row.id }) // res 是原始信封,不是解包后的 data
|
|
863
|
+
// 需要解包值请读 detail.value
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
// 3) service 用闭包读取 props(详情组件按 id 查询)
|
|
867
|
+
const { data: detail, run: fetchDetail } = useDataRequest(() => getDetailApi({ id: props.id }))
|
|
868
|
+
// props.id 变化后需自行 refresh() / run(),或把变化源放进 refreshDeps
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
> 注意:`useDataRequest` 只适合**对象信封**。接口直接返回数组时 `rawData[dataKey]` 取不到值,
|
|
872
|
+
> `data` 会恒等于 `initialData`——数组 / 分页响应请改用 `usePageableRequest` 或 `useRequest`。
|
|
873
|
+
> 另外 `onSuccess(data, params)` 与 `runAsync()` 拿到的都是**原始响应 `R`**,不是解包后的值。
|
|
874
|
+
|
|
875
|
+
#### `usePageableRequest(service, options?, plugins?)` —— 列表 / 分页响应适配
|
|
876
|
+
|
|
877
|
+
适用:把「数组响应」和「分页对象响应」统一成同一份 `data`,供 `ZlSearchTable` / `ZlCardPage`
|
|
878
|
+
或自定义列表使用。返回值与 `useRequest` 相同,只改写了 `data`:
|
|
879
|
+
|
|
880
|
+
| 接口响应 | `data.value` |
|
|
881
|
+
| ------------------------------------------- | -------------------------------------------------------------------- |
|
|
882
|
+
| `TreeNode[]` 等数组 | 原样返回数组 |
|
|
883
|
+
| `{ rows, total, pageNum, pageSize }` 等对象 | `{ ...响应, pageNum, pageSize }`(响应没回页码时用本次请求入参补齐) |
|
|
884
|
+
|
|
885
|
+
```ts
|
|
886
|
+
// 后端直接返回数组:data 就是数组,initialData 兜底空列表
|
|
887
|
+
const { data: treeData, loading } = usePageableRequest(getTreeApi, { initialData: [] })
|
|
888
|
+
|
|
889
|
+
// 后端返回分页对象:data.rows 是行数据,data.pageNum / data.pageSize 已被补齐
|
|
890
|
+
const { data: pageData, loading, run } = usePageableRequest(getPageApi, { manual: true })
|
|
891
|
+
run({ pageNum: 2, pageSize: 20 })
|
|
892
|
+
// pageData.value.rows / total / pageNum / pageSize
|
|
893
|
+
```
|
|
894
|
+
|
|
895
|
+
**它不提供 `total` / `current` / `pageSize` / 翻页方法**——需要自己控制分页器时用
|
|
896
|
+
`usePaginationRequest`;只是给组件喂数据、或读取 `loading` / `refresh` 时用 `usePageableRequest`。
|
|
897
|
+
|
|
898
|
+
**实例形态直传组件**(页面侧要接管 `loading` / `refresh` 时):
|
|
829
899
|
|
|
830
900
|
```ts
|
|
831
|
-
const
|
|
832
|
-
//
|
|
901
|
+
const cardRequest = usePageableRequest(getPageApi, { manual: true, initialData: [] })
|
|
902
|
+
// 组件内部的搜索 / 翻页仍调用同一实例的 run,loading / data 与页面共享
|
|
833
903
|
```
|
|
834
904
|
|
|
905
|
+
```vue
|
|
906
|
+
<ZlCardPage :request="cardRequest" card-min-width="200px" :pagination="{ pageSize: 6 }">
|
|
907
|
+
<template #default="{ data }">…</template>
|
|
908
|
+
</ZlCardPage>
|
|
909
|
+
```
|
|
910
|
+
|
|
911
|
+
> `ZlSearchTable` / `ZlCardPage` 默认在内部自行创建 `usePageableRequest`,**页面直接传 service 即可**;
|
|
912
|
+
> 只有需要在页面里读取同一份 `loading` / `data` / `refresh` 时才传实例(见 §6.3 ⑨)。
|
|
913
|
+
|
|
835
914
|
#### `usePaginationRequest(service, { pagination })` —— 分页专用
|
|
836
915
|
|
|
837
916
|
额外返回 `data`(行数组) / `total` / `current` / `pageSize` / `changeCurrent` / `changePageSize` / `changePagination`,分页键名(`pageNum/pageSize/total/rows`)可配置,与后端契约对齐时通过 `pagination` 选项或 `setGlobalOptions` 调整。
|
|
@@ -1150,9 +1229,10 @@ const { data: treeData, loading: treeLoading } = treeReq
|
|
|
1150
1229
|
`ZlChart` 显式 prop 为 `series`,其余配置(title/xAxis/yAxis/tooltip/grid)经 attrs 透传,故用 `v-bind` 传完整 echarts option:
|
|
1151
1230
|
|
|
1152
1231
|
```ts
|
|
1153
|
-
const chartReq = useDataRequest(getChartDataApi
|
|
1232
|
+
const chartReq = useDataRequest(getChartDataApi) // 默认 dataKey='data'
|
|
1233
|
+
const { data: chartData, loading: chartLoading } = chartReq // 顶层 ref 才会在模板自动解包
|
|
1154
1234
|
const chartOption = computed(() => {
|
|
1155
|
-
const d =
|
|
1235
|
+
const d = chartData.value
|
|
1156
1236
|
if (!d) return {}
|
|
1157
1237
|
return {
|
|
1158
1238
|
tooltip: { trigger: 'axis' },
|
|
@@ -1164,7 +1244,8 @@ const chartOption = computed(() => {
|
|
|
1164
1244
|
```
|
|
1165
1245
|
|
|
1166
1246
|
```vue
|
|
1167
|
-
<
|
|
1247
|
+
<el-skeleton v-if="chartLoading" :rows="5" />
|
|
1248
|
+
<ZlChart v-else v-bind="chartOption" />
|
|
1168
1249
|
```
|
|
1169
1250
|
|
|
1170
1251
|
| Prop | 类型 | 说明 |
|
|
@@ -1174,7 +1255,44 @@ const chartOption = computed(() => {
|
|
|
1174
1255
|
|
|
1175
1256
|
> 暴露方法:`clear()`(模板 ref 调用)。尺寸自适应由 `useResizeObserver` 负责,容器需有明确高度。
|
|
1176
1257
|
|
|
1177
|
-
|
|
1258
|
+
需要「点击后再拉取」时用 `manual + runAsync`;`runAsync()` 返回原始信封,解包后的值仍看 `data`:
|
|
1259
|
+
|
|
1260
|
+
```ts
|
|
1261
|
+
const { data: chartData, runAsync: fetchChartAsync } = useDataRequest(getChartDataApi, {
|
|
1262
|
+
manual: true,
|
|
1263
|
+
})
|
|
1264
|
+
async function fetchChart() {
|
|
1265
|
+
const res = await fetchChartAsync() // res: { code, msg, data }
|
|
1266
|
+
console.log(res.code, chartData.value)
|
|
1267
|
+
}
|
|
1268
|
+
```
|
|
1269
|
+
|
|
1270
|
+
#### ⑨ `usePageableRequest` —— 数组 / 分页对象 / 实例直传
|
|
1271
|
+
|
|
1272
|
+
接口返回数组或分页对象都能用;组件需要自己接管 `loading` / `refresh` 时,直接传实例:
|
|
1273
|
+
|
|
1274
|
+
```ts
|
|
1275
|
+
// 数组响应:data 原样是数组
|
|
1276
|
+
const { data: treeData, loading } = usePageableRequest(getTreeApi, { initialData: [] })
|
|
1277
|
+
|
|
1278
|
+
// 分页对象响应:data.rows 是行数据,pageNum / pageSize 已用本次入参补齐
|
|
1279
|
+
const { data: pageData, loading, run } = usePageableRequest(getPageApi, { manual: true })
|
|
1280
|
+
run({ pageNum: 1, pageSize: 20 })
|
|
1281
|
+
|
|
1282
|
+
// 实例形态直传 ZlCardPage:组件的搜索 / 翻页复用同一实例
|
|
1283
|
+
const cardRequest = usePageableRequest(getPageApi, { manual: true, initialData: [] })
|
|
1284
|
+
```
|
|
1285
|
+
|
|
1286
|
+
```vue
|
|
1287
|
+
<ZlCardPage :request="cardRequest" card-min-width="200px" :pagination="{ pageSize: 6 }">
|
|
1288
|
+
<template #default="{ data }">{{ data.name }}</template>
|
|
1289
|
+
</ZlCardPage>
|
|
1290
|
+
```
|
|
1291
|
+
|
|
1292
|
+
> 与 `usePaginationRequest` 的区别:`usePageableRequest` 只改写 `data`、不提供 `total` / 翻页方法,
|
|
1293
|
+
> 用于给组件喂数据;页面要自己渲染分页器时用 `usePaginationRequest`(见 ③ / ④)。
|
|
1294
|
+
|
|
1295
|
+
#### ⑩ `useRequest` 生命周期面板
|
|
1178
1296
|
|
|
1179
1297
|
```ts
|
|
1180
1298
|
const req = useRequest(getResourcePageMaybeFail, { defaultParams: [{ pageNum: 1, pageSize: 5 }] })
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zl-ui-kit/components",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "ZL UI 业务组件库(Element Plus 体系,Zl 前缀)——首批:Icon/AutoTooltip/Tag/CornerTag/Text/Title/Copy/Empty/Pagination/DictTag",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
"file-type": "^20.4.1",
|
|
40
40
|
"dt-sql-parser": "^4.3.1",
|
|
41
41
|
"sql-formatter": "^15.4.2",
|
|
42
|
-
"@zl-ui-kit/
|
|
43
|
-
"@zl-ui-kit/
|
|
44
|
-
"@zl-ui-kit/
|
|
42
|
+
"@zl-ui-kit/utils": "0.18.8",
|
|
43
|
+
"@zl-ui-kit/composables": "0.18.8",
|
|
44
|
+
"@zl-ui-kit/icons": "0.18.8"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"@vueuse/core": "^12.3.0 || ^13.0.0 || ^14.0.0 || ^15.0.0",
|
|
@@ -98,10 +98,10 @@
|
|
|
98
98
|
"@vue-office/pdf": "^2.0.10",
|
|
99
99
|
"@vue-office/pptx": "1.0.1",
|
|
100
100
|
"echarts": "^5.6.0",
|
|
101
|
-
"@jichuang/eslint-config": "1.0.0",
|
|
102
101
|
"@jichuang/tsconfig": "1.0.0",
|
|
103
|
-
"@
|
|
104
|
-
"@
|
|
102
|
+
"@zl-ui-kit/theme": "0.18.8",
|
|
103
|
+
"@jichuang/eslint-config": "1.0.0",
|
|
104
|
+
"@jichuang/vite-config": "1.0.0"
|
|
105
105
|
},
|
|
106
106
|
"repository": {
|
|
107
107
|
"type": "git",
|