@vue-ui-kit/ant 1.4.0 → 1.6.0

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.zh.md ADDED
@@ -0,0 +1,480 @@
1
+ <div align="center">
2
+ [English](./README.md) | 简体中文
3
+ </div>
4
+ # Vue UI Kit 使用文档
5
+
6
+ 基于 Ant Design Vue 的 Vue 3 UI 组件库,提供增强的表单、网格和实用组件。
7
+
8
+ ## 安装
9
+
10
+ ```bash
11
+ npm install @vue-ui-kit/ant
12
+ # 或
13
+ yarn add @vue-ui-kit/ant
14
+ # 或
15
+ pnpm add @vue-ui-kit/ant
16
+ ```
17
+
18
+ ```ts
19
+ /*main.ts*/
20
+ import { createApp } from 'vue';
21
+ import App from './App.vue';
22
+ import Antd from 'ant-design-vue';
23
+ import UIKit from '@vue-ui-kit/ant';
24
+ import '@vue-ui-kit/ant/scss';
25
+ /*创建渲染器(推荐使用tsx配置)*/
26
+ import { setupKit } from './setup/kit.tsx';
27
+
28
+ /*创建格式化*/
29
+ UIKit.addFormatter({
30
+ test: ({ row, column, cellValue }) => 'test:...' + 'field:' + column.field + '...v:' + cellvalue,
31
+ });
32
+ createApp(App).use(Antd).use(UIKit).mount('#app');
33
+ ```
34
+
35
+ ```tsx
36
+ /*kit.tsx*/
37
+ import UIKit from '@vue-ui-kit/ant';
38
+ import { TypographyParagraph, Switch } from 'ant-design-vue';
39
+
40
+ export const setupKit = () => {
41
+ /*注册$paragraph作为单元格渲染器*/
42
+ UIKit.addRender('$paragraph', {
43
+ renderDefault({ props = {} }: RenderOptions, { row, field }: RenderTableParams) {
44
+ const content = props.getContent?.({ row, field }) ?? (valued(field) ? row[field!] : '');
45
+ return valued(field) ? (
46
+ <TypographyParagraph
47
+ {...merge({}, defaultProps.$paragraph, omit(props, ['content', 'getContent']))}
48
+ content={content}
49
+ />
50
+ ) : null;
51
+ },
52
+ });
53
+ /*注册$switch 作为表单渲染器*/
54
+ UIKit.addRender('$switch', {
55
+ renderItemContent(
56
+ { props = {}, events = {} }: RenderOptions,
57
+ { data, field }: RenderFormParams,
58
+ ) {
59
+ return valued(field) ? (
60
+ <Switch
61
+ v-model:checked={data[field!]}
62
+ {...props}
63
+ onChange={(...arg) => {
64
+ events.change?.({ data, field }, ...arg);
65
+ }}
66
+ />
67
+ ) : null;
68
+ },
69
+ });
70
+ };
71
+
72
+ /*
73
+ * 已内置了渲染器
74
+ *
75
+ $input: Input,
76
+ AInput: Input,
77
+ $textarea: Textarea,
78
+ Textarea: Textarea,
79
+ $number: InputNumber,
80
+ AInputNumber: InputNumber,
81
+ $select: Select,
82
+ ASelect: Select,
83
+ $date: DatePicker,
84
+ ADatePicker: DatePicker,
85
+ $range: RangePicker,
86
+ ARangePicker: RangePicker,
87
+ AAutoComplete: AutoComplete,
88
+ $Cascader: Cascader,
89
+ ACascader: Cascader,
90
+ ACheckbox: Checkbox,
91
+ AMentions: Mentions,
92
+ ARate: Rate,
93
+ ASlider: Slider,
94
+ $time: TimePicker,
95
+ ATimePicker: TimePicker,
96
+ ATreeSelect: TreeSelect,
97
+
98
+ *
99
+ * */
100
+ ```
101
+
102
+ ## 环境要求
103
+
104
+ - Node.js >= 16
105
+ - Vue >= 3.2.0
106
+ - ant-design-vue >= 4.0.0
107
+ - @ant-design/icons-vue >= 7.0.0
108
+
109
+ ## 组件
110
+
111
+ ### PForm
112
+
113
+ 增强的表单组件,具有简化的配置和动态字段功能。
114
+
115
+ #### 属性
116
+
117
+ | 属性 | 类型 | 说明 |
118
+ | ----------- | ------------------ | ------------------------------- |
119
+ | items | `PFormItemProps[]` | 表单项配置数组 |
120
+ | customReset | `() => void` | 自定义重置函数 |
121
+ | 其他 | `FormProps` | 所有 ant-design-vue Form 的属性 |
122
+
123
+ #### PFormItemProps
124
+
125
+ | 属性 | 类型 | 说明 | 默认值 |
126
+ | ------------- | ------------------------------- | -------------------------- | ------ |
127
+ | field | `string` | 表单字段名 | - |
128
+ | title | `string` | 字段标签 | - |
129
+ | span | `number` | 栅格跨度 | - |
130
+ | colon | `boolean` | 是否显示冒号 | true |
131
+ | forceRequired | `boolean` | 显示必填标记(不进行验证) | false |
132
+ | align | `'left' \| 'right' \| 'center'` | 文本对齐方式 | 'left' |
133
+ | col | `ColProps` | 栅格列属性 | - |
134
+ | rule | `Rule[]` | 验证规则 | - |
135
+ | tooltipConfig | `TooltipConfig` | 提示配置 | - |
136
+
137
+ #### 示例
138
+
139
+ ```vue
140
+ <script setup lang="tsx">
141
+ import { computed, ref } from 'vue';
142
+ import { TextAdAccount } from '...somewhere';
143
+ import { PFormProps } from '@vue-ui-kit/ant';
144
+
145
+ const createFormData = ref<TextAdAccount>({
146
+ account_code: '',
147
+ key_id: '',
148
+ org_id: '',
149
+ secret_key: '',
150
+ });
151
+ const createFormSetting = computed<PFormProps<TestAdAccount>>(() => ({
152
+ rules: {
153
+ account_code: [{ required: true, message: '请选择Test账户', trigger: 'change' }],
154
+ org_id: [{ required: true, message: '请选择授权组织', trigger: 'change' }],
155
+ secret_key: [{ required: true, message: '请输入Secret Key', trigger: 'change' }],
156
+ key_id: [{ required: true, message: '请输入Key ID', trigger: 'change' }],
157
+ },
158
+ items: [
159
+ {
160
+ title: '渠道',
161
+ span: 24,
162
+ itemRender: {
163
+ name: 'readonly',
164
+ props: {
165
+ getText: () => 'Test',
166
+ },
167
+ },
168
+ },
169
+ {
170
+ field: 'account_code',
171
+ title: '账户',
172
+ span: 24,
173
+ itemRender: {
174
+ name: '$select',
175
+ props: {
176
+ options: [
177
+ { label: 'Test账户1', value: '1' },
178
+ { label: 'Test账户2', value: '2' },
179
+ ],
180
+ },
181
+ events: {
182
+ change: ({ data }) => {
183
+ data.org_id = '';
184
+ },
185
+ },
186
+ },
187
+ tooltipConfig: {
188
+ title: '账号是指登录Test后台的邮箱',
189
+ },
190
+ },
191
+ {
192
+ field: 'org_id',
193
+ title: '授权组织',
194
+ span: 24,
195
+ slots: {
196
+ default: ({ data }) => <my-custom-input v-model={data.org_id}></my-custom-input>,
197
+ },
198
+ tooltipConfig: {
199
+ title: '对应账号下的组织名称、组织ID、组织核心ID(Org Core ID)',
200
+ },
201
+ },
202
+ {
203
+ field: 'secret_key',
204
+ title: 'Secret Key',
205
+ span: 24,
206
+ itemRender: {
207
+ name: '$input',
208
+ },
209
+ tooltipConfig: {
210
+ title: '我是tooltip',
211
+ },
212
+ },
213
+ {
214
+ field: 'key_id',
215
+ title: 'Key ID',
216
+ span: 24,
217
+ itemRender: {
218
+ name: '$input',
219
+ },
220
+ tooltipConfig: {
221
+ title: '我是tooltip',
222
+ },
223
+ },
224
+ ],
225
+ }));
226
+ </script>
227
+ <template>
228
+ <p-form ref="cf" :data="createFormData" v-bind="createFormSetting" />
229
+ </template>
230
+ ```
231
+
232
+ ### PGrid
233
+
234
+ 高级表格组件,内置数据管理和工具栏功能。
235
+
236
+ #### 属性
237
+
238
+ | 属性 | 类型 | 说明 | 默认值 |
239
+ | ------------- | -------------------- | -------------- | ------- |
240
+ | rowKey | `string` | 唯一标识字段 | 'id' |
241
+ | columns | `ColumnProps[]` | 表格列配置 | - |
242
+ | formConfig | `PFormProps` | 搜索表单配置 | - |
243
+ | toolbarConfig | `ToolbarConfig` | 工具栏按钮配置 | - |
244
+ | pageConfig | `PageConfig` | 分页配置 | - |
245
+ | proxyConfig | `ProxyConfig` | 数据获取配置 | - |
246
+ | selectConfig | `SelectConfig` | 行选择配置 | - |
247
+ | scrollMode | `'outer' \| 'inner'` | 滚动模式 | 'outer' |
248
+ | fitHeight | `number` | 自适应高度调整 | - |
249
+
250
+ #### 示例
251
+
252
+ ```vue
253
+ <script setup lang="ts">
254
+ import { ColumnProps, getButtonResponsive, labelColDict, PGridProps } from '@vue-ui-kit/ant';
255
+ import { computed } from 'vue';
256
+ import { hasAuth } from '...somewhere';
257
+ import { getChannelPage, deleteChannel, deleteChannels } from '...somewhere';
258
+ import type { Channel, ChannelParam } from '...somewhere';
259
+
260
+ const gridSetting = computed<PGridProps<Channel, ChannelParam>>(() => ({
261
+ selectConfig: {
262
+ multiple: true,
263
+ },
264
+ toolbarConfig: {
265
+ buttons: [
266
+ {
267
+ code: 'multiDelete',
268
+ content: t('批量删除'),
269
+ type: 'danger',
270
+ },
271
+ ],
272
+ },
273
+ columns: [
274
+ {
275
+ field: 'id',
276
+ title: 'ID',
277
+ width: 110,
278
+ },
279
+ {
280
+ field: 'name',
281
+ title: '渠道名称',
282
+ width: 140,
283
+ },
284
+ {
285
+ field: 'short_name',
286
+ title: '简称',
287
+ width: 140,
288
+ },
289
+ {
290
+ field: 'operator',
291
+ title: '操作人',
292
+ width: 120,
293
+ },
294
+ {
295
+ field: 'update_time',
296
+ title: '最近修改时间',
297
+ width: 180,
298
+ },
299
+ ...(hasAuth('common_channel_admin')
300
+ ? ([
301
+ {
302
+ title: '操作',
303
+ fixed: 'right',
304
+ width: 160,
305
+ cellRender: {
306
+ name: 'ButtonTree',
307
+ children: [
308
+ {
309
+ content: '编辑',
310
+ type: 'link',
311
+ clickEvt: ({ row }: { row: Channel }) => doEdit(row),
312
+ },
313
+ {
314
+ content: '删除',
315
+ type: 'link',
316
+ danger: true,
317
+ clickEvt: ({ row }: { row: Channel }) => confirmDelete(row),
318
+ },
319
+ ],
320
+ },
321
+ },
322
+ ] as ColumnProps<Channel>[])
323
+ : []),
324
+ ],
325
+ formConfig: {
326
+ items: [
327
+ {
328
+ field: 'name',
329
+ title: '渠道名称',
330
+ labelCol: labelColDict[4],
331
+ itemRender: {
332
+ name: '$input',
333
+ props: {
334
+ placeholder: '请输入广告渠道名称',
335
+ },
336
+ },
337
+ },
338
+ {
339
+ col: getButtonResponsive(1),
340
+ align: 'right',
341
+ itemRender: {
342
+ name: '$buttons',
343
+ children: [
344
+ {
345
+ props: {
346
+ content: '查询',
347
+ htmlType: 'submit',
348
+ type: 'primary',
349
+ },
350
+ },
351
+ {
352
+ props: {
353
+ content: '重置',
354
+ htmlType: 'reset',
355
+ },
356
+ },
357
+ ],
358
+ },
359
+ },
360
+ ],
361
+ },
362
+ pageConfig: {
363
+ pageSize: 10,
364
+ },
365
+ proxyConfig: {
366
+ response: {
367
+ total: 'total',
368
+ result: 'list',
369
+ },
370
+ ajax: {
371
+ query: ({ form, page }) =>
372
+ getChannelPage({
373
+ ...form,
374
+ ...page,
375
+ } as ChannelParam),
376
+ multiDelete: deleteChannels,
377
+ },
378
+ },
379
+ }));
380
+ </script>
381
+ <template>
382
+ <p-grid ref="gridEl" v-bind="gridSetting" />
383
+ </template>
384
+ ```
385
+
386
+ ### PFormGroup
387
+
388
+ 表单分组组件,用于将表单字段组织成可折叠的部分。
389
+
390
+ #### 属性
391
+
392
+ | 属性 | 类型 | 说明 |
393
+ | -------------- | ---------------------- | ------------------ |
394
+ | getFormSetting | `(data) => PFormProps` | 获取表单设置的函数 |
395
+ | source | `object` | 表单数据源 |
396
+
397
+ #### 示例
398
+
399
+ ```vue
400
+ /*get-form-setting 本质就是生成内部form的computed属性的方法*/
401
+ <template>
402
+ <p-form-group
403
+ :source="formData"
404
+ :get-form-setting="
405
+ (data) => ({
406
+ items: [
407
+ {
408
+ field: 'group1',
409
+ title: '分组1',
410
+ itemsRender: {
411
+ name: '$input',
412
+ },
413
+ },
414
+ ],
415
+ })
416
+ "
417
+ />
418
+ </template>
419
+ ```
420
+
421
+ ### PromisePicker
422
+
423
+ 支持异步数据的选择器组件。
424
+
425
+ #### 属性
426
+
427
+ | 属性 | 类型 | 说明 |
428
+ | ----------- | ------------------ | ---------- |
429
+ | gridSetting | `PGridProps` | 表格配置 |
430
+ | title | `string` | 模态框标题 |
431
+ | width | `string \| number` | 模态框宽度 |
432
+
433
+ #### 示例
434
+
435
+ ```vue
436
+ <script setup lang="ts">
437
+ import { ref } from 'vue';
438
+ import { PromisePickerInstance } from '@vue-ui-kit/ant';
439
+ import { Asset } from '...somewhere';
440
+ import { fetchUsers } from '...somewhere';
441
+
442
+ const pickerEl = ref<PromisePickerInstance<Asset>>();
443
+ const test = () => {
444
+ pickerEl.value!.pick().then(({ row }) => {
445
+ console.log(row);
446
+ });
447
+ };
448
+ </script>
449
+ <template>
450
+ <promise-picker
451
+ ref="pickerEl"
452
+ title="选择用户"
453
+ :grid-setting="{
454
+ columns: [
455
+ { title: '姓名', field: 'name' },
456
+ { title: '邮箱', field: 'email' },
457
+ ],
458
+ proxyConfig: {
459
+ ajax: {
460
+ query: fetchUsers,
461
+ },
462
+ },
463
+ }"
464
+ />
465
+ </template>
466
+ ```
467
+
468
+ ## Q&A
469
+
470
+ ### 1. 使用computed +v-bind生成动态表格+表单时,表单内选项值更新,导致表格重新渲染,怎么办?
471
+
472
+ 答: 将formConfig 剥离出来写另外一个computed <p-grid v-bind="gridSetting" :form-config="computedFormConfig" />
473
+
474
+ ### 2. 目前表格ajax只支持了multiDelete和表格数据获取?
475
+
476
+ 答: 编辑详情大部分情况下都和表格无法一一对应,所以没有开发意义。多行删除需要和selectConfig: { multiple: true, }, toolbarConfig》buttons>code:"multipleDelete" 一起使用
477
+
478
+ ### 3. 为什么推荐computed写法?
479
+
480
+ 答: 简化所有动态逻辑 仅此而已,遇到复杂问题可以自己尝试reactive 然后去维护他 但大部分情况computed好用些