@zl-ui-kit/components 0.6.1 → 0.6.3
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 +131 -43
- package/dist/components/ZlCard/index.css +1 -1
- package/dist/components/ZlCardPage/index.vue.mjs +71 -59
- package/dist/components/ZlPagination/index.css +1 -1
- package/dist/components/ZlPagination/index.vue.mjs +2 -2
- package/dist/components/ZlPagination/index2.vue.mjs +26 -25
- package/dist/components/ZlTabs/index.vue.d.ts +7 -1
- package/dist/components/ZlTabs/index.vue.mjs +34 -28
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -53,15 +53,17 @@ import { ZlEditor, ZlSqlEditor } from '@zl-ui-kit/components/editor'
|
|
|
53
53
|
import { ZlFilePreview, ZlFileViewer } from '@zl-ui-kit/components/file-preview'
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
> 例外:`ZlPdfViewer` 没有重型依赖,仍留在主入口,`import { ZlPdfViewer } from '@zl-ui-kit/components'`。
|
|
56
|
+
> 例外:`ZlPdfViewer` 没有重型依赖,仍留在主入口,`import { ZlPdfViewer } from '@zl-ui-kit/components'`。
|
|
57
57
|
> `app.use(ZlUI)` 全量注册**不含**上述子入口组件,需要的话手动 `app.component('ZlChart', ZlChart)`。
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
| | | |
|
|
60
|
+
| ---------------------------------------------------- | --- | --------------------------------- |
|
|
61
|
+
| **关于 `echarts` 版本**(\`peerDependencies: "^5.6.0 | | ^6.0.0"\`,5.6+ 与 6.x 均支持): |
|
|
60
62
|
|
|
61
|
-
- `ZlChart` 内部是 `import * as echarts from 'echarts'`(全量包,开箱即用、无需自己 `use()` 注册图表类型);
|
|
62
|
-
若宿主用 `echarts/core` + 按需注册,两者是两份独立实例,产物会同时含两份 echarts(实测约 +600KB)。
|
|
63
|
+
- `ZlChart` 内部是 `import * as echarts from 'echarts'`(全量包,开箱即用、无需自己 `use()` 注册图表类型);
|
|
64
|
+
若宿主用 `echarts/core` + 按需注册,两者是两份独立实例,产物会同时含两份 echarts(实测约 +600KB)。
|
|
63
65
|
此时可按需改用宿主实例自绘,或在构建里把 `echarts` 设为 external 由宿主提供。
|
|
64
|
-
- 升级到 **echarts 6** 后默认主题变了(配色、legend 默认挪到画布底部、轴标签防溢出默认开启),
|
|
66
|
+
- 升级到 **echarts 6** 后默认主题变了(配色、legend 默认挪到画布底部、轴标签防溢出默认开启),
|
|
65
67
|
想保持 v5 观感:`import 'echarts/theme/v5'` + `<ZlChart theme="v5" ... />`(`theme` prop 见 §6 ⑧)。
|
|
66
68
|
|
|
67
69
|
接入:
|
|
@@ -108,20 +110,20 @@ import '@zl-ui-kit/theme/themes.css'
|
|
|
108
110
|
|
|
109
111
|
> **`0.5.0` 起不再包含任何微前端依赖**
|
|
110
112
|
>
|
|
111
|
-
> 微前端通信层(`useMicroApp` / `useMicroAction` / `usePageTabs` / `useMicroGlobalData`)与
|
|
112
|
-
> `formatMicroUrl` 工具已全部移除,`@micro-zoe/micro-app` 不再是 peer 依赖 —— 安装本库不会
|
|
113
|
-
> 再拉入这个约 2.4MB 的包,`@zl-ui-kit/composables` 的产物里也没有它的静态 import
|
|
114
|
-
> (旧版在 Node 原生 ESM / SSR 下会因这条 import 报 `ERR_MODULE_NOT_FOUND`)。
|
|
115
|
-
> 全局数据(`locale` / `theme` / `token` / 用户 / 权限 / `config`)改用 `useGlobalData()`,
|
|
113
|
+
> 微前端通信层(`useMicroApp` / `useMicroAction` / `usePageTabs` / `useMicroGlobalData`)与
|
|
114
|
+
> `formatMicroUrl` 工具已全部移除,`@micro-zoe/micro-app` 不再是 peer 依赖 —— 安装本库不会
|
|
115
|
+
> 再拉入这个约 2.4MB 的包,`@zl-ui-kit/composables` 的产物里也没有它的静态 import
|
|
116
|
+
> (旧版在 Node 原生 ESM / SSR 下会因这条 import 报 `ERR_MODULE_NOT_FOUND`)。
|
|
117
|
+
> 全局数据(`locale` / `theme` / `token` / 用户 / 权限 / `config`)改用 `useGlobalData()`,
|
|
116
118
|
> 纯 `localStorage` 持久化;`useLocale`、主题、字典等能力的用法与行为不变。
|
|
117
119
|
|
|
118
120
|
> **两个「看起来像错、其实正常」的现象**
|
|
119
121
|
>
|
|
120
|
-
> 1. 只 import 主入口、没装 `echarts` / `monaco-editor` 时,Vite 会打印
|
|
121
|
-
> `"xxx" is not exported by "__vite-optional-peer-dep:monaco-editor"`。
|
|
122
|
+
> 1. 只 import 主入口、没装 `echarts` / `monaco-editor` 时,Vite 会打印
|
|
123
|
+
> `"xxx" is not exported by "__vite-optional-peer-dep:monaco-editor"`。
|
|
122
124
|
> 这是 Vite 对 optional peer 的内置 stub 机制:**警告不阻断构建**,装好对应依赖后警告消失。
|
|
123
|
-
> 2. `@zl-ui-kit/icons` 与 `@zl-ui-kit/utils` 在 **Node 原生 ESM** 下直接 import 会报错
|
|
124
|
-
> (前者是 JSON 缺 import attribute,后者依赖 CJS 包 `file-saver` 的具名导出)。
|
|
125
|
+
> 2. `@zl-ui-kit/icons` 与 `@zl-ui-kit/utils` 在 **Node 原生 ESM** 下直接 import 会报错
|
|
126
|
+
> (前者是 JSON 缺 import attribute,后者依赖 CJS 包 `file-saver` 的具名导出)。
|
|
125
127
|
> Vite / webpack 打包的 Vue 项目不受影响;做 Node SSR 时把这两个包加进 `ssr.noExternal`。
|
|
126
128
|
|
|
127
129
|
---
|
|
@@ -161,9 +163,9 @@ playground 的界面按 **Element Plus 官网的信息架构**组织(顶栏 +
|
|
|
161
163
|
| 组件页 | `/#/component/ZlTable`,依次是「基础用法」实时示例 → 用法示例 / 插槽用法代码块 → props/事件/插槽/暴露方法表(props 与插槽表各带一列「示例」) |
|
|
162
164
|
| 接口手册 | `/#/manual`,跨组件检索(按 props 名 / 事件名反查组件),支持 `?name=ZlTable` 直接定位 |
|
|
163
165
|
|
|
164
|
-
> 组件页的示例来自 `apps/playground/src/pages/gallery-demos.ts`(与冒烟测试同一份渲染函数),
|
|
165
|
-
> 接口表来自 `pnpm docs:api` 产物 —— 与本文件第 14 章同源:改完组件源码记得重跑,否则 `pnpm check` 会报产物过期。
|
|
166
|
-
> 两处的 **用法示例 / 插槽用法** 代码块也是同一份字符串,页面里可一键复制;
|
|
166
|
+
> 组件页的示例来自 `apps/playground/src/pages/gallery-demos.ts`(与冒烟测试同一份渲染函数),
|
|
167
|
+
> 接口表来自 `pnpm docs:api` 产物 —— 与本文件第 14 章同源:改完组件源码记得重跑,否则 `pnpm check` 会报产物过期。
|
|
168
|
+
> 两处的 **用法示例 / 插槽用法** 代码块也是同一份字符串,页面里可一键复制;
|
|
167
169
|
> 每个 prop / 插槽的「示例」列同样是同一份字符串(可直接粘贴的属性写法 / `<template #name>` 片段)。
|
|
168
170
|
|
|
169
171
|
> 注意:`@zl-ui-kit/theme/light`、`@zl-ui-kit/theme/themes.css` 等 CSS 子路径不走别名,读取 `src/generated/` 生成物——改主题 token 后需先 `pnpm --filter @zl-ui-kit/theme gen`。
|
|
@@ -249,7 +251,7 @@ setTheme('dark') // 切换主题(light/dark/red-light/red-dark/blue)
|
|
|
249
251
|
|
|
250
252
|
### 4.1 必须先注册图标集(否则一个图标都不显示)
|
|
251
253
|
|
|
252
|
-
`ZlIcon` 走 `@iconify/vue/offline`,**库不会自动把 444 个图标塞进打包结果**(否则不用图标的宿主也会白扛 ~150KB)。
|
|
254
|
+
`ZlIcon` 走 `@iconify/vue/offline`,**库不会自动把 444 个图标塞进打包结果**(否则不用图标的宿主也会白扛 ~150KB)。
|
|
253
255
|
消费方需要在应用启动时把内置图标集注册进 offline 集合,只需一次:
|
|
254
256
|
|
|
255
257
|
```ts
|
|
@@ -260,11 +262,11 @@ import { icons } from '@zl-ui-kit/icons'
|
|
|
260
262
|
presetIconifyIcon(icons)
|
|
261
263
|
```
|
|
262
264
|
|
|
263
|
-
> **漏掉这一步的表现**:`ZlIcon` 只渲染出一个空的 `<div class="zl-icon">`,不报错、不告警,
|
|
264
|
-
> 组件内部(查询条的「查询/重置/展开」按钮、表单 label 后的问号、空态插画等)的图标同样全部空白——
|
|
265
|
+
> **漏掉这一步的表现**:`ZlIcon` 只渲染出一个空的 `<div class="zl-icon">`,不报错、不告警,
|
|
266
|
+
> 组件内部(查询条的「查询/重置/展开」按钮、表单 label 后的问号、空态插画等)的图标同样全部空白——
|
|
265
267
|
> 排查时容易误判成图标名写错或样式问题。
|
|
266
268
|
>
|
|
267
|
-
> `@zl-ui-kit/icons` 需要作为**直接依赖**安装(`pnpm add @zl-ui-kit/icons`),不要依赖它被 `components` 间接带进 `node_modules`:
|
|
269
|
+
> `@zl-ui-kit/icons` 需要作为**直接依赖**安装(`pnpm add @zl-ui-kit/icons`),不要依赖它被 `components` 间接带进 `node_modules`:
|
|
268
270
|
> 幽灵依赖在提升规则变化或切换包管理器后会直接解析失败。
|
|
269
271
|
|
|
270
272
|
`presetIconifyIcon(...collections)` 接受多个集合,可叠加自建图标:`presetIconifyIcon(icons, myIcons)`。
|
|
@@ -312,7 +314,6 @@ presetIconifyIcon(icons)
|
|
|
312
314
|
```vue
|
|
313
315
|
<ZlEmpty description="暂无数据" />
|
|
314
316
|
<ZlEmpty :image="customImg" />
|
|
315
|
-
<!-- 传入自定义图,缺省为内置轻量 SVG 线稿 -->
|
|
316
317
|
```
|
|
317
318
|
|
|
318
319
|
### ZlDictTag — 字典标签
|
|
@@ -320,7 +321,6 @@ presetIconifyIcon(icons)
|
|
|
320
321
|
经 `useDict(dictKey)` 解析独立字典 store(`useDictStore`,Vue3 状态管理缓存,不依赖全局数据)。**支持三种数据注入方式**(详见第 12.1.3 节与第 6.3 节 ⑤):
|
|
321
322
|
|
|
322
323
|
```vue
|
|
323
|
-
<!-- 1. 组件级直传(最轻量,无需任何全局配置即可翻译) -->
|
|
324
324
|
<ZlDictTag
|
|
325
325
|
dict-key="resourceType"
|
|
326
326
|
:value="row.type"
|
|
@@ -330,16 +330,45 @@ presetIconifyIcon(icons)
|
|
|
330
330
|
]"
|
|
331
331
|
/>
|
|
332
332
|
|
|
333
|
-
<!-- 2. 全局/局部数据源(应用入口注册一次,全项目共享) -->
|
|
334
333
|
<ZlDictTag dict-key="resourceType" :value="row.type" />
|
|
335
334
|
<ZlDictTag dict-key="resourceType" :value="row.type" simple />
|
|
336
335
|
```
|
|
337
336
|
|
|
338
337
|
详见第 6.3 节 ⑤。
|
|
339
338
|
|
|
339
|
+
### ZlCard / ZlPagination — 卡片与分页的视觉约定
|
|
340
|
+
|
|
341
|
+
`ZlCard` 的外观对齐设计稿(`DnCard`):圆角 6px、轻阴影、右上角一张很淡的蓝紫渐变装饰底图。
|
|
342
|
+
底图**随包内联**(构建期转 base64,不额外产出图片文件),消费方无需配 `assetsInclude` 或图片服务。
|
|
343
|
+
|
|
344
|
+
```vue
|
|
345
|
+
<ZlCard style="max-width: 280px">
|
|
346
|
+
<template #icon><StrategyIcon :icon="row.icon" size="40px" /></template>
|
|
347
|
+
<template #title><ZlAutoTooltip>{{ row.name }}</ZlAutoTooltip></template>
|
|
348
|
+
<template #title-append><ZlSwitch v-model="row.status" /></template>
|
|
349
|
+
<template #footer>策略数:{{ row.num }}</template>
|
|
350
|
+
</ZlCard>
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
| CSS 变量 | 默认值 | 说明 |
|
|
354
|
+
| ------------------------- | ------------ | --------------------------------------------------- |
|
|
355
|
+
| `--zl-card-bg-image` | 内置渐变底图 | 右上角装饰图;设为 `none` 即关闭 |
|
|
356
|
+
| `--zl-pagination-justify` | `flex-end` | 分页器水平对齐(`flex-start` 靠左 / `center` 居中) |
|
|
357
|
+
|
|
358
|
+
其余颜色、圆角、阴影统一走 token(`--zl-bg-1` / `--zl-shadow` / `--zl-radius-large` / `--zl-text-1` / `--zl-border-2`),
|
|
359
|
+
随主题切换。深色主题下装饰底图会自动关闭——浅色渐变压在深底上会发白。
|
|
360
|
+
|
|
361
|
+
`ZlPagination` **默认靠右对齐**(EP 的 `.el-pagination` 是 flex 容器但没设 `justify-content`,默认会挤在左侧)。
|
|
362
|
+
单处分页需要居中/靠左时用 `align`,整站统一时覆盖 `--zl-pagination-justify` 即可:
|
|
363
|
+
|
|
364
|
+
```vue
|
|
365
|
+
<ZlPagination :total="total" align="center" />
|
|
366
|
+
<ZlPagination :total="total" :page-num="1" :page-size="30" />
|
|
367
|
+
```
|
|
368
|
+
|
|
340
369
|
### 其余
|
|
341
370
|
|
|
342
|
-
`ZlText`(文本省略)、`ZlAutoTooltip`(超长省略 + tooltip)、`ZlDescription`(描述列表)、`ZlSection`(分区容器)、`
|
|
371
|
+
`ZlText`(文本省略)、`ZlAutoTooltip`(超长省略 + tooltip)、`ZlDescription`(描述列表)、`ZlSection`(分区容器)、`ZlAvatar`(+Group)、`ZlAppSlogan`(品牌标语,字体走 `--zl-slogan-font-family`)、`ZlIconLabel`/`ZlIconHover`(图标 + 文字组合)。
|
|
343
372
|
|
|
344
373
|
---
|
|
345
374
|
|
|
@@ -360,18 +389,18 @@ const { loading, data, error, status, run, runAsync, refresh, refreshAsync, canc
|
|
|
360
389
|
)
|
|
361
390
|
```
|
|
362
391
|
|
|
363
|
-
| 返回/选项 | 说明
|
|
364
|
-
| ---------------------------------------------- |
|
|
365
|
-
| `loading` / `data` / `error` / `status` | 响应式状态(`status`: `''`/`pending`/`finished`/`error`)
|
|
366
|
-
| `run(...args)` | 同步触发,错误被吞(除非传 `onError`)
|
|
367
|
-
| `runAsync(...args)` | 返回 Promise,可 await 捕获
|
|
368
|
-
| `refresh()` / `refreshAsync()` | 用上次参数重跑
|
|
369
|
-
| `cancel()` | 取消进行中请求(结果丢弃)
|
|
370
|
-
| `mutate(data \| prev => R)` | 本地立即改 `data`,不触网
|
|
371
|
-
| `options.manual` | `true`
|
|
372
|
-
| `options.defaultParams` / `initialData` | 首参 / 初始占位
|
|
373
|
-
| `options.onBefore/onSuccess/onError/onFinally` | 生命周期回调
|
|
374
|
-
| `options.loadingDelay` / `refreshDeps` | 延迟 loading / 依赖变更刷新
|
|
392
|
+
| 返回/选项 | 说明 |
|
|
393
|
+
| ---------------------------------------------- | ----------------------------------------------------------- |
|
|
394
|
+
| `loading` / `data` / `error` / `status` | 响应式状态(`status`: `''`/`pending`/`finished`/`error`) |
|
|
395
|
+
| `run(...args)` | 同步触发,错误被吞(除非传 `onError`) |
|
|
396
|
+
| `runAsync(...args)` | 返回 Promise,可 await 捕获 |
|
|
397
|
+
| `refresh()` / `refreshAsync()` | 用上次参数重跑 |
|
|
398
|
+
| `cancel()` | 取消进行中请求(结果丢弃) |
|
|
399
|
+
| `mutate(data \| prev => R)` | 本地立即改 `data`,不触网 |
|
|
400
|
+
| `options.manual` | `true` 时不自动执行(只影响挂载首跑,不影响 `refreshDeps`) |
|
|
401
|
+
| `options.defaultParams` / `initialData` | 首参 / 初始占位 |
|
|
402
|
+
| `options.onBefore/onSuccess/onError/onFinally` | 生命周期回调 |
|
|
403
|
+
| `options.loadingDelay` / `refreshDeps` | 延迟 loading / 依赖变更刷新 |
|
|
375
404
|
|
|
376
405
|
#### `useDataRequest(service, { dataKey = 'data' })` —— 自动解包信封
|
|
377
406
|
|
|
@@ -435,6 +464,49 @@ const { data } = useDataRequest(getChartDataApi, { dataKey: 'data' })
|
|
|
435
464
|
|
|
436
465
|
内部组合 `usePageableRequest + ZlSearch + ZlPagination + ZlEmpty`。
|
|
437
466
|
|
|
467
|
+
**条件查询 / 页签切换怎么重查**:把变化源放进 `request.options.refreshDeps`(ref / getter 数组),
|
|
468
|
+
依赖变化会自动重查**并回到第 1 页**——卡片页的请求是 `manual` 的(首屏由 `ZlSearch` 触发),
|
|
469
|
+
组件内部已把 `refreshDeps` 接到自己的 `search()` 上,不需要自己写 `watch`:
|
|
470
|
+
|
|
471
|
+
```vue
|
|
472
|
+
<script setup lang="ts">
|
|
473
|
+
const activeTab = ref('all')
|
|
474
|
+
const cardPageRef = ref<InstanceType<typeof ZlCardPage>>()
|
|
475
|
+
|
|
476
|
+
const pageRequest = {
|
|
477
|
+
service: getStrategyPage,
|
|
478
|
+
options: {
|
|
479
|
+
// 页签/分类这类「筛选条件」变化 → 自动重查并回第 1 页
|
|
480
|
+
refreshDeps: [() => activeTab.value],
|
|
481
|
+
},
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/** 行内改状态后重查:走 refresh() 沿用当前页与查询条件 */
|
|
485
|
+
const onStatusChange = () => cardPageRef.value?.refresh()
|
|
486
|
+
</script>
|
|
487
|
+
|
|
488
|
+
<template>
|
|
489
|
+
<ZlCardPage
|
|
490
|
+
ref="cardPageRef"
|
|
491
|
+
:request="pageRequest"
|
|
492
|
+
:query-items="queryItems"
|
|
493
|
+
:pagination="{ pageSize: 30 }"
|
|
494
|
+
>
|
|
495
|
+
<!-- `search-` 前缀插槽透传给 ZlSearch;search-actions 在表单网格之外,适合放 tabs -->
|
|
496
|
+
<template #search-actions>
|
|
497
|
+
<ZlTabs v-model="activeTab" :tabs="tabItems" :dark-nav="false" />
|
|
498
|
+
</template>
|
|
499
|
+
<template #default="{ data }">
|
|
500
|
+
<ZlCard>{{ data.name }}</ZlCard>
|
|
501
|
+
</template>
|
|
502
|
+
</ZlCardPage>
|
|
503
|
+
</template>
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
> `service` 内部按当前筛选条件(含页签值)组装入参即可,`refreshDeps` 只负责「什么时候查」。
|
|
507
|
+
> 两种刷新语义别混用:`refreshDeps` 变化**一律回第 1 页**(换条件后停在旧页码没有意义);
|
|
508
|
+
> 需要「原地重查、页码不变」(行内改状态、删除后刷新)用 `ref.refresh()` / `ref.search.search(params)`。
|
|
509
|
+
|
|
438
510
|
#### ③ `ZlTable` + `ZlPagination` —— 自行 `usePaginationRequest`
|
|
439
511
|
|
|
440
512
|
```ts
|
|
@@ -664,6 +736,9 @@ const items: FormItem[] = [
|
|
|
664
736
|
### ZlTabs / ZlDynamicComponent / ZlGrid
|
|
665
737
|
|
|
666
738
|
- `ZlTabs`:`el-tabs` 封装,schema `{ key, title, lazy }`,extra 经外层绝对定位承载。
|
|
739
|
+
页签内容用具名插槽 `#<tab.key>`(如 `tabs=[{ key: 'all' }]` → `<template #all>`),
|
|
740
|
+
插槽内容接入父组件的渲染上下文,数据变化会正常更新;`v-model` 双向绑定当前页签 key。常用场景
|
|
741
|
+
(分页卡片的分类筛选)见 §6.3 ②。
|
|
667
742
|
- `ZlDynamicComponent`:schema→VNode 渲染引擎,默认 `el-input`。
|
|
668
743
|
- `ZlGrid`(+`ZlGridItem`):自绘栅格,label 自适应/跨列/省略提示/字典。
|
|
669
744
|
|
|
@@ -841,7 +916,10 @@ import { useRequest, useGlobalData, useDict /* … */ } from '@zl-ui-kit/composa
|
|
|
841
916
|
- **内置插件自动装载**,通过 `options` 开启(无需 import):
|
|
842
917
|
- **loading**:`loadingDelay`(ms,延迟显示 loading,避免闪烁) / `loadingKeep`(ms,最短保持时间)
|
|
843
918
|
- **ready**:`ready: Ref<boolean>`,为假时拦截请求,为真后自动 `run`(适合依赖前置条件就绪后再请求)
|
|
844
|
-
|
|
919
|
+
| | |
|
|
920
|
+
| --- | --- |
|
|
921
|
+
- **refreshDeps**:`refreshDeps: WatchSource | WatchSource[]`,依赖变化自动 `refresh`;可用 `refreshDepsAction` 自定义动作。
|
|
922
|
+
与 `manual` 不冲突——`manual: true` 只表示「挂载时不自动发请求」,依赖变化照样会重查(唯一例外是从未 `run` 过的请求,没有可复用参数,会跳过)
|
|
845
923
|
- **download**:`outputFile: MaybeRefOrGetter<string>`,`service` 返回 `Blob`(非 JSON)时自动下载保存
|
|
846
924
|
- **自定义插件**:`defineUseRequestPlugin(plugin)` 返回 `PluginImplementType`,经 `useRequest(service, options, [myPlugin])` 第三参注入,可实现 `onBefore / onRequest / onSuccess / onError / onFinally / onCancel / onMutate` 钩子。
|
|
847
925
|
- **全局默认项**:
|
|
@@ -890,8 +968,13 @@ g.resetUser() // 登出:清 user / roles / permissions / token
|
|
|
890
968
|
|
|
891
969
|
#### 12.1.3 字典与国际化
|
|
892
970
|
|
|
971
|
+
| | |
|
|
972
|
+
| --- | --- |
|
|
973
|
+
|
|
893
974
|
- `useDictStore`(全局字典 store,基于 Vue3 `createGlobalState` 单例):`dictStore`(缓存 `Record<key, DictItem[]>`)、`loadingKeys`、`setDictSource(source|null)`、`getDictSource()`、`ensureDict(key, localSource?)`。同一 key 仅在缓存未命中且未在加载时触发一次加载,结果缓存复用。
|
|
894
975
|
- `useDict(key, options?)` → `ComputedRef<DictItem[]>`(附带 `.label: Record<value,label>`):读 `useDictStore` 并解析。数据解析优先级:组件级 `options.data` → 局部 `useDictProvider({ source })` → 全局 `setDictSource(source)`。`DictItem = { label, value, icon?, type? }`(亦可用 `type DictItem` 导入)。
|
|
976
|
+
| | | |
|
|
977
|
+
| --- | --- | --- |
|
|
895
978
|
- `setDictSource(source | null)`:全局注册字典数据源(应用入口调用一次)。`source` 为静态表 `Record<string, DictItem[]>` 或函数 `(key) => DictItem[] | Promise<DictItem[]>`;传 `null` 清空。`getDictSource()` 可读取当前值。
|
|
896
979
|
- `useDictProvider(source)`:子树根提供局部字典数据源(覆盖全局)。
|
|
897
980
|
- `useLocale(options?, loader?)` → `{ i18n, locale, isI18nKeyVisible }`:创建与全局语言联动的 vue-i18n 实例;`loader(locale)` 按需返回 `{ localeMessages, elLocaleMessages }`(业务包 + Element Plus locale)。`elLocaleMessages` 写入全局数据后,**必须**由 `ZlI18nProvider` 经 `<el-config-provider>` 挂载到 Element Plus 才生效(分页 / 日期选择器等内置组件才本地化)。详见第 13 章。
|
|
@@ -984,6 +1067,8 @@ api.get('/resources', { params: { pageNum: 1, pageSize: 10 } })
|
|
|
984
1067
|
- `fileSave`(re-export `file-saver` 的 `saveAs`)。
|
|
985
1068
|
- `joinFilePrefix(path, prefix = '/_file')`:拼接文件服务前缀路径。
|
|
986
1069
|
- `downloadFileByUrl(url, prefix?)`:创建临时 `<a>` 触发浏览器下载。
|
|
1070
|
+
| | | | | |
|
|
1071
|
+
| --- | --- | --- | --- | --- |
|
|
987
1072
|
- `fileUrlPreviewType(path)` → `'image' | 'pdf' | 'word' | 'ppt' | 'excel'`(按扩展名判断)。
|
|
988
1073
|
- `formatFilesize(size, { precision = 2, units })`:文件大小格式化(B/KB/MB/GB)。
|
|
989
1074
|
|
|
@@ -1188,7 +1273,7 @@ const { i18n } = useLocale({ messages })
|
|
|
1188
1273
|
| `ZlIconLabel` | 主入口 | 1 | 1 | 1 | 0 |
|
|
1189
1274
|
| `ZlCornerTag` | 主入口 | 3 | 0 | 1 | 0 |
|
|
1190
1275
|
| `ZlLayoutSwitch` | 主入口 | 2 | 1 | 0 | 0 |
|
|
1191
|
-
| `ZlPagination` | 主入口 |
|
|
1276
|
+
| `ZlPagination` | 主入口 | 4 | 3 | 0 | 0 |
|
|
1192
1277
|
| `ZlPermission` | 主入口 | 1 | 0 | 1 | 0 |
|
|
1193
1278
|
| `ZlPopconfirm` | 主入口 | 4 | 2 | 3 | 0 |
|
|
1194
1279
|
| `ZlRadioTag` | 主入口 | 3 | 1 | 1 | 0 |
|
|
@@ -1212,7 +1297,7 @@ const { i18n } = useLocale({ messages })
|
|
|
1212
1297
|
| `ZlFilePreview` | 子入口 file-preview | 1 | 0 | 0 | 0 |
|
|
1213
1298
|
| `ZlFileViewer` | 子入口 file-preview | 1 | 0 | 0 | 0 |
|
|
1214
1299
|
|
|
1215
|
-
> 说明列为 `—` 表示该属性在源码里没写 `/** */` 注释(当前 133/
|
|
1300
|
+
> 说明列为 `—` 表示该属性在源码里没写 `/** */` 注释(当前 133/190 个);补完注释重跑 `pnpm docs:api` 即可同步。
|
|
1216
1301
|
|
|
1217
1302
|
### 14.1 主入口组件(`@zl-ui-kit/components`)
|
|
1218
1303
|
|
|
@@ -1604,6 +1689,8 @@ import { ZlCard } from '@zl-ui-kit/components'
|
|
|
1604
1689
|
| `footer` | — | `<template #footer>…</template>` | — |
|
|
1605
1690
|
| `extra` | — | `<template #extra>…</template>` | — |
|
|
1606
1691
|
|
|
1692
|
+
**完整示例**:见 §5 通用展示组件 › ZlCard / ZlPagination — 卡片与分页的视觉约定
|
|
1693
|
+
|
|
1607
1694
|
#### `ZlCardPage`
|
|
1608
1695
|
|
|
1609
1696
|
<sub>入口 `@zl-ui-kit/components` · 源码 `packages/components/src/components/ZlCardPage/index.vue`</sub>
|
|
@@ -2586,9 +2673,9 @@ import { ZlLayoutSwitch } from '@zl-ui-kit/components'
|
|
|
2586
2673
|
|
|
2587
2674
|
<sub>入口 `@zl-ui-kit/components` · 源码 `packages/components/src/components/ZlPagination/index.vue`</sub>
|
|
2588
2675
|
|
|
2589
|
-
|
|
2676
|
+
**简介**:分页器(el-pagination 封装):默认靠右对齐,分页入参(pageNum/pageSize/showTotal…) 经 `$attrs` 透传,`align` 控制水平对齐(left/center/right)
|
|
2590
2677
|
|
|
2591
|
-
**接口概览**:
|
|
2678
|
+
**接口概览**:4 props · 3 事件
|
|
2592
2679
|
|
|
2593
2680
|
**用法示例**
|
|
2594
2681
|
|
|
@@ -2606,6 +2693,7 @@ import { ZlPagination } from '@zl-ui-kit/components'
|
|
|
2606
2693
|
|
|
2607
2694
|
| 属性 | 类型 | 默认值 | 必填 | 示例 | 说明 |
|
|
2608
2695
|
| ------------- | ------------ | ------ | ---- | ----------------------------- | ---------------------------------- |
|
|
2696
|
+
| `align` | `(未声明)` | — | 否 | `:align="align"` | 运行时从 `$attrs` 读取,无类型约束 |
|
|
2609
2697
|
| `pageNum` | `(未声明)` | — | 否 | `:page-num="pageNum"` | 运行时从 `$attrs` 读取,无类型约束 |
|
|
2610
2698
|
| `pageSize` | `(未声明)` | — | 否 | `:page-size="pageSize"` | 运行时从 `$attrs` 读取,无类型约束 |
|
|
2611
2699
|
| `currentPage` | `(未声明)` | — | 否 | `:current-page="currentPage"` | 运行时从 `$attrs` 读取,无类型约束 |
|
|
@@ -2620,7 +2708,7 @@ import { ZlPagination } from '@zl-ui-kit/components'
|
|
|
2620
2708
|
| `page-change` | `number` | 仅页码变化(区别于 pageSize 变化) |
|
|
2621
2709
|
| `page-size-change` | `number` | 仅每页条数变化 |
|
|
2622
2710
|
|
|
2623
|
-
**完整示例**:见 §
|
|
2711
|
+
**完整示例**:见 §5 通用展示组件 › ZlCard / ZlPagination — 卡片与分页的视觉约定
|
|
2624
2712
|
|
|
2625
2713
|
#### `ZlPermission`
|
|
2626
2714
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.zl-card{position:relative;border-radius:var(--zl-radius-large, 6px);background-color:var(--zl-bg-1, #fff);box-shadow:0 2px 5px 0 var(--zl-shadow, rgba(36, 46, 67, .1))}.zl-card__header{display:grid;grid-template-columns:44px 1fr;padding:16px 16px 12px;align-items:center;gap:2px 12px}.zl-card__icon{grid-row:1/span 2;aspect-ratio:1/1;overflow:hidden;display:flex;align-items:center;justify-content:center;border-radius:6px}.zl-card__icon>img{width:40px;height:40px}.zl-card__icon>.zl-icon{font-size:32px}.zl-card__title{display:flex;align-items:center;gap:12px;overflow:hidden}.zl-card__title-text{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--zl-text-1, #242e43);font-size:14px;font-weight:600;line-height:22px}.zl-card__title-append{flex:1 0 auto}.zl-card__subtitle{color:var(--zl-text-3, #79879c);font-size:12px;line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zl-card__body{padding:0 16px 12px}.zl-card__footer{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;border-top:1px solid var(--zl-border-2, #e3e9ef)}.zl-card-hoverable{border:1px solid var(--zl-border-2, #e3e9ef)}.zl-card-hoverable:hover{border-color:var(--zl-primary-6, var(--el-color-primary, #0066ff));box-shadow:0 4px 10px #00223e14}
|
|
1
|
+
@charset "UTF-8";.zl-card{position:relative;border-radius:var(--zl-radius-large, 6px);--zl-card-bg-image: url(data:image/png;base64,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);background-color:var(--zl-bg-1, #fff);background-image:var(--zl-card-bg-image);background-position:top right;background-repeat:no-repeat;box-shadow:0 2px 5px 0 var(--zl-shadow, rgba(36, 46, 67, .1));transition:border-color .2s ease,box-shadow .2s ease}.zl-card__header{display:grid;grid-template-columns:44px 1fr;padding:16px 16px 12px;align-items:center;gap:2px 12px}.zl-card__icon{grid-row:1/span 2;aspect-ratio:1/1;overflow:hidden;display:flex;align-items:center;justify-content:center;border-radius:6px}.zl-card__icon>img{width:40px;height:40px}.zl-card__icon>.zl-icon{font-size:32px}.zl-card__title{display:flex;align-items:center;gap:12px;overflow:hidden}.zl-card__title-text{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--zl-text-1, #242e43);font-size:14px;font-weight:600;line-height:22px}.zl-card__title-append{flex:1 0 auto}.zl-card__subtitle{color:var(--zl-text-3, #79879c);font-size:12px;line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zl-card__body{padding:0 16px 12px}.zl-card__footer{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;border-top:1px solid var(--zl-border-2, #e3e9ef)}.zl-card-hoverable{border:1px solid var(--zl-border-2, #e3e9ef)}.zl-card-hoverable:hover{border-color:var(--zl-primary-6, var(--el-color-primary, #0066ff));box-shadow:0 4px 10px #00223e14}[data-theme*=dark] .zl-card{--zl-card-bg-image: none}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent as Z, useSlots as
|
|
1
|
+
import { defineComponent as Z, useSlots as j, ref as x, computed as l, watch as K, resolveDirective as M, withDirectives as V, openBlock as u, createElementBlock as q, normalizeStyle as F, createBlock as p, createSlots as L, withCtx as P, renderSlot as h, renderList as S, normalizeProps as G, guardReactiveProps as H, createCommentVNode as k, createElementVNode as z, Fragment as J, mergeProps as $, unref as g } from "vue";
|
|
2
2
|
import { usePageableRequest as Q } from "@zl-ui-kit/composables";
|
|
3
3
|
import { isArray as w } from "@zl-ui-kit/utils";
|
|
4
4
|
import T from "../ZlEmpty/index.vue.mjs";
|
|
@@ -6,7 +6,7 @@ import U from "../ZlPagination/index.vue.mjs";
|
|
|
6
6
|
import X from "../ZlSearch/index.vue.mjs";
|
|
7
7
|
import '../ZlSearch/index.css';/* empty css */
|
|
8
8
|
import { usePagination as Y } from "../ZlPagination/usePagination.mjs";
|
|
9
|
-
const ee = { class: "zl-card-page__content" }, te = { class: "zl-card-page__list" },
|
|
9
|
+
const ee = { class: "zl-card-page__content" }, te = { class: "zl-card-page__list" }, D = "search-", ce = /* @__PURE__ */ Z({
|
|
10
10
|
name: "ZlCardPage",
|
|
11
11
|
__name: "index",
|
|
12
12
|
props: {
|
|
@@ -18,106 +18,118 @@ const ee = { class: "zl-card-page__content" }, te = { class: "zl-card-page__list
|
|
|
18
18
|
cardMinWidth: {}
|
|
19
19
|
},
|
|
20
20
|
emits: ["search-reset"],
|
|
21
|
-
setup(s, { expose:
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
setup(s, { expose: B, emit: C }) {
|
|
22
|
+
const r = s, R = C, E = j(), c = x(null), v = l(() => {
|
|
23
|
+
const t = { manual: !0, initialData: [] };
|
|
24
|
+
if (typeof r.request == "function")
|
|
25
|
+
return { service: r.request, options: t };
|
|
26
|
+
const {
|
|
27
|
+
refreshDeps: e,
|
|
28
|
+
refreshDepsAction: o,
|
|
29
|
+
...a
|
|
30
|
+
} = r.request.options ?? {};
|
|
31
|
+
return {
|
|
32
|
+
...r.request,
|
|
33
|
+
options: {
|
|
34
|
+
...t,
|
|
35
|
+
...a,
|
|
36
|
+
manual: !0,
|
|
37
|
+
...e ? { refreshDeps: e, refreshDepsAction: o ?? (() => i()) } : {}
|
|
38
|
+
}
|
|
27
39
|
};
|
|
28
40
|
}), {
|
|
29
|
-
loading:
|
|
41
|
+
loading: I,
|
|
30
42
|
data: n,
|
|
31
|
-
run:
|
|
32
|
-
params:
|
|
33
|
-
refresh:
|
|
34
|
-
} = Q(v.value.service, v.value.options),
|
|
43
|
+
run: N,
|
|
44
|
+
params: _,
|
|
45
|
+
refresh: b
|
|
46
|
+
} = Q(v.value.service, v.value.options), A = l(() => _.value?.[0]), O = l(() => {
|
|
35
47
|
if (w(n.value))
|
|
36
|
-
return
|
|
48
|
+
return r.pagination && { total: n.value.length, ...r.pagination };
|
|
37
49
|
{
|
|
38
|
-
const { pageNum:
|
|
39
|
-
return { pageNum:
|
|
50
|
+
const { pageNum: t, pageSize: e, total: o = 0 } = n.value;
|
|
51
|
+
return { pageNum: t, pageSize: e, total: o };
|
|
40
52
|
}
|
|
41
|
-
}),
|
|
53
|
+
}), m = Y(() => O.value ?? !1), y = l(
|
|
42
54
|
() => w(n.value) ? n.value : n.value?.rows ?? []
|
|
43
|
-
), W =
|
|
44
|
-
const
|
|
45
|
-
return Object.keys(
|
|
46
|
-
|
|
47
|
-
}),
|
|
55
|
+
), W = l(() => {
|
|
56
|
+
const t = [];
|
|
57
|
+
return Object.keys(E).forEach((e) => {
|
|
58
|
+
e.startsWith(D) && e !== "search-actions" && t.push(e.slice(D.length));
|
|
59
|
+
}), t;
|
|
48
60
|
});
|
|
49
|
-
let
|
|
50
|
-
function
|
|
61
|
+
let d;
|
|
62
|
+
function i(t, e = {
|
|
51
63
|
pageNum: 1,
|
|
52
|
-
pageSize:
|
|
64
|
+
pageSize: m.value !== !1 ? m.value.pageSize : 30
|
|
53
65
|
}) {
|
|
54
|
-
|
|
55
|
-
...
|
|
56
|
-
...
|
|
57
|
-
...
|
|
58
|
-
},
|
|
66
|
+
d = {
|
|
67
|
+
...d,
|
|
68
|
+
...t,
|
|
69
|
+
...e
|
|
70
|
+
}, N(d);
|
|
59
71
|
}
|
|
60
|
-
return
|
|
61
|
-
() =>
|
|
62
|
-
(
|
|
63
|
-
|
|
72
|
+
return K(
|
|
73
|
+
() => r.immediate,
|
|
74
|
+
(t) => {
|
|
75
|
+
t && !r.queryItems.length && i();
|
|
64
76
|
},
|
|
65
77
|
{ immediate: !0, once: !0 }
|
|
66
|
-
),
|
|
67
|
-
refresh:
|
|
68
|
-
params:
|
|
78
|
+
), B({
|
|
79
|
+
refresh: b,
|
|
80
|
+
params: A,
|
|
69
81
|
search: new Proxy(
|
|
70
82
|
{},
|
|
71
83
|
{
|
|
72
|
-
get(
|
|
73
|
-
return !
|
|
84
|
+
get(t, e) {
|
|
85
|
+
return !c.value && e === "search" ? i : c.value?.[e];
|
|
74
86
|
},
|
|
75
|
-
has(
|
|
76
|
-
return
|
|
87
|
+
has(t, e) {
|
|
88
|
+
return e in (c.value ?? {});
|
|
77
89
|
}
|
|
78
90
|
}
|
|
79
91
|
)
|
|
80
|
-
}), (
|
|
81
|
-
const
|
|
82
|
-
return
|
|
92
|
+
}), (t, e) => {
|
|
93
|
+
const o = M("loading");
|
|
94
|
+
return V((u(), q("div", {
|
|
83
95
|
class: "zl-card-page",
|
|
84
96
|
style: F({ "--card-min-width": s.cardMinWidth })
|
|
85
97
|
}, [
|
|
86
|
-
s.queryItems.length ||
|
|
98
|
+
s.queryItems.length || t.$slots["search-actions"] ? (u(), p(X, {
|
|
87
99
|
key: 0,
|
|
88
100
|
ref_key: "searchRef",
|
|
89
|
-
ref:
|
|
101
|
+
ref: c,
|
|
90
102
|
items: s.queryItems,
|
|
91
103
|
immediate: s.immediate,
|
|
92
|
-
onSearch:
|
|
93
|
-
onReset:
|
|
104
|
+
onSearch: i,
|
|
105
|
+
onReset: e[0] || (e[0] = (a) => R("search-reset"))
|
|
94
106
|
}, L({ _: 2 }, [
|
|
95
|
-
|
|
107
|
+
t.$slots["search-actions"] ? {
|
|
96
108
|
name: "actions",
|
|
97
109
|
fn: P(() => [
|
|
98
|
-
|
|
110
|
+
h(t.$slots, "search-actions")
|
|
99
111
|
]),
|
|
100
112
|
key: "0"
|
|
101
113
|
} : void 0,
|
|
102
|
-
S(W.value, (
|
|
103
|
-
name:
|
|
114
|
+
S(W.value, (a) => ({
|
|
115
|
+
name: a,
|
|
104
116
|
fn: P((f) => [
|
|
105
|
-
|
|
117
|
+
h(t.$slots, `search-${a}`, G(H(f)))
|
|
106
118
|
])
|
|
107
119
|
}))
|
|
108
120
|
]), 1032, ["items", "immediate"])) : k("", !0),
|
|
109
121
|
z("div", ee, [
|
|
110
122
|
z("div", te, [
|
|
111
|
-
y.value.length ? (
|
|
112
|
-
key:
|
|
113
|
-
}, { ref_for: !0 }, { data:
|
|
123
|
+
y.value.length ? (u(!0), q(J, { key: 0 }, S(y.value, (a, f) => h(t.$slots, "default", $({
|
|
124
|
+
key: a[s.itemKey] || f
|
|
125
|
+
}, { ref_for: !0 }, { data: a }))), 128)) : (u(), p(T, { key: 1 }))
|
|
114
126
|
])
|
|
115
127
|
]),
|
|
116
|
-
s.pagination &&
|
|
117
|
-
onChange:
|
|
128
|
+
s.pagination && g(m) !== !1 ? (u(), p(U, $({ key: 1 }, g(m), {
|
|
129
|
+
onChange: e[1] || (e[1] = (a) => i(void 0, a))
|
|
118
130
|
}), null, 16)) : k("", !0)
|
|
119
131
|
], 4)), [
|
|
120
|
-
[
|
|
132
|
+
[o, g(I)]
|
|
121
133
|
]);
|
|
122
134
|
};
|
|
123
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
@charset "UTF-8";.zl-pagination[data-v-5eee61b9]{padding:6px 16px;background-color:var(--zl-fill-1, #f9fbfd);justify-content:var(--zl-pagination-justify, flex-end)}.zl-pagination--left[data-v-5eee61b9]{--zl-pagination-justify: flex-start}.zl-pagination--center[data-v-5eee61b9]{--zl-pagination-justify: center}.zl-pagination--right[data-v-5eee61b9]{--zl-pagination-justify: flex-end}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import o from "./index2.vue.mjs";
|
|
2
2
|
import './index.css';/* empty css */
|
|
3
3
|
import t from "../../_virtual/_plugin-vue_export-helper.mjs";
|
|
4
|
-
const
|
|
4
|
+
const i = /* @__PURE__ */ t(o, [["__scopeId", "data-v-5eee61b9"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
i as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=index.vue.mjs.map
|
|
@@ -1,48 +1,49 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { usePagination as
|
|
3
|
-
const B = /* @__PURE__ */
|
|
1
|
+
import { defineComponent as v, useAttrs as h, computed as r, ref as l, watch as p, resolveComponent as _, openBlock as d, createBlock as S, mergeProps as C, createCommentVNode as N } from "vue";
|
|
2
|
+
import { usePagination as P } from "./usePagination.mjs";
|
|
3
|
+
const B = /* @__PURE__ */ v({
|
|
4
4
|
name: "ZlPagination",
|
|
5
|
+
inheritAttrs: !1,
|
|
5
6
|
__name: "index",
|
|
6
7
|
emits: ["change", "page-change", "page-size-change"],
|
|
7
|
-
setup(
|
|
8
|
-
const t =
|
|
8
|
+
setup(k, { emit: s }) {
|
|
9
|
+
const t = s, a = h(), n = P(() => a), c = r(() => a.align ?? "right"), i = l(
|
|
9
10
|
a.pageNum ?? (n.value === !1 ? void 0 : n.value.currentPage) ?? 1
|
|
10
|
-
),
|
|
11
|
+
), g = l(
|
|
11
12
|
a.pageSize ?? (n.value === !1 ? void 0 : n.value.pageSize) ?? 30
|
|
12
13
|
);
|
|
13
|
-
|
|
14
|
+
p(
|
|
14
15
|
() => a.pageNum ?? a.currentPage,
|
|
15
16
|
(e) => {
|
|
16
17
|
e != null && (i.value = e);
|
|
17
18
|
}
|
|
18
|
-
),
|
|
19
|
+
), p(
|
|
19
20
|
() => a.pageSize,
|
|
20
21
|
(e) => {
|
|
21
|
-
e != null && (
|
|
22
|
+
e != null && (g.value = e);
|
|
22
23
|
}
|
|
23
24
|
);
|
|
24
|
-
function
|
|
25
|
-
i.value = e, t("change", { pageNum: e, pageSize:
|
|
25
|
+
function m(e) {
|
|
26
|
+
i.value = e, t("change", { pageNum: e, pageSize: g.value }), t("page-change", e);
|
|
26
27
|
}
|
|
27
|
-
function
|
|
28
|
-
|
|
28
|
+
function f(e) {
|
|
29
|
+
g.value = e, i.value = 1, t("change", { pageNum: 1, pageSize: e }), t("page-size-change", e);
|
|
29
30
|
}
|
|
30
|
-
const
|
|
31
|
+
const u = r(() => {
|
|
31
32
|
if (n.value === !1) return !1;
|
|
32
|
-
const { currentPage: e, pageSize:
|
|
33
|
-
return
|
|
33
|
+
const { currentPage: e, pageSize: z, ...o } = n.value;
|
|
34
|
+
return delete o.align, o;
|
|
34
35
|
});
|
|
35
|
-
return (e,
|
|
36
|
-
const
|
|
37
|
-
return
|
|
36
|
+
return (e, z) => {
|
|
37
|
+
const o = _("el-pagination");
|
|
38
|
+
return u.value !== !1 ? (d(), S(o, C({
|
|
38
39
|
key: 0,
|
|
39
|
-
class: "zl-pagination"
|
|
40
|
-
},
|
|
40
|
+
class: ["zl-pagination", `zl-pagination--${c.value}`]
|
|
41
|
+
}, u.value, {
|
|
41
42
|
"current-page": i.value,
|
|
42
|
-
"page-size":
|
|
43
|
-
onCurrentChange:
|
|
44
|
-
onSizeChange:
|
|
45
|
-
}), null, 16, ["current-page", "page-size"])) :
|
|
43
|
+
"page-size": g.value,
|
|
44
|
+
onCurrentChange: m,
|
|
45
|
+
onSizeChange: f
|
|
46
|
+
}), null, 16, ["class", "current-page", "page-size"])) : N("", !0);
|
|
46
47
|
};
|
|
47
48
|
}
|
|
48
49
|
});
|
|
@@ -2,9 +2,15 @@
|
|
|
2
2
|
* 标签页(el-tabs 封装):tabs schema 驱动,每 tab 内容经具名插槽(#tab.key)渲染
|
|
3
3
|
* EP 映射:tab.key→el-tab-pane name、tab.title→label、lazyLoad→lazy
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* 注意 1:这里必须 import 组件本体,不能写 `h('el-tabs')` ——h() 收到字符串只会当成
|
|
6
6
|
* 原生标签(shapeFlag=ELEMENT),既不解析组件、也不会渲染出页签,且没有任何告警。
|
|
7
7
|
* 只有模板里的 `<el-tabs>` 才会被编译成 resolveComponent。
|
|
8
|
+
*
|
|
9
|
+
* 注意 2:这里用 `withCtx()` 包住手写的 slot 函数。模板编译出的组件 slot 都是 withCtx
|
|
10
|
+
* 包装过的(`_n = true`,自带渲染上下文),而 `h(Comp, props, { default: () => [...] })`
|
|
11
|
+
* 里手写的裸函数没有上下文:EP 的 ElTabs / ElTabPane 在各自 render 里调用它时,
|
|
12
|
+
* Vue 会告警 `Slot "default" invoked outside of the render function`,且 slot 内的
|
|
13
|
+
* 响应式依赖不会被追踪(数据变了页签内容不更新)。withCtx 补齐上下文后与模板写法等价。
|
|
8
14
|
*/
|
|
9
15
|
declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<{
|
|
10
16
|
tabs: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ElTabs as
|
|
2
|
-
import { defineComponent as
|
|
3
|
-
const
|
|
1
|
+
import { ElTabs as b, ElTabPane as i } from "element-plus";
|
|
2
|
+
import { defineComponent as m, getCurrentInstance as c, h as r, withCtx as o, renderSlot as l } from "vue";
|
|
3
|
+
const z = m({
|
|
4
4
|
name: "ZlTabs",
|
|
5
5
|
inheritAttrs: !1,
|
|
6
6
|
props: {
|
|
@@ -9,41 +9,47 @@ const p = u({
|
|
|
9
9
|
fit: Boolean,
|
|
10
10
|
darkNav: { type: Boolean, default: !0 }
|
|
11
11
|
},
|
|
12
|
-
setup(
|
|
12
|
+
setup(t, { slots: e, attrs: d }) {
|
|
13
|
+
const n = c();
|
|
13
14
|
return () => r("div", { class: "zl-tabs-wrap" }, [
|
|
14
15
|
r(
|
|
15
|
-
|
|
16
|
+
b,
|
|
16
17
|
{
|
|
17
18
|
class: [
|
|
18
19
|
"zl-tabs",
|
|
19
20
|
{
|
|
20
|
-
"zl-tabs-no-border": !
|
|
21
|
-
"zl-tabs-fit":
|
|
22
|
-
"zl-tabs-dark-nav":
|
|
21
|
+
"zl-tabs-no-border": !t.border,
|
|
22
|
+
"zl-tabs-fit": t.fit,
|
|
23
|
+
"zl-tabs-dark-nav": t.darkNav
|
|
23
24
|
}
|
|
24
25
|
],
|
|
25
26
|
...d
|
|
26
27
|
},
|
|
27
28
|
{
|
|
28
|
-
default: (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
29
|
+
default: o(
|
|
30
|
+
() => [
|
|
31
|
+
...t.tabs.map((s) => {
|
|
32
|
+
const { key: a, title: f, ...u } = s;
|
|
33
|
+
return r(
|
|
34
|
+
i,
|
|
35
|
+
{
|
|
36
|
+
key: a,
|
|
37
|
+
name: a,
|
|
38
|
+
label: f,
|
|
39
|
+
lazy: !0,
|
|
40
|
+
...u
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
// 必须返回数组:ElTabPane 用 renderSlot 渲染内容,内部 ensureValidVNode
|
|
44
|
+
// 会对返回值调用 .some(),拿到单个 vnode 会直接抛 TypeError。
|
|
45
|
+
default: o(() => [l(e, a, { tab: s })], n)
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
}),
|
|
49
|
+
l(e, "default")
|
|
50
|
+
],
|
|
51
|
+
n
|
|
52
|
+
)
|
|
47
53
|
}
|
|
48
54
|
),
|
|
49
55
|
l(e, "extra")
|
|
@@ -51,6 +57,6 @@ const p = u({
|
|
|
51
57
|
}
|
|
52
58
|
});
|
|
53
59
|
export {
|
|
54
|
-
|
|
60
|
+
z as default
|
|
55
61
|
};
|
|
56
62
|
//# sourceMappingURL=index.vue.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zl-ui-kit/components",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
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/composables": "0.6.
|
|
43
|
-
"@zl-ui-kit/utils": "0.6.
|
|
44
|
-
"@zl-ui-kit/icons": "0.6.
|
|
42
|
+
"@zl-ui-kit/composables": "0.6.3",
|
|
43
|
+
"@zl-ui-kit/utils": "0.6.3",
|
|
44
|
+
"@zl-ui-kit/icons": "0.6.3"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"@vueuse/core": "^12.3.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/tsconfig": "1.0.0",
|
|
102
101
|
"@jichuang/vite-config": "1.0.0",
|
|
103
|
-
"@
|
|
104
|
-
"@
|
|
102
|
+
"@jichuang/eslint-config": "1.0.0",
|
|
103
|
+
"@zl-ui-kit/theme": "0.6.3",
|
|
104
|
+
"@jichuang/tsconfig": "1.0.0"
|
|
105
105
|
},
|
|
106
106
|
"repository": {
|
|
107
107
|
"type": "git",
|