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