view-ui-plus-derive 0.0.1

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 ADDED
@@ -0,0 +1,1834 @@
1
+ # view-ui-plus-derive
2
+
3
+ 基于view-ui-plus的组件等扩展,需要vue 3.5+
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install view-ui-plus-derive
9
+
10
+ or
11
+
12
+ yarn add view-ui-plus-derive
13
+ ```
14
+
15
+ [TOC]
16
+
17
+ ## 使用
18
+
19
+ ### 全局引入
20
+
21
+ ```js
22
+ import { createApp } from 'vue'
23
+ import ViewUIPlus from 'view-ui-plus'
24
+ import 'view-ui-plus/dist/styles/viewuiplus.css'
25
+ import plugin from 'view-ui-plus-derive' // 注册组件与指令
26
+ import 'view-ui-plus-derive/style' // 引入所有组件样式
27
+
28
+ import App from './App.vue'
29
+
30
+ createApp(App).use(ViewUIPlus).use(plugin).mount('#app')
31
+ ```
32
+
33
+ ### 按需引入
34
+
35
+ ```js
36
+ import { createApp } from 'vue'
37
+ import ViewUIPlus from 'view-ui-plus'
38
+ import 'view-ui-plus/dist/styles/viewuiplus.css'
39
+ import { Combi } from 'view-ui-plus-derive'
40
+ import 'view-ui-plus-derive/styles/Combi.css' // 引入需要的组件样式
41
+
42
+ import App from './App.vue'
43
+
44
+ createApp(App).use(ViewUIPlus).component(Combi.name, Combi).mount('#app')
45
+ ```
46
+
47
+ 仅部分组件有对应样式,如图
48
+ ![css](./assets/import%20component%20css.png)
49
+
50
+ ### 多语言
51
+
52
+ 目前提供中英翻译,默认显示简体中文。在安装插件时可传入需要显示的语言,若使用vue-i18n,则只需传入vue-i18n实例
53
+
54
+ - 使用插件提供的英文翻译
55
+
56
+ ```js
57
+ import { createApp } from 'vue'
58
+ import ViewUIPlus from 'view-ui-plus'
59
+ import 'view-ui-plus/dist/styles/viewuiplus.css'
60
+ import viewUiDerive from 'view-ui-plus-derive'
61
+ import enUS from 'view-ui-plus-derive/locale/en-US'
62
+
63
+ import App from './App.vue'
64
+
65
+ createApp(App)
66
+ .use(ViewUIPlus)
67
+ .use(viewUiDerive, {
68
+ msg: enUS
69
+ })
70
+ .mount('#app')
71
+ ```
72
+
73
+ - 使用插件未提供的翻译
74
+
75
+ ```js
76
+ import { createApp } from 'vue'
77
+ import ViewUIPlus from 'view-ui-plus'
78
+ import 'view-ui-plus/dist/styles/viewuiplus.css'
79
+ import viewUiDerive from 'view-ui-plus-derive'
80
+
81
+ import App from './App.vue'
82
+
83
+ createApp(App)
84
+ .use(ViewUIPlus)
85
+ .use(viewUiDerive, {
86
+ msg: {
87
+ d: {
88
+ lang: 'zh-Hant',
89
+ allCheckbox: {
90
+ title: '全選'
91
+ },
92
+ countRange: {
93
+ minHolder: '最小值',
94
+ maxHolder: '最大值'
95
+ },
96
+ curdTable: {
97
+ actionText: '操作',
98
+ addText: '新增',
99
+ del: '刪除'
100
+ },
101
+ dateRange: {
102
+ beginHolder: '開始時間',
103
+ endHolder: '結束時間'
104
+ },
105
+ dCalendar: {
106
+ mini: ['日', '一', '二', '三', '四', '五', '六'],
107
+ short: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],
108
+ long: ['禮拜日', '禮拜一', '禮拜二', '禮拜三', '禮拜四', '禮拜五', '禮拜六']
109
+ },
110
+ modalFooter: {
111
+ ok: '確定',
112
+ cancel: '取消'
113
+ },
114
+ pageTable: {
115
+ title: '列表',
116
+ reload: '重載',
117
+ maxmize: '最大化',
118
+ restore: '還原'
119
+ },
120
+ toggleColumn: {
121
+ title: '列',
122
+ checkAll: '全選'
123
+ }
124
+ }
125
+ }
126
+ })
127
+ .mount('#app')
128
+ ```
129
+
130
+ - 使用vue-i18n
131
+
132
+ ```js
133
+ import { createApp } from 'vue'
134
+ import { createI18n } from 'vue-i18n'
135
+ import ViewUIPlus from 'view-ui-plus'
136
+ import zh from 'view-ui-plus/dist/locale/zh-CN'
137
+ import en from 'view-ui-plus/dist/locale/en-US'
138
+ import 'view-ui-plus/dist/styles/viewuiplus.css'
139
+ import viewUiDerive from 'view-ui-plus-derive'
140
+ import zhCN from 'view-ui-plus-derive/locale/zh-CN'
141
+ import enUS from 'view-ui-plus-derive/locale/en-US'
142
+
143
+ import App from './App.vue'
144
+
145
+ // 需要时可手动修改语言主要key,并在安装插件时传入参数msgPrefix,如 {msgPrefix: 'someKey'}
146
+ // zhCN.someKey = zhCN.d
147
+ // delete zhCN.d
148
+ // enUS.someKey = enUS.d
149
+ // delete enUS.d
150
+
151
+ const i18n = createI18n({
152
+ allowComposition: true,
153
+ // globalInjection: true,
154
+ legacy: false,
155
+ locale: 'zh-CN',
156
+ fallbackLocale: 'zh-CN',
157
+ messages: {
158
+ 'zh-CN': {
159
+ ...zh,
160
+ ...zhCN
161
+ },
162
+ 'en-US': {
163
+ ...en,
164
+ ...enUS
165
+ }
166
+ }
167
+ })
168
+
169
+ createApp(App)
170
+ .use(i18n)
171
+ .use(ViewUIPlus)
172
+ .use(viewUiDerive, {
173
+ i18n
174
+ // msgPrefix: 'someKey' // 该值仅针对使用vue-i18n的情况生效
175
+ })
176
+ .mount('#app')
177
+ ```
178
+
179
+ ### 其它扩展
180
+
181
+ - 为多选模式的iview Select添加全选功能。**若全局安装了插件则无需再次注册指令**
182
+
183
+ ```js
184
+ // 全局注册
185
+ import { createApp } from 'vue'
186
+ import ViewUIPlus from 'view-ui-plus'
187
+ import 'view-ui-plus/dist/styles/viewuiplus.css'
188
+ import { iviewSelect } from "view-ui-plus-derive";
189
+ import App from './App.vue'
190
+
191
+ createApp(App).use(ViewUIPlus).directive('iviewSelect', iviewSelect).mount('#app')
192
+
193
+ // 局部注册
194
+ <script setup>
195
+ import { iviewSelect as vIviewSelect } from "view-ui-plus-derive";
196
+ </script>
197
+
198
+ // 使用
199
+ <Select v-iview-select:all="true" multiple></Select>
200
+ ```
201
+
202
+ - 调整iview的InputNumber默认值为null,避免在值为undefined时显示 1
203
+ - 为InputNumber添加prop:unset,用于设置在清空时的默认值
204
+
205
+ ```js
206
+ import 'view-ui-plus-derive/iview-mods/input-number'
207
+ ```
208
+
209
+ - 修复iview Select启用filterable时在过滤后可能只显示之前所选项的bug
210
+
211
+ ```js
212
+ import 'view-ui-plus-derive/iview-mods/select'
213
+ ```
214
+
215
+ - 修复Table在某些情况下表头/固定列与内容错位
216
+
217
+ ```js
218
+ import 'view-ui-plus-derive/iview-mods/table'
219
+ ```
220
+
221
+ 也可以一次性引入iview-mods下的input-number、select、table
222
+
223
+ ```js
224
+ import 'view-ui-plus-derive/iview-mod'
225
+ ```
226
+
227
+ 针对iview组件的样式优化
228
+
229
+ - 修复带有固定列的Table存在水平滚动条时,固定列下方的滚动条无法点中
230
+ - 防止Select在关闭选项时可能出现的点击更换选项bug
231
+ - 调整Input、InputNumber、Select、Button在禁用状态下非placeholder的文本颜色为#7a7a7a
232
+
233
+ ```js
234
+ import 'view-ui-plus-derive/iview-mod.css'
235
+ ```
236
+
237
+ ### 组件
238
+
239
+ #### AllCheckbox
240
+
241
+ 提供全选功能的CheckboxGroup
242
+
243
+ ```html
244
+ <template>
245
+ <AllCheckbox v-model="checkeds" v-model:all="checkAll" :list="list"></AllCheckbox>
246
+ </template>
247
+ <script setup>
248
+ import { ref, shallowRef } from 'vue'
249
+
250
+ const checkeds = shallowRef(['1', '3']),
251
+ checkAll = ref(),
252
+ list = Object.entries({
253
+ 1: '周一',
254
+ 2: '周二',
255
+ 3: '周三',
256
+ 4: '周四',
257
+ 5: '周五',
258
+ 6: '周六',
259
+ 7: '周日'
260
+ })
261
+ </script>
262
+ ```
263
+
264
+ **props**
265
+
266
+ ```js
267
+ // v-model双向绑定选中值
268
+ modelValue: Array
269
+
270
+ // 全选框显示文本,默认“全选”
271
+ title: String
272
+
273
+ // 选项数组,数组成员可以是数组或对象
274
+ list: Array
275
+
276
+ // 各选项值对应list中的value键。如list是[{v:1,k:2}],valueKey为 v 且 labelKey为 k, 则选项绑定值为 1,显示文本是 2
277
+ valueKey: {
278
+ type: [String, Number],
279
+ default: 0
280
+ }
281
+
282
+ // 各选项值对应list中的label键。如list是[{v:1,k:2}],valueKey为 v 且 labelKey为 k, 则选项绑定值为 1,显示文本是 2
283
+ labelKey: {
284
+ type: [String, Number],
285
+ default: 1
286
+ }
287
+
288
+ // 同时设置valueKey & labelKey,优先级相对更高
289
+ keyMap: {
290
+ type: Object,
291
+ default(props) {
292
+ return {
293
+ value: props.valueKey,
294
+ label: props.labelKey
295
+ }
296
+ }
297
+ }
298
+
299
+ // 是否隐藏全选框
300
+ hideAll: Boolean
301
+
302
+ // 配合v-model:all双向绑定全选框的值,若全选中应为 true,否则 false
303
+ all: Boolean
304
+ ```
305
+
306
+ **emits**
307
+
308
+ ```js
309
+ /**
310
+ * 更改checkbox时触发
311
+ * @param value 选中值
312
+ * @param checkAll 是否全部选中
313
+ */
314
+ emit('change', value, checkAll)
315
+ ```
316
+
317
+ **slots**
318
+
319
+ ```js
320
+ /**
321
+ * checkbox选项文本
322
+ * @param item 数组项
323
+ */
324
+ default({item})
325
+ ```
326
+
327
+ #### BaseSwitch
328
+
329
+ 省去重复写slot的Switch
330
+
331
+ ```html
332
+ <template>
333
+ <BaseSwitch v-model="toggle" true-label="开" false-label="关"></BaseSwitch>
334
+ </template>
335
+ <script setup>
336
+ import { ref } from 'vue'
337
+
338
+ const toggle = ref('T')
339
+ </script>
340
+ ```
341
+
342
+ **props**
343
+ 除以下prop,可传递Switch的其它prop
344
+
345
+ ```js
346
+ // v-model双向绑定值
347
+ modelValue: [String, Number, Boolean]
348
+
349
+ // 打开状态对应值,默认 'T'
350
+ trueValue: {
351
+ type: [String, Number, Boolean],
352
+ default: 'T'
353
+ }
354
+
355
+ // 关闭状态对应值,默认 'F'
356
+ falseValue: {
357
+ type: [String, Number, Boolean],
358
+ default: 'F'
359
+ }
360
+
361
+ // 打开状态对应文本
362
+ trueLabel: String
363
+
364
+ // 关闭状态对应文本
365
+ falseLabel: String
366
+ ```
367
+
368
+ **emits**
369
+ 除以下事件,可监听Switch的其它事件
370
+
371
+ ```js
372
+ /**
373
+ * 切换状态时触发
374
+ * @param value 当前状态
375
+ */
376
+ emit('change', value)
377
+ ```
378
+
379
+ **slots**
380
+
381
+ ```js
382
+ // 打开状态对应文本
383
+ open()
384
+ // 关闭状态对应文本
385
+ close()
386
+ ```
387
+
388
+ #### RemoteSelect
389
+
390
+ 远程请求数据的Select
391
+
392
+ ```html
393
+ <template>
394
+ <RemoteSelect
395
+ v-model="selectModel"
396
+ :method="getList"
397
+ filterable
398
+ style="width: 200px"
399
+ @on-change="$Message.info($event)"></RemoteSelect>
400
+ </template>
401
+ <script setup>
402
+ import { ref } from 'vue'
403
+
404
+ const selectModel = ref(''),
405
+ getList = () => new Promise(resolve => {
406
+ setTimeout(() => {
407
+ resolve([
408
+ {value: 'a', label: '一'}
409
+ {value: 'b', label: '二'}
410
+ {value: 'c', label: '三'}
411
+ ])
412
+ }, 2000)
413
+ })
414
+ </script>
415
+ ```
416
+
417
+ **props**
418
+ 除以下prop,可传递Select的其它prop,如filterable
419
+
420
+ ```js
421
+ // v-model双向绑定选中值
422
+ modelValue: [String, Array, Number]
423
+
424
+ // 可通过v-model:list双向绑定选项列表
425
+ list: Array
426
+
427
+ // 是否多选
428
+ multiple: Boolean
429
+
430
+ // 是否将选项的value作为Option的key,默认以v-for的index作为key
431
+ valueAsKey: Boolean
432
+
433
+ // 选项对应value的key
434
+ valueKey: {
435
+ type: String,
436
+ default: 'value'
437
+ }
438
+
439
+ // 选项对应文本的key
440
+ labelKey: {
441
+ type: String,
442
+ default: 'label'
443
+ }
444
+
445
+ // 同时设置 valueKey 与 labelKey,优先级更高
446
+ keyMap: {
447
+ type: Object,
448
+ default(props) {
449
+ return {
450
+ value: props.valueKey,
451
+ label: props.labelKey
452
+ }
453
+ }
454
+ }
455
+
456
+ // 查询数据的函数/方法,结果为Falsy则认为请求失败,可返回一个Promise<result>。例如使用axios.get()
457
+ method: Function
458
+
459
+ // 可通过v-model:refresh获取组件内部的查询方法
460
+ refresh: Function
461
+
462
+ // 处理 method 成功返回后的结果
463
+ process: Function
464
+
465
+ // 调用method时的参数
466
+ param: [Object, Function, String]
467
+
468
+ // 通过v-model:chosen获取选中对象
469
+ chosen: [Object, Array]
470
+
471
+ // 是否挂载后立即请求,否则在点开时请求
472
+ autoGet: Boolean
473
+
474
+ // 修改Option的label,参数分别为:当前项,当前项索引
475
+ formatLabel: Function
476
+
477
+ // 点开获取数据时根据该函数返回值确定可否发送请求
478
+ check: Function
479
+
480
+ // 是否仅显示选中项的文本
481
+ textMode: Boolean
482
+
483
+ // 修改当启用textMode时显示的文本,参数:选中项
484
+ textFormat: Function
485
+
486
+ /**
487
+ * 关联值,该值变化后会清空绑定值与选项
488
+ *
489
+ * @example 当 some 变化后,<RemoteSelect>的值与选项都会清空
490
+ * <Select v-model="some" ><Option value="1">1</Option></Select>
491
+ * <RemoteSelect :parentCode="some" />
492
+ */
493
+ parentCode: [String, Array, Number]
494
+
495
+ // 用于判断是否禁用每一项Option,参数:当前项,当前项索引
496
+ optionDisabled: Function
497
+
498
+ // 用于设置Option的tag,参数:当前项,当前项索引
499
+ optionTag: Function
500
+
501
+ // 手动处理获取选中项的过程,参数:{ multiple, keyMap, list, value }
502
+ getSelected: Function
503
+
504
+ // 启用则根据绑定的list判断是否需要在展开时发送请求
505
+ cache: Boolean
506
+
507
+ // 手动获取数据,此时method和param不生效
508
+ loader: Function
509
+
510
+ // 开启后则展开时仅当parentCode有效才会发送请求
511
+ strict: Boolean
512
+
513
+ // 是否使用 v-iview-select:all 增加一键全选功能,仅多选模式生效
514
+ all: {
515
+ type: Boolean,
516
+ default: false
517
+ }
518
+ ```
519
+
520
+ **emits**
521
+ 除以下事件,可监听Select的其它事件,如on-change
522
+
523
+ ```js
524
+ /**
525
+ * 成功加载数据后触发
526
+ * @param value 返回的列表结果,应该是数组
527
+ */
528
+ emit('load', value)
529
+ ```
530
+
531
+ ##### **slots**
532
+
533
+ ```js
534
+ /**
535
+ * 选项显示的内容
536
+ * @param item 单个选项
537
+ * @param index 选项index
538
+ */
539
+ default({ item, index })
540
+
541
+ /**
542
+ * 替换<Select><Option /></Select>中的整个Option
543
+ * @param list 选项数组
544
+ */
545
+ dropdown( { list })
546
+
547
+ /**
548
+ * textMode对应的文本内容
549
+ * @param text 选中项
550
+ */
551
+ text( { text })
552
+ ```
553
+
554
+ #### CacheSelect
555
+
556
+ 同一个cacheId只请求一次数据的RemoteSelect
557
+
558
+ ```html
559
+ <template>
560
+ <CacheSelect
561
+ v-model="selectModel"
562
+ :method="getList"
563
+ style="width: 200px"
564
+ @on-change="$Message.info($event)"></CacheSelect>
565
+ <CacheSelect
566
+ v-model="selectModel"
567
+ :method="getList"
568
+ style="width: 200px"
569
+ @on-change="$Message.info($event)"></CacheSelect>
570
+ </template>
571
+ <script setup>
572
+ import { ref } from 'vue'
573
+
574
+ const selectModel = ref(''),
575
+ getList = () => new Promise(resolve => {
576
+ setTimeout(() => {
577
+ resolve([
578
+ {value: 'a', label: '一'}
579
+ {value: 'b', label: '二'}
580
+ {value: 'c', label: '三'}
581
+ ])
582
+ })
583
+ }, 2000)
584
+ </script>
585
+ ```
586
+
587
+ **props**
588
+ 除以下prop,可传递RemoteSelect与Select的其它prop
589
+
590
+ ```js
591
+ // v-model双向绑定选中值
592
+ modelValue: [String, Array, Number]
593
+
594
+ // 缓存的唯一键,当页面上同时用到多个不同数据源的CacheSelect时需传入不同值
595
+ cacheId: {
596
+ type: String,
597
+ default: 'list'
598
+ }
599
+ ```
600
+
601
+ **emits**
602
+ 除以下事件,可监听RemoteSelect与Select的其它事件
603
+
604
+ ```js
605
+ /**
606
+ * 更改选中项时触发
607
+ * @param value 当前选中项
608
+ */
609
+ emit('change', value)
610
+ ```
611
+
612
+ **slots**
613
+ 同RemoteSelect [slots](#slots)
614
+
615
+ #### Combi
616
+
617
+ 类似iview Input[append prepend]的组合框
618
+
619
+ ```jsx
620
+ <template>
621
+ <Combi>
622
+ <template #prepend>
623
+ <Select clearable style="width: 4em">
624
+ <Option value="111">111</Option>
625
+ <Option value="222">222</Option>
626
+ </Select>
627
+ </template>
628
+ <Select clearable>
629
+ <Option value="2">2</Option>
630
+ </Select>
631
+ <template #append>
632
+ <Icon type="md-arrow-dropright-circle" />
633
+ </template>
634
+ </Combi>
635
+ </template>
636
+ ```
637
+
638
+ **props**
639
+
640
+ ```js
641
+ // 前置文本
642
+ prepend: String
643
+ // 后置文本
644
+ append: String
645
+ ```
646
+
647
+ **slots**
648
+
649
+ ```js
650
+ default()
651
+ // 前置内容
652
+ prepend()
653
+ // 后置内容
654
+ append()
655
+ ```
656
+
657
+ #### CountRange
658
+
659
+ 数值范围组件
660
+
661
+ ```html
662
+ <template>
663
+ <CountRange
664
+ v-model:begin="minNum"
665
+ v-model:end="maxNum"
666
+ @change-min="(v) => console.log(v)"></CountRange>
667
+ </template>
668
+ <script setup>
669
+ import { ref } from 'vue'
670
+
671
+ const minNum = ref(),
672
+ maxNum = ref()
673
+ </script>
674
+ ```
675
+
676
+ **props**
677
+
678
+ ```js
679
+ // v-model:begin双向绑定最小值
680
+ begin: {
681
+ type: Number,
682
+ default: null
683
+ }
684
+
685
+ // v-model:end双向绑定最大值
686
+ end: {
687
+ type: Number,
688
+ default: null
689
+ }
690
+
691
+ // 允许的最小值,默认0
692
+ min: {
693
+ type: Number,
694
+ default: 0
695
+ }
696
+
697
+ // 允许的最大值,默认9999999999
698
+ max: {
699
+ type: Number,
700
+ default: 9999999999
701
+ }
702
+
703
+ // 禁用整个组件
704
+ disabled: Boolean
705
+
706
+ // 禁用最小值
707
+ minDisabled: Boolean
708
+
709
+ // 禁用最大值
710
+ maxDisabled: Boolean
711
+
712
+ // 最小值组件class
713
+ minClass: [String, Array, Object]
714
+
715
+ // 最大值组件class
716
+ maxClass: [String, Array, Object]
717
+
718
+ // 最小值占位文本
719
+ minHolder: String
720
+
721
+ // 最大值占位文本
722
+ maxHolder: String
723
+
724
+ // 传递给最小值组件的props
725
+ minAttr: Object
726
+
727
+ // 传递给最大值组件的props
728
+ maxAttr: Object
729
+
730
+ // 中间连接部分class
731
+ joinerClass: [String, Object]
732
+
733
+ // 是否隐藏连接部分
734
+ hideJoiner: Boolean
735
+
736
+ // 以下为InputNumber的同名prop
737
+ controlsOutside: Boolean
738
+ step: Number
739
+ readonly: Boolean
740
+ editable: {
741
+ type: Boolean,
742
+ default: true
743
+ }
744
+ precision: Number
745
+ formatter: Function
746
+ parser: Function
747
+ activeChange: {
748
+ type: Boolean,
749
+ default: true
750
+ }
751
+ ```
752
+
753
+ **emits**
754
+
755
+ ```js
756
+ /**
757
+ * 最小值变化后触发
758
+ * @param value 最小值
759
+ */
760
+ emit('change-min', value)
761
+
762
+ /**
763
+ * 最大值变化后触发
764
+ * @param value 最大值
765
+ */
766
+ emit('change-max', value)
767
+
768
+ /**
769
+ * 任一值变化后触发
770
+ * @param begin 最小值
771
+ * @param end 最大值
772
+ * @param isMax 是否修改的最大值
773
+ */
774
+ emit('change', begin, end, isMax)
775
+ ```
776
+
777
+ #### CurdTable
778
+
779
+ 具有增删功能的Table
780
+
781
+ ```html
782
+ <template>
783
+ <CurdTable
784
+ v-model="table.list"
785
+ :columns="table.columns"
786
+ size="small"
787
+ :action-width="130"
788
+ :add-row="table.add">
789
+ <template #num="{ row, index }">
790
+ <Input v-model.trim="table.list[index].num"></Input>
791
+ </template>
792
+ <template #moreAction="{ row }">
793
+ <Button size="small" class="ivu-mr-8">查看</Button>
794
+ </template>
795
+ </CurdTable>
796
+ </template>
797
+ <script setup>
798
+ const table = {
799
+ columns: [
800
+ {
801
+ title: 'emoji',
802
+ key: 'emoji',
803
+ type: 'selection'
804
+ },
805
+ {
806
+ title: 'exp',
807
+ key: 'exp'
808
+ },
809
+ {
810
+ title: 'num',
811
+ key: 'num',
812
+ slot: 'num',
813
+ renderHeader: (h, { column }) => (
814
+ <>
815
+ {column.title}
816
+ <input value={column.title} onInput={(e) => column.title = e.target.value} />
817
+ </>
818
+ )
819
+ },
820
+ {
821
+ title: 'time',
822
+ key: 'time'
823
+ }
824
+ ],
825
+ list: [
826
+ {
827
+ emoji: '😶‍🌫️🤨😐',
828
+ exp: 'ԅ(¯﹃¯ԅ)',
829
+ num: Math.random(),
830
+ time: new Date().toLocaleString()
831
+ },
832
+ {
833
+ emoji: '😠😪',
834
+ exp: 'ヾ(•ω•`)o',
835
+ num: Math.random(),
836
+ time: new Date().toLocaleString()
837
+ }
838
+ ],
839
+ add: () => [
840
+ {
841
+ emoji: ' 😏🤤',
842
+ exp: 'Σ(っ °Д °;)っ',
843
+ num: Math.random(),
844
+ time: new Date().toLocaleString()
845
+ }
846
+ ]
847
+ }
848
+ </script>
849
+ ```
850
+
851
+ **props**
852
+
853
+ ```js
854
+ // v-model双向绑定列表数据
855
+ modelValue: {
856
+ type: Array,
857
+ default: () => []
858
+ }
859
+
860
+ // iview Table columns
861
+ columns: {
862
+ type: Array,
863
+ default: () => []
864
+ }
865
+
866
+ // 隐藏控制列
867
+ disabled: Boolean
868
+
869
+ // 可否增加数据,默认true
870
+ addable: {
871
+ type: Boolean,
872
+ default: true
873
+ }
874
+
875
+ // 控制列宽度,默认90px
876
+ actionWidth: {
877
+ type: Number,
878
+ default: 90
879
+ }
880
+
881
+ // 控制列水平对齐,默认居中
882
+ actionAlign: {
883
+ type: String,
884
+ default: 'center'
885
+ }
886
+
887
+ // 控制列是否固定
888
+ actionFixed: String
889
+
890
+ // 控制列表头文本
891
+ actionText: String
892
+
893
+ // 右侧控制列
894
+ actionCol: {
895
+ type: Object,
896
+ default(props) {
897
+ return {
898
+ title: props.actionText,
899
+ slot: 'action',
900
+ width: props.actionWidth,
901
+ align: props.actionAlign,
902
+ fixed: props.actionFixed
903
+ }
904
+ }
905
+ }
906
+
907
+ // 新增行时需要添加的数据
908
+ addRow: {
909
+ type: Function,
910
+ default: () => []
911
+ }
912
+
913
+ // Table的border
914
+ border: Boolean
915
+ // Table的size
916
+ size: String
917
+
918
+ // 返回Promise以决定何时新增数据
919
+ beforeAdd: Function
920
+
921
+ // 返回Promise以决定何时删除数据
922
+ beforeRemove: Function
923
+
924
+ // 新增按钮type
925
+ addBtnType: {
926
+ type: String,
927
+ default: 'dashed'
928
+ }
929
+ // 新增按钮size
930
+ addBtnSize: String
931
+
932
+ // 新增按钮的ghost
933
+ addBtnGhost: {
934
+ type: Boolean,
935
+ default: false
936
+ }
937
+
938
+ // 新增按钮的disabled
939
+ addBtnDisabled: {
940
+ type: Boolean,
941
+ default(props) {
942
+ return !props.addable
943
+ }
944
+ }
945
+
946
+ // 传给新增Button的prop
947
+ addBtn: Object
948
+
949
+ // 删除按钮type
950
+ delBtnType: {
951
+ type: String,
952
+ default: 'warning'
953
+ }
954
+
955
+ // 删除按钮size
956
+ delBtnSize: {
957
+ type: String,
958
+ default: 'small'
959
+ }
960
+
961
+ // 删除按钮的ghost
962
+ delBtnGhost: {
963
+ type: Boolean,
964
+ default: true
965
+ }
966
+
967
+ // 传给删除按钮的prop
968
+ delBtn: Object
969
+
970
+ // 新增按钮文本
971
+ addText: String
972
+
973
+ // 是否隐藏每行的删除按钮,通过函数返回值决定
974
+ hideDelBtn: Function
975
+
976
+ // 是否禁用每行删除按钮,通过函数返回值决定
977
+ delBtnDisabled: {
978
+ type: Function,
979
+ default() {
980
+ return false
981
+ }
982
+ }
983
+ ```
984
+
985
+ **emits**
986
+
987
+ ```js
988
+ /**
989
+ * 新增后触发
990
+ * @param row 新增的行
991
+ */
992
+ emit('add', row)
993
+
994
+ /**
995
+ * 删除后触发
996
+ * @param row 删除的行
997
+ */
998
+ emit('remove', row)
999
+
1000
+ /**
1001
+ * 增加或删除后触发
1002
+ * @param isAdd 是否新增了数据
1003
+ */
1004
+ emit('change', isAdd)
1005
+ ```
1006
+
1007
+ **slots**
1008
+
1009
+ ```js
1010
+ // 传给Table的动态slot,需要列配置中指定slot
1011
+ e.g.
1012
+ [
1013
+ {
1014
+ title: '名称',
1015
+ key: 'name',
1016
+ slot: 'name'
1017
+ }
1018
+ ]
1019
+ 则可使用 <template #name="{row, index}"></template>
1020
+
1021
+ /**
1022
+ * 每行删除按钮旁的更多内容
1023
+ * @param row 行
1024
+ * @param index
1025
+ */
1026
+ moreAction({ row, index })
1027
+ ```
1028
+
1029
+ #### DateRange
1030
+
1031
+ 组合形式的日期范围组件
1032
+
1033
+ ```html
1034
+ <template>
1035
+ <DateRange
1036
+ v-model:begin="beginDate"
1037
+ v-model:end="endDate"
1038
+ clearable
1039
+ style="width: 240px"></DateRange>
1040
+ </template>
1041
+ <script setup>
1042
+ import { ref } from 'vue'
1043
+
1044
+ const beginDate = ref(''),
1045
+ endDate = ref('')
1046
+ </script>
1047
+ ```
1048
+
1049
+ **props**
1050
+
1051
+ ```js
1052
+ // v-model:begin双向绑定开始时间
1053
+ begin: {
1054
+ type: [Date, String],
1055
+ default: ''
1056
+ }
1057
+
1058
+ // v-model:end双向绑定结束时间
1059
+ end: {
1060
+ type: [Date, String],
1061
+ default: ''
1062
+ }
1063
+
1064
+ // 可选的日期类型:date | month | year | datetime
1065
+ type: {
1066
+ type: String,
1067
+ default: 'date'
1068
+ }
1069
+
1070
+ // 禁用开始时间
1071
+ beginDisabled: Boolean
1072
+
1073
+ // 禁用结束时间
1074
+ endDisabled: Boolean
1075
+
1076
+ // 是否当所选开始日期大于结束日期时自动将结束日期置为开始日期后一天
1077
+ autoNext: {
1078
+ type: Boolean,
1079
+ default: true
1080
+ }
1081
+
1082
+ // 是否默认限制开始时间
1083
+ limitBegin: {
1084
+ type: Boolean,
1085
+ default: true
1086
+ }
1087
+
1088
+ // 开始组件的class
1089
+ beginClass: [String, Array, Object]
1090
+
1091
+ // 结束组件的class
1092
+ endClass: [String, Array, Object]
1093
+
1094
+ // 开始时间placeholder
1095
+ beginHolder: String
1096
+
1097
+ // 结束时间placeholder
1098
+ endHolder: String
1099
+
1100
+ // 一次性传给开始组件的prop
1101
+ beginAttr: Object
1102
+
1103
+ // 一次性传给结束组件的prop
1104
+ endAttr: Object
1105
+
1106
+ // 中间连接符的class
1107
+ joinerClass: [String, Object]
1108
+
1109
+ // 是否禁止选择当天
1110
+ disableToday: Boolean
1111
+
1112
+ // 是否隐藏连接符
1113
+ hideJoiner: Boolean
1114
+
1115
+ // iview DatePicer的日期格式
1116
+ format: String
1117
+
1118
+ // 以下为DatePicker的同名prop
1119
+ clearable: Boolean
1120
+ disabled: Boolean
1121
+ transfer: Boolean
1122
+ ```
1123
+
1124
+ **emits**
1125
+
1126
+ ```js
1127
+ /**
1128
+ * 更改开始时间时触发
1129
+ * @param begin 开始时间
1130
+ */
1131
+ emit('change-begin', begin)
1132
+
1133
+ /**
1134
+ * 更改结束时间时触发
1135
+ * @param end 结束时间
1136
+ */
1137
+ emit('change-end', end)
1138
+
1139
+ /**
1140
+ * 更改时间时触发
1141
+ * @param begin 开始时间
1142
+ * @param end 结束时间
1143
+ * @param isEnd 是否修改的结束时间
1144
+ */
1145
+ emit('change', begin, end, isEnd)
1146
+ ```
1147
+
1148
+ #### DateRangePicker
1149
+
1150
+ 基于DatePicer[type=daterange],绑定的值转为string
1151
+
1152
+ ```html
1153
+ <template>
1154
+ <DateRangePicker v-model:begin="rangeBegin" v-model:end="rangeEnd"></DateRangePicker>
1155
+ </template>
1156
+ <script setup>
1157
+ import { ref } from 'vue'
1158
+
1159
+ const rangeBegin = ref(''),
1160
+ rangeEnd = ref('')
1161
+ </script>
1162
+ ```
1163
+
1164
+ **props**
1165
+
1166
+ ```js
1167
+ // v-model:begin双向绑定开始时间
1168
+ begin: {
1169
+ type: [Date, String],
1170
+ default: ''
1171
+ }
1172
+
1173
+ // v-model:end双向绑定结束时间
1174
+ end: {
1175
+ type: [Date, String],
1176
+ default: ''
1177
+ }
1178
+ // 可选的日期类型:daterange | datetimerange
1179
+ type: {
1180
+ type: String,
1181
+ default: 'daterange'
1182
+ }
1183
+
1184
+ // 是否默认限制开始时间
1185
+ limitBegin: {
1186
+ type: Boolean,
1187
+ default: true
1188
+ }
1189
+
1190
+ // 是否禁止选择今天
1191
+ disableToday: Boolean
1192
+
1193
+ // 用于格式化绑定时间,默认 YYYY-MM-DD
1194
+ valueFormat: {
1195
+ type: String,
1196
+ default: 'YYYY-MM-DD'
1197
+ }
1198
+
1199
+ // 以下为DatePicker的同名prop
1200
+ options: Object,
1201
+ clearable: {
1202
+ type: Boolean,
1203
+ default: true
1204
+ },
1205
+ splitPanels: Boolean,
1206
+ transfer: Boolean,
1207
+ placeholder: String,
1208
+ disabled: Boolean,
1209
+ placement: String,
1210
+ ```
1211
+
1212
+ **emits**
1213
+
1214
+ ```js
1215
+ /**
1216
+ * 修改时触发
1217
+ * @param dates 开始结束时间组成的数组
1218
+ * @param type 当前日期类型 daterange | datetimerange
1219
+ */
1220
+ emit('change', dates, type)
1221
+ ```
1222
+
1223
+ #### MCalendar
1224
+
1225
+ 月度日历组件
1226
+
1227
+ ```html
1228
+ <template>
1229
+ <MCalendar v-model:range="calendar.range" :date="calendar.date" has-range>
1230
+ <template #cell="{ day }"> <Badge status="success"></Badge>{{ day._text }} </template>
1231
+ </MCalendar>
1232
+ </template>
1233
+ <script setup>
1234
+ import { shallowReactive } from 'vue'
1235
+
1236
+ const caledar = shallowReactive({
1237
+ range: [
1238
+ { _date: new Date(Date.now() - 86400000 * 7) },
1239
+ { _date: new Date(Date.now() - 86400000) }
1240
+ ],
1241
+ date: new Date('2000-01-01')
1242
+ })
1243
+ </script>
1244
+ ```
1245
+
1246
+ **props**
1247
+
1248
+ ```js
1249
+ // 指定日期,默认显示该日期所在月份
1250
+ date: Date
1251
+ /**
1252
+ * 传入的额外日期数据
1253
+ * 组件始终展示一段日期,但业务上有时需要根据返回的一组日期进行渲染,如 [{date:'2000-01-01',xxx:false},{date:'2000-01-02',xxx:true}]
1254
+ */
1255
+ dates: Array
1256
+
1257
+ // 周起始日,默认星期一
1258
+ startDay: {
1259
+ type: Number,
1260
+ default: 1
1261
+ }
1262
+
1263
+ /**
1264
+ * 休息日,默认周六周日
1265
+ * @example [5,6] 休息日变为周五周六
1266
+ */
1267
+ offDay: {
1268
+ type: Array,
1269
+ default: () => [6, 0]
1270
+ }
1271
+
1272
+ // 传入dates里日期值对应的key,默认“date”
1273
+ dateKey: {
1274
+ type: String,
1275
+ default: 'date'
1276
+ }
1277
+
1278
+ // 单元格标题class
1279
+ titleClass: Function
1280
+
1281
+ // 每一天单元格class
1282
+ dateClass: Function
1283
+
1284
+ // 加载状态
1285
+ loading: Boolean
1286
+
1287
+ // 单元格日期[格式](https://day.js.org/docs/en/display/format),默认 YYYY-MM-DD
1288
+ textFormat: {
1289
+ type: String,
1290
+ default: 'YYYY-MM-DD'
1291
+ }
1292
+
1293
+ // 是否将指定date放在第一行,而不是按传统模式将每月1号放在第一行,此时可能不会显示完整的单一月份
1294
+ isOnFirstLine: Boolean
1295
+
1296
+ // 是否开启范围选择
1297
+ hasRange: Boolean
1298
+
1299
+ // 非当前有效时间范围内的日期是否可被选入范围
1300
+ outerInRange: Boolean
1301
+
1302
+ // 选择一个范围后,再选择时是否先将已选范围清除,即是否可清除已选范围
1303
+ clearable: {
1304
+ type: Boolean,
1305
+ default: true
1306
+ }
1307
+
1308
+ /**
1309
+ * 已选范围
1310
+ * @example [{_date: '2020-01-01'}, {_date: new Date('2020-01-10')}]
1311
+ */
1312
+ range: Array
1313
+
1314
+ /**
1315
+ * 周标题内容类型,可选mini、short、long
1316
+ * @example
1317
+ * weekType=mini 对应显示成 一、二、三。。。
1318
+ * weekType=short对应显示成 周一、周二、周三。。。
1319
+ * weekType=long 对应显示成 星期一、星期二、星期三。。。
1320
+ */
1321
+ weekType: {
1322
+ type: String,
1323
+ default: 'mini'
1324
+ }
1325
+
1326
+ /**
1327
+ * 周一到周日对应的映射,若传入有效对象则以该对象的key显示星期标题
1328
+ * @example
1329
+ * 周六周日标题会分别显示成 “星期6” 和 “星期天”,忽略对应的翻译文本
1330
+ * :weekMap={0: '星期天', 6: '星期6'} *
1331
+ */
1332
+ weekMap: Object
1333
+ ```
1334
+
1335
+ **emits**
1336
+
1337
+ ```js
1338
+ /**
1339
+ * 点击日期单元格触发
1340
+ * @param item 点中日期单元
1341
+ * @param index
1342
+ */
1343
+ emit('click-day', item, index)
1344
+
1345
+ /**
1346
+ * 选择范围后触发
1347
+ * @param begin:范围开始,end:范围结束
1348
+ * @param ranged 包含起止范围的所有日期
1349
+ */
1350
+ emit('select-range', [begin, end], ranged)
1351
+
1352
+ /**
1353
+ * 双击日期单元格触发
1354
+ * @param item 点中日期单元
1355
+ * @param index
1356
+ */
1357
+ emit('dblclick-day', item, index)
1358
+ ```
1359
+
1360
+ **slots**
1361
+
1362
+ ```js
1363
+ /**
1364
+ * 单元格内容
1365
+ * @param item 单个日期
1366
+ * @param index
1367
+ */
1368
+ cell({ item, index })
1369
+ ```
1370
+
1371
+ #### ModalFooter
1372
+
1373
+ 代替Modal自带的底栏部分,按钮易于控制,自定义度更高
1374
+
1375
+ ```jsx
1376
+ <template>
1377
+ <Button @click="modal.show = true">show Modal</Button>
1378
+ <Modal v-model="modal.show" title="modal footer">
1379
+ <h1>modal content</h1>
1380
+ <template #footer>
1381
+ <ModalFooter
1382
+ v-model="modal.show"
1383
+ :ok-loading="modal.loading"
1384
+ @ok="confirm"
1385
+ @cancel="cancel"></ModalFooter>
1386
+ </template>
1387
+ </Modal>
1388
+ </template>
1389
+ <script setup>
1390
+ import { reactive } from 'vue'
1391
+
1392
+ const modal = reactive({
1393
+ show: false,
1394
+ loading: false
1395
+ }),
1396
+ confirm = () => {
1397
+ modal.loading = true
1398
+ setTimeout(() => {
1399
+ modal.show = false
1400
+ setTimeout(() => {
1401
+ modal.loading = false
1402
+ }, 200)
1403
+ }, 2000)
1404
+ },
1405
+ cancel = () => {
1406
+ alert('cancel')
1407
+ modal.show = false
1408
+ }
1409
+ </script>
1410
+ ```
1411
+
1412
+ **props**
1413
+
1414
+ ```js
1415
+ // 双向绑定Modal的modelValue
1416
+ modelValue: Boolean
1417
+
1418
+ // 确定按钮文本
1419
+ okText: String
1420
+
1421
+ // 确定按钮禁用状态
1422
+ okDisabled: Boolean
1423
+
1424
+ // 确定按钮加载状态
1425
+ okLoading: Boolean
1426
+
1427
+ // 传递给确定按钮的props
1428
+ ok: Object
1429
+
1430
+ // 取消按钮文本
1431
+ cancelText: String
1432
+
1433
+ // 取消按钮加载状态
1434
+ cancelLoading: Boolean
1435
+
1436
+ // 取消按钮禁用状态
1437
+ cancelDisabled: Boolean
1438
+
1439
+ // 传递给取消按钮的props
1440
+ cancel: Object
1441
+
1442
+ // 取消按钮type,默认 text
1443
+ cancelType: {
1444
+ type: String,
1445
+ default: 'text'
1446
+ }
1447
+
1448
+ // 是否把取消按钮放到确定按钮右边
1449
+ rightCancel: Boolean
1450
+
1451
+ // 是否显示确定按钮
1452
+ hasOk: {
1453
+ type: Boolean,
1454
+ default: true
1455
+ }
1456
+ ```
1457
+
1458
+ **emits**
1459
+
1460
+ ```js
1461
+ // 点击确定按钮触发
1462
+ emit('ok')
1463
+
1464
+ // 点击取消按钮触发。未监听该事件时会直接关闭Modal
1465
+ emit('cancel')
1466
+ ```
1467
+
1468
+ **slots**
1469
+
1470
+ ```js
1471
+ // 显示在右下角按钮旁边的内容
1472
+ other()
1473
+ // 显示在底栏左侧的内容
1474
+ action()
1475
+ ```
1476
+
1477
+ #### PageTable
1478
+
1479
+ 远程分页/本地分页的Table
1480
+
1481
+ ```html
1482
+ <template>
1483
+ <Button :loading="pageTable.loading" @click="search">查询</Button>
1484
+ <PageTable
1485
+ ref="pageTableRef"
1486
+ v-model:selection="pageTable.selection"
1487
+ v-model:loading="pageTable.loading"
1488
+ :columns="pageTable.columns"
1489
+ :method="getList"
1490
+ data-key="ress"
1491
+ total-key="total"
1492
+ :max-height="400"
1493
+ show-header
1494
+ border
1495
+ stripe>
1496
+ <template #num="{ column }">{{ column.title }}</template>
1497
+ </PageTable>
1498
+ </template>
1499
+ <script setup>
1500
+ import { shallowReactive, useTemplateRef } from 'vue'
1501
+
1502
+ const refPageTable = useTemplateRef('pageTableRef')
1503
+ const pageTable = shallowReactive({
1504
+ loading: false,
1505
+ selection: [],
1506
+ columns: [
1507
+ {
1508
+ title: 'num',
1509
+ key: 'num'
1510
+ },
1511
+ {
1512
+ title: 'date',
1513
+ key: 'date'
1514
+ },
1515
+ {
1516
+ title: 'time',
1517
+ key: 'time'
1518
+ }
1519
+ ]
1520
+ })
1521
+ function search() {
1522
+ refPageTable.value.search()
1523
+ }
1524
+ function getList() {
1525
+ return new Promise((resolve) => {
1526
+ setTimeout(() => {
1527
+ resolve({
1528
+ ress: new Array(30).fill(0).map((e, i) => ({ num: i, date: '1010', time: '----' })),
1529
+ total: 30
1530
+ })
1531
+ })
1532
+ })
1533
+ }
1534
+ </script>
1535
+ ```
1536
+
1537
+ **props**
1538
+ 除以下prop,可传递Table的其它prop
1539
+
1540
+ ```js
1541
+ // Table的columns
1542
+ columns: {
1543
+ type: Array,
1544
+ default: () => []
1545
+ }
1546
+
1547
+ // v-model绑定Table的data
1548
+ modelValue: {
1549
+ type: Array as PropType<Obj[]>,
1550
+ default: () => []
1551
+ }
1552
+
1553
+ /**
1554
+ * 远程请求方法
1555
+ * @example
1556
+ * const getResult = () => axios.get('').then(res => res.data)
1557
+ * <PageTable :method="getResult" />
1558
+ */
1559
+ method: Function
1560
+
1561
+ // 调用 method 时传入的参数或者返回参数的函数
1562
+ param: [Object, Function]
1563
+
1564
+ /**
1565
+ * 返回值中对应的列表数据key
1566
+ * @example 如返回结构是 { result: [1,2,3], total: 100 },则dataKey='result'
1567
+ */
1568
+ dataKey: String
1569
+
1570
+ /**
1571
+ * 返回值中对应的分页总条数key *
1572
+ * @example 如返回结构是 { result: [1,2,3], total: 100 },则totalKey='total'
1573
+ */
1574
+ totalKey: String
1575
+
1576
+ /**
1577
+ * 请求时传递的分页参数中 first 对应 key
1578
+ * 后端分页一般要求指定起始数据索引或者“页码”,以及获取多少条数据
1579
+ * @example
1580
+ * 如后端接口给定的分页参数是 firstIndex 对应起始索引
1581
+ * pageKey='firstIndex'
1582
+ */
1583
+ pageKey: String
1584
+
1585
+ /**
1586
+ * 请求时传递的分页参数中 size 对应 key
1587
+ * 后端分页一般要求指定起始数据索引或者“页码”,以及获取多少条数据
1588
+ * @example
1589
+ * 如后端接口给定的分页参数是 amount 对应需要获取的条数
1590
+ * sizeKey='amount'
1591
+ */
1592
+ sizeKey: String
1593
+
1594
+ // 对象形式传递分页参数映射
1595
+ pageMap: {
1596
+ type: Object,
1597
+ default(props) {
1598
+ return {
1599
+ first: props.pageKey,
1600
+ pageSize: props.sizeKey
1601
+ }
1602
+ }
1603
+ }
1604
+
1605
+ // 处理接口返回列表数据的函数
1606
+ process: Function
1607
+
1608
+ // 自动设置Table的maxHeight
1609
+ autoMaxHeight: {
1610
+ type: Boolean,
1611
+ default: true
1612
+ }
1613
+
1614
+ // 是否本地分页
1615
+ isLocal: Boolean
1616
+
1617
+ // 分页条数选项
1618
+ pageSizeOpts: {
1619
+ type: Array,
1620
+ default: () => [30, 50, 100, 200]
1621
+ }
1622
+
1623
+ // 查询失败时不清除之前获取到的结果
1624
+ autoRemain: Boolean
1625
+
1626
+ /**
1627
+ * 计算Table的maxHeight时,Table距离视口底部的距离
1628
+ * @default 80
1629
+ */
1630
+ bottomDis: {
1631
+ type: [Number, String],
1632
+ default: 80
1633
+ }
1634
+
1635
+ // Table的maxHeight
1636
+ maxHeight: [Number, String]
1637
+
1638
+ border: Boolean
1639
+
1640
+ // v-model:selection获取勾选项
1641
+ selection: Array
1642
+
1643
+ // 初始分页条数
1644
+ initSize: Number
1645
+
1646
+ // 远程查询时额外检测的方法,返回Falsy则不进行搜索
1647
+ check: Function
1648
+
1649
+ // 查询时是否用页码而不是用当页第一条的索引
1650
+ usePageNum: Boolean
1651
+
1652
+ // 是否点击行即更改Checkbox状态
1653
+ clickToCheck: Boolean
1654
+
1655
+ // 获取的勾选项是否去除_checked等内部属性
1656
+ pure: Boolean
1657
+
1658
+ // head title
1659
+ title: String
1660
+
1661
+ // 是否显示带有功能项的header
1662
+ showHeader: Boolean
1663
+
1664
+ // 内部使用的Tooltip等iview组件的transfer
1665
+ transfer: {
1666
+ type: Boolean,
1667
+ default: true
1668
+ }
1669
+
1670
+ // 最大化时是否全屏
1671
+ fullscreen: Boolean
1672
+
1673
+ // 传至ToggleColumn组件的storeAt
1674
+ storeAt: String
1675
+ ```
1676
+
1677
+ **emits**
1678
+ 除以下事件,可监听Table的其它事件
1679
+
1680
+ ```js
1681
+ /**
1682
+ * 成功加载列表后触发
1683
+ * @param res 获取到的结果
1684
+ */
1685
+ emit('load', res)
1686
+
1687
+ /**
1688
+ * 勾选项变更后触发
1689
+ * @param selections 勾选项
1690
+ */
1691
+ emit('select-rows', selections)
1692
+
1693
+ /**
1694
+ * 更改全选框后触发
1695
+ * @param selections 勾选项
1696
+ */
1697
+ emit('select-all', selections)
1698
+
1699
+ /**
1700
+ * 更改单个选项框触发
1701
+ * @param row 单个勾选项
1702
+ * @param checked 选中状态
1703
+ */
1704
+ emit('select', row, checked)
1705
+
1706
+ /**
1707
+ * 内部组件切换列后触发
1708
+ * @param checked 切换的列
1709
+ */
1710
+ emit('change-col', checked)
1711
+ ```
1712
+
1713
+ **slots**
1714
+
1715
+ ```js
1716
+ // 左上角的标题
1717
+ title()
1718
+ // 右上角功能区
1719
+ headerAction()
1720
+ // Table的header
1721
+ header()
1722
+ // Table的footer
1723
+ footer()
1724
+
1725
+ // 传给Table的动态slot,需要列配置中指定slot
1726
+ e.g.
1727
+ [
1728
+ {
1729
+ title: '名称',
1730
+ key: 'name',
1731
+ slot: 'name'
1732
+ }
1733
+ ]
1734
+ 则可使用 <template #name="{row, index}"></template>
1735
+ ```
1736
+
1737
+ #### ToggleColumn
1738
+
1739
+ 用于切换Table列的显示状态
1740
+
1741
+ ```jsx
1742
+ <template>
1743
+ <ToggleColumn v-model="table.columns"></ToggleColumn>
1744
+ <Table :columns="table.columns" :data="table.list"></Table>
1745
+ </template>
1746
+ <script setup>
1747
+ import { reactive } from 'vue'
1748
+
1749
+ const table = reactive({
1750
+ list: [
1751
+ {
1752
+ year: 2000,
1753
+ date: '2000-01-01'
1754
+ },
1755
+ {
1756
+ year: 1000,
1757
+ date: '1000-01-01'
1758
+ }
1759
+ ],
1760
+ columns: [
1761
+ {
1762
+ type: 'selection',
1763
+ key: 'selection',
1764
+ width: 60,
1765
+ _switchable: false // 让该列不可被切换
1766
+ },
1767
+ {
1768
+ title: 'year',
1769
+ key: 'year'
1770
+ },
1771
+ {
1772
+ title: 'date',
1773
+ key: 'date'
1774
+ }
1775
+ ]
1776
+ })
1777
+ </script>
1778
+ ```
1779
+
1780
+ **props**
1781
+
1782
+ ```js
1783
+ // v-model双向绑定Table列
1784
+ modelValue: {
1785
+ type: Array
1786
+ }
1787
+
1788
+ // 全选框文本
1789
+ title: String
1790
+
1791
+ // 传入iview icon名则仅显示图标
1792
+ icon: String
1793
+
1794
+ // 绑定columns对应的唯一标识,一般在v-for中绑定了固定某列且列配置中带有 _visible:false 时用到
1795
+ cacheId: [String, Number]
1796
+
1797
+ // 是否显示全选框
1798
+ all: {
1799
+ type: Boolean,
1800
+ default: true
1801
+ }
1802
+
1803
+ // Dropdown的transfer
1804
+ transfer: Boolean
1805
+
1806
+ /**
1807
+ * 将状态缓存至localStorage中的key,支持a.b形式
1808
+ * @example
1809
+ * // 组件会尝试将显示状态读写至 localStorage.app.main.cols
1810
+ * storeAt='app.main.cols'
1811
+ */
1812
+ storeAt: String
1813
+ ```
1814
+
1815
+ **emits**
1816
+
1817
+ ```js
1818
+ /**
1819
+ * 切换列状态时触发
1820
+ * @param value 切换的列
1821
+ */
1822
+ emit('change', value)
1823
+ ```
1824
+
1825
+ **slots**
1826
+
1827
+ ```js
1828
+ // 替换默认显示的Button
1829
+ default()
1830
+ ```
1831
+
1832
+ ## License
1833
+
1834
+ MIT