@10yun/cv-mobile-ui 0.4.1 → 0.4.2

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.
Files changed (112) hide show
  1. package/package.json +1 -1
  2. package/ui-cv/cv-badge/{uni-badge.vue → cv-badge.vue} +2 -2
  3. package/ui-cv/cv-calendar/calendar.js +762 -345
  4. package/ui-cv/cv-calendar/cv-calendar-item.vue +198 -0
  5. package/ui-cv/cv-calendar/cv-calendar.vue +508 -0
  6. package/ui-cv/cv-card/cv-card.vue +427 -0
  7. package/ui-cv/cv-col/cv-col.vue +2965 -0
  8. package/ui-cv/cv-collapse/cv-collapse.vue +146 -0
  9. package/ui-cv/cv-collapse-item/cv-collapse-item.vue +395 -0
  10. package/ui-cv/cv-combox/cv-combox.vue +250 -0
  11. package/ui-cv/cv-countdown/cv-countdown.vue +245 -0
  12. package/ui-cv/cv-data-checkbox/cv-data-checkbox.vue +841 -0
  13. package/ui-cv/cv-data-indexed-list/cv-data-indexed-list-item.vue +154 -0
  14. package/ui-cv/cv-data-indexed-list/cv-data-indexed-list.vue +376 -0
  15. package/ui-cv/cv-data-picker/cv-data-picker.vue +486 -0
  16. package/ui-cv/cv-data-pickerview/{uni-data-picker.js → cv-data-picker.js} +0 -0
  17. package/ui-cv/cv-data-pickerview/cv-data-pickerview.vue +304 -0
  18. package/ui-cv/cv-dateformat/cv-dateformat.vue +86 -0
  19. package/ui-cv/cv-datetime-picker/calendar.vue +752 -738
  20. package/ui-cv/cv-datetime-picker/cv-datetime-picker.vue +958 -0
  21. package/ui-cv/cv-datetime-picker/time-picker.vue +900 -892
  22. package/ui-cv/cv-easyinput/cv-easyinput.vue +514 -0
  23. package/ui-cv/cv-fab/cv-fab.vue +465 -0
  24. package/ui-cv/cv-fab/{uni-fab.vue.bak → cv-fab.vue.bak} +2 -2
  25. package/ui-cv/cv-fav/cv-fav.vue +150 -0
  26. package/ui-cv/cv-file-picker/cv-file-picker.vue +619 -0
  27. package/ui-cv/cv-form-item/cv-form-item.vue +1 -1
  28. package/ui-cv/cv-goods-nav/{uni-goods-nav.vue → cv-goods-nav.vue} +1 -1
  29. package/ui-cv/{cv-icons2/cv-icons2.vue → cv-icon2/cv-icon2.vue} +3 -3
  30. package/ui-cv/{cv-icons2 → cv-icon2}/icons.js +0 -0
  31. package/ui-cv/{cv-icons2 → cv-icon2}/uni.ttf +0 -0
  32. package/ui-cv/cv-indexed-list/cv-indexed-list-item.vue +154 -0
  33. package/ui-cv/cv-indexed-list/cv-indexed-list.vue +371 -0
  34. package/ui-cv/cv-input-password/cv-input-password.vue +2 -2
  35. package/ui-cv/{cv-link/uni-link.vue → cv-link2/cv-link2.vue} +1 -1
  36. package/ui-cv/cv-list/cv-list.vue +107 -0
  37. package/ui-cv/cv-list/cv-refresh.vue +65 -0
  38. package/ui-cv/cv-list-ad/cv-list-ad.vue +113 -0
  39. package/ui-cv/cv-list-chat/{uni-list-chat.scss → cv-list-chat.scss} +0 -0
  40. package/ui-cv/cv-list-chat/{uni-list-chat.vue → cv-list-chat.vue} +0 -0
  41. package/ui-cv/cv-list-item/cv-list-item.vue +449 -0
  42. package/ui-cv/cv-nav-bar/cv-nav-bar.vue +256 -0
  43. package/ui-cv/cv-nav-bar/{uni-status-bar.vue → cv-status-bar.vue} +0 -0
  44. package/ui-cv/cv-notice-bar/cv-notice-bar.vue +453 -0
  45. package/ui-cv/cv-number-box/cv-number-box.vue +223 -0
  46. package/ui-cv/cv-pagination/cv-pagination.vue +397 -0
  47. package/ui-cv/cv-popup/cv-popup.vue +429 -0
  48. package/ui-cv/cv-popup-dialog/{uni-popup-dialog.vue → cv-popup-dialog.vue} +0 -0
  49. package/ui-cv/cv-popup-message/cv-popup-message.vue +143 -0
  50. package/ui-cv/cv-popup-share/{uni-popup-share.vue → cv-popup-share.vue} +0 -0
  51. package/ui-cv/cv-row/{uni-row.vue → cv-row.vue} +1 -1
  52. package/ui-cv/cv-search-bar/cv-search-bar.vue +280 -0
  53. package/ui-cv/cv-section/{uni-section.vue → cv-section.vue} +0 -0
  54. package/ui-cv/cv-segmented-control/{uni-segmented-control.vue → cv-segmented-control.vue} +0 -0
  55. package/ui-cv/cv-status-bar/{uni-status-bar.vue → cv-status-bar.vue} +0 -0
  56. package/ui-cv/cv-steps/cv-steps.vue +293 -0
  57. package/ui-cv/cv-swipe-action/{uni-swipe-action.vue → cv-swipe-action.vue} +0 -0
  58. package/ui-cv/cv-swipe-action-item/{uni-swipe-action-item.vue → cv-swipe-action-item.vue} +0 -0
  59. package/ui-cv/cv-swiper-dot/cv-swiper-dot.vue +255 -0
  60. package/ui-cv/cv-table/cv-table.vue +460 -0
  61. package/ui-cv/cv-tag/cv-tag.vue +276 -0
  62. package/ui-cv/cv-tbody/cv-tbody.vue +28 -0
  63. package/ui-cv/cv-td/cv-td.vue +93 -0
  64. package/ui-cv/cv-test/{uni-test.vue → cv-test.vue} +0 -0
  65. package/ui-cv/cv-th/cv-th.vue +270 -0
  66. package/ui-cv/cv-thead/cv-thead.vue +114 -0
  67. package/ui-cv/cv-title/cv-title.vue +168 -0
  68. package/ui-cv/cv-tr/cv-tr.vue +166 -0
  69. package/ui-cv/cv-transition/cv-transition.vue +279 -0
  70. package/ui-cv/cv-calendar/uni-calendar-item.vue +0 -171
  71. package/ui-cv/cv-calendar/uni-calendar.vue +0 -504
  72. package/ui-cv/cv-card/uni-card.vue +0 -420
  73. package/ui-cv/cv-col/uni-col.vue +0 -2968
  74. package/ui-cv/cv-collapse/uni-collapse.vue +0 -146
  75. package/ui-cv/cv-collapse-item/uni-collapse-item.vue +0 -378
  76. package/ui-cv/cv-combox/uni-combox.vue +0 -237
  77. package/ui-cv/cv-countdown/uni-countdown.vue +0 -234
  78. package/ui-cv/cv-data-checkbox/uni-data-checkbox.vue +0 -792
  79. package/ui-cv/cv-data-indexed-list/uni-data-indexed-list-item.vue +0 -142
  80. package/ui-cv/cv-data-indexed-list/uni-data-indexed-list.vue +0 -364
  81. package/ui-cv/cv-data-picker/uni-data-picker.vue +0 -468
  82. package/ui-cv/cv-data-pickerview/uni-data-pickerview.vue +0 -298
  83. package/ui-cv/cv-dateformat/uni-dateformat.vue +0 -88
  84. package/ui-cv/cv-datetime-picker/uni-datetime-picker.vue +0 -874
  85. package/ui-cv/cv-easyinput/uni-easyinput.vue +0 -438
  86. package/ui-cv/cv-fab/uni-fab.vue +0 -443
  87. package/ui-cv/cv-fav/uni-fav.vue +0 -136
  88. package/ui-cv/cv-file-picker/uni-file-picker.vue +0 -614
  89. package/ui-cv/cv-indexed-list/uni-indexed-list-item.vue +0 -142
  90. package/ui-cv/cv-indexed-list/uni-indexed-list.vue +0 -357
  91. package/ui-cv/cv-list/uni-list.vue +0 -107
  92. package/ui-cv/cv-list/uni-refresh.vue +0 -65
  93. package/ui-cv/cv-list-ad/uni-list-ad.vue +0 -106
  94. package/ui-cv/cv-list-item/uni-list-item.vue +0 -428
  95. package/ui-cv/cv-nav-bar/uni-nav-bar.vue +0 -244
  96. package/ui-cv/cv-notice-bar/uni-notice-bar.vue +0 -394
  97. package/ui-cv/cv-number-box/uni-number-box.vue +0 -224
  98. package/ui-cv/cv-pagination/uni-pagination.vue +0 -376
  99. package/ui-cv/cv-popup/uni-popup.vue +0 -412
  100. package/ui-cv/cv-popup-message/uni-popup-message.vue +0 -143
  101. package/ui-cv/cv-search-bar/uni-search-bar.vue +0 -262
  102. package/ui-cv/cv-steps/uni-steps.vue +0 -250
  103. package/ui-cv/cv-swiper-dot/uni-swiper-dot.vue +0 -205
  104. package/ui-cv/cv-table/uni-table.vue +0 -455
  105. package/ui-cv/cv-tag/uni-tag.vue +0 -283
  106. package/ui-cv/cv-tbody/uni-tbody.vue +0 -30
  107. package/ui-cv/cv-td/uni-td.vue +0 -88
  108. package/ui-cv/cv-th/uni-th.vue +0 -259
  109. package/ui-cv/cv-thead/uni-thead.vue +0 -114
  110. package/ui-cv/cv-title/uni-title.vue +0 -171
  111. package/ui-cv/cv-tr/uni-tr.vue +0 -156
  112. package/ui-cv/cv-transition/uni-transition.vue +0 -287
@@ -0,0 +1,255 @@
1
+ <template>
2
+ <view class="uni-swiper__warp">
3
+ <slot />
4
+ <view v-if="mode === 'default'" :style="{ bottom: dots.bottom + 'px' }" class="uni-swiper__dots-box" key="default">
5
+ <view
6
+ v-for="(item, index) in info"
7
+ @click="clickItem(index)"
8
+ :style="{
9
+ width: (index === current ? dots.width * 2 : dots.width) + 'px',
10
+ height: dots.width / 3 + 'px',
11
+ 'background-color': index !== current ? dots.backgroundColor : dots.selectedBackgroundColor,
12
+ 'border-radius': '0px'
13
+ }"
14
+ :key="index"
15
+ class="uni-swiper__dots-item uni-swiper__dots-bar"
16
+ />
17
+ </view>
18
+ <view v-if="mode === 'dot'" :style="{ bottom: dots.bottom + 'px' }" class="uni-swiper__dots-box" key="dot">
19
+ <view
20
+ v-for="(item, index) in info"
21
+ @click="clickItem(index)"
22
+ :style="{
23
+ width: dots.width + 'px',
24
+ height: dots.height + 'px',
25
+ 'background-color': index !== current ? dots.backgroundColor : dots.selectedBackgroundColor,
26
+ border: index !== current ? dots.border : dots.selectedBorder
27
+ }"
28
+ :key="index"
29
+ class="uni-swiper__dots-item"
30
+ />
31
+ </view>
32
+ <view v-if="mode === 'round'" :style="{ bottom: dots.bottom + 'px' }" class="uni-swiper__dots-box" key="round">
33
+ <view
34
+ v-for="(item, index) in info"
35
+ @click="clickItem(index)"
36
+ :class="[index === current && 'uni-swiper__dots-long']"
37
+ :style="{
38
+ width: (index === current ? dots.width * 3 : dots.width) + 'px',
39
+ height: dots.height + 'px',
40
+ 'background-color': index !== current ? dots.backgroundColor : dots.selectedBackgroundColor,
41
+ border: index !== current ? dots.border : dots.selectedBorder
42
+ }"
43
+ :key="index"
44
+ class="uni-swiper__dots-item"
45
+ />
46
+ </view>
47
+ <view
48
+ v-if="mode === 'nav'"
49
+ key="nav"
50
+ :style="{ 'background-color': dotsStyles.backgroundColor, bottom: '0' }"
51
+ class="uni-swiper__dots-box uni-swiper__dots-nav"
52
+ >
53
+ <text :style="{ color: dotsStyles.color }" class="uni-swiper__dots-nav-item">
54
+ {{ current + 1 + '/' + info.length + ' ' + info[current][field] }}
55
+ </text>
56
+ </view>
57
+ <view v-if="mode === 'indexes'" key="indexes" :style="{ bottom: dots.bottom + 'px' }" class="uni-swiper__dots-box">
58
+ <view
59
+ v-for="(item, index) in info"
60
+ @click="clickItem(index)"
61
+ :style="{
62
+ width: dots.width + 'px',
63
+ height: dots.height + 'px',
64
+ color: index === current ? dots.selectedColor : dots.color,
65
+ 'background-color': index !== current ? dots.backgroundColor : dots.selectedBackgroundColor,
66
+ border: index !== current ? dots.border : dots.selectedBorder
67
+ }"
68
+ :key="index"
69
+ class="uni-swiper__dots-item uni-swiper__dots-indexes"
70
+ >
71
+ <text class="uni-swiper__dots-indexes-text">{{ index + 1 }}</text>
72
+ </view>
73
+ </view>
74
+ </view>
75
+ </template>
76
+
77
+ <script>
78
+ /**
79
+ * SwiperDod 轮播图指示点
80
+ * @description 自定义轮播图指示点
81
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=284
82
+ * @property {Number} current 当前指示点索引,必须是通过 `swiper` 的 `change` 事件获取到的 `e.detail.current`
83
+ * @property {String} mode = [default|round|nav|indexes] 指示点的类型
84
+ * @value defualt 默认指示点
85
+ * @value round 圆形指示点
86
+ * @value nav 条形指示点
87
+ * @value indexes 索引指示点
88
+ * @property {String} field mode 为 nav 时,显示的内容字段(mode = nav 时必填)
89
+ * @property {String} info 轮播图的数据,通过数组长度决定指示点个数
90
+ * @property {Object} dotsStyles 指示点样式
91
+ * @event {Function} clickItem 组件触发点击事件时触发,e={currentIndex}
92
+ */
93
+
94
+ export default {
95
+ name: 'UniSwiperDot',
96
+ emits: ['clickItem'],
97
+ props: {
98
+ info: {
99
+ type: Array,
100
+ default() {
101
+ return [];
102
+ }
103
+ },
104
+ current: {
105
+ type: Number,
106
+ default: 0
107
+ },
108
+ dotsStyles: {
109
+ type: Object,
110
+ default() {
111
+ return {};
112
+ }
113
+ },
114
+ // 类型 :default(默认) indexes long nav
115
+ mode: {
116
+ type: String,
117
+ default: 'default'
118
+ },
119
+ // 只在 nav 模式下生效,变量名称
120
+ field: {
121
+ type: String,
122
+ default: ''
123
+ }
124
+ },
125
+ data() {
126
+ return {
127
+ dots: {
128
+ width: 8,
129
+ height: 8,
130
+ bottom: 10,
131
+ color: '#fff',
132
+ backgroundColor: 'rgba(0, 0, 0, .3)',
133
+ border: '1px rgba(0, 0, 0, .3) solid',
134
+ selectedBackgroundColor: '#333',
135
+ selectedBorder: '1px rgba(0, 0, 0, .9) solid'
136
+ }
137
+ };
138
+ },
139
+ watch: {
140
+ dotsStyles(newVal) {
141
+ this.dots = Object.assign(this.dots, this.dotsStyles);
142
+ },
143
+ mode(newVal) {
144
+ if (newVal === 'indexes') {
145
+ this.dots.width = 20;
146
+ this.dots.height = 20;
147
+ } else {
148
+ this.dots.width = 8;
149
+ this.dots.height = 8;
150
+ }
151
+ }
152
+ },
153
+ created() {
154
+ if (this.mode === 'indexes') {
155
+ this.dots.width = 20;
156
+ this.dots.height = 20;
157
+ }
158
+ this.dots = Object.assign(this.dots, this.dotsStyles);
159
+ },
160
+ methods: {
161
+ clickItem(index) {
162
+ this.$emit('clickItem', index);
163
+ }
164
+ }
165
+ };
166
+ </script>
167
+
168
+ <style scoped>
169
+ .uni-swiper__warp {
170
+ /* #ifndef APP-NVUE */
171
+ display: flex;
172
+ /* #endif */
173
+ flex: 1;
174
+ flex-direction: column;
175
+ position: relative;
176
+ overflow: hidden;
177
+ }
178
+
179
+ .uni-swiper__dots-box {
180
+ position: absolute;
181
+ bottom: 10px;
182
+ left: 0;
183
+ right: 0;
184
+ /* #ifndef APP-NVUE */
185
+ display: flex;
186
+ /* #endif */
187
+ flex: 1;
188
+ flex-direction: row;
189
+ justify-content: center;
190
+ align-items: center;
191
+ }
192
+
193
+ .uni-swiper__dots-item {
194
+ width: 8px;
195
+ border-radius: 100px;
196
+ margin-left: 6px;
197
+ background-color: rgba(0, 0, 0, 0.4);
198
+ /* #ifndef APP-NVUE */
199
+ cursor: pointer;
200
+ /* #endif */
201
+ /* #ifdef H5 */
202
+ /* #endif */
203
+ }
204
+
205
+ .uni-swiper__dots-item:first-child {
206
+ margin: 0;
207
+ }
208
+
209
+ .uni-swiper__dots-default {
210
+ border-radius: 100px;
211
+ }
212
+
213
+ .uni-swiper__dots-long {
214
+ border-radius: 50px;
215
+ }
216
+
217
+ .uni-swiper__dots-bar {
218
+ border-radius: 50px;
219
+ }
220
+
221
+ .uni-swiper__dots-nav {
222
+ bottom: 0px;
223
+ height: 40px;
224
+ /* #ifndef APP-NVUE */
225
+ display: flex;
226
+ /* #endif */
227
+ flex: 1;
228
+ flex-direction: row;
229
+ justify-content: flex-start;
230
+ align-items: center;
231
+ background-color: rgba(0, 0, 0, 0.2);
232
+ }
233
+
234
+ .uni-swiper__dots-nav-item {
235
+ /* overflow: hidden;
236
+ text-overflow: ellipsis;
237
+ white-space: nowrap; */
238
+ font-size: 14px;
239
+ color: #fff;
240
+ margin: 0 15px;
241
+ }
242
+
243
+ .uni-swiper__dots-indexes {
244
+ /* #ifndef APP-NVUE */
245
+ display: flex;
246
+ /* #endif */
247
+ justify-content: center;
248
+ align-items: center;
249
+ }
250
+
251
+ .uni-swiper__dots-indexes-text {
252
+ color: #fff;
253
+ font-size: 12px;
254
+ }
255
+ </style>
@@ -0,0 +1,460 @@
1
+ <template>
2
+ <view class="uni-table-scroll" :class="{ 'table--border': border, 'border-none': !noData }">
3
+ <!-- #ifdef H5 -->
4
+ <table
5
+ class="uni-table"
6
+ border="0"
7
+ cellpadding="0"
8
+ cellspacing="0"
9
+ :class="{ 'table--stripe': stripe }"
10
+ :style="{ 'min-width': minWidth + 'px' }"
11
+ >
12
+ <slot></slot>
13
+ <view v-if="noData" class="uni-table-loading">
14
+ <view class="uni-table-text" :class="{ 'empty-border': border }">{{ emptyText }}</view>
15
+ </view>
16
+ <view v-if="loading" class="uni-table-mask" :class="{ 'empty-border': border }">
17
+ <div class="uni-table--loader"></div>
18
+ </view>
19
+ </table>
20
+ <!-- #endif -->
21
+ <!-- #ifndef H5 -->
22
+ <view class="uni-table" :style="{ 'min-width': minWidth + 'px' }" :class="{ 'table--stripe': stripe }">
23
+ <slot></slot>
24
+ <view v-if="noData" class="uni-table-loading">
25
+ <view class="uni-table-text" :class="{ 'empty-border': border }">{{ emptyText }}</view>
26
+ </view>
27
+ <view v-if="loading" class="uni-table-mask" :class="{ 'empty-border': border }">
28
+ <div class="uni-table--loader"></div>
29
+ </view>
30
+ </view>
31
+ <!-- #endif -->
32
+ </view>
33
+ </template>
34
+
35
+ <script>
36
+ /**
37
+ * Table 表格
38
+ * @description 用于展示多条结构类似的数据
39
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=3270
40
+ * @property {Boolean} border 是否带有纵向边框
41
+ * @property {Boolean} stripe 是否显示斑马线
42
+ * @property {Boolean} type 是否开启多选
43
+ * @property {String} emptyText 空数据时显示的文本内容
44
+ * @property {Boolean} loading 显示加载中
45
+ * @event {Function} selection-change 开启多选时,当选择项发生变化时会触发该事件
46
+ */
47
+ export default {
48
+ name: 'cvTable',
49
+ options: {
50
+ virtualHost: true
51
+ },
52
+ emits: ['selection-change'],
53
+ props: {
54
+ data: {
55
+ type: Array,
56
+ default() {
57
+ return [];
58
+ }
59
+ },
60
+ // 是否有竖线
61
+ border: {
62
+ type: Boolean,
63
+ default: false
64
+ },
65
+ // 是否显示斑马线
66
+ stripe: {
67
+ type: Boolean,
68
+ default: false
69
+ },
70
+ // 多选
71
+ type: {
72
+ type: String,
73
+ default: ''
74
+ },
75
+ // 没有更多数据
76
+ emptyText: {
77
+ type: String,
78
+ default: '没有更多数据'
79
+ },
80
+ loading: {
81
+ type: Boolean,
82
+ default: false
83
+ },
84
+ rowKey: {
85
+ type: String,
86
+ default: ''
87
+ }
88
+ },
89
+ data() {
90
+ return {
91
+ noData: true,
92
+ minWidth: 0,
93
+ multiTableHeads: []
94
+ };
95
+ },
96
+ watch: {
97
+ loading(val) {},
98
+ data(newVal) {
99
+ let theadChildren = this.theadChildren;
100
+ let rowspan = 1;
101
+ if (this.theadChildren) {
102
+ rowspan = this.theadChildren.rowspan;
103
+ }
104
+
105
+ // this.trChildren.length - rowspan
106
+ this.noData = false;
107
+ // this.noData = newVal.length === 0
108
+ }
109
+ },
110
+ created() {
111
+ // 定义tr的实例数组
112
+ this.trChildren = [];
113
+ this.thChildren = [];
114
+ this.theadChildren = null;
115
+ this.backData = [];
116
+ this.backIndexData = [];
117
+ },
118
+
119
+ methods: {
120
+ isNodata() {
121
+ let theadChildren = this.theadChildren;
122
+ let rowspan = 1;
123
+ if (this.theadChildren) {
124
+ rowspan = this.theadChildren.rowspan;
125
+ }
126
+ this.noData = this.trChildren.length - rowspan <= 0;
127
+ },
128
+ /**
129
+ * 选中所有
130
+ */
131
+ selectionAll() {
132
+ let startIndex = 1;
133
+ let theadChildren = this.theadChildren;
134
+ if (!this.theadChildren) {
135
+ theadChildren = this.trChildren[0];
136
+ } else {
137
+ startIndex = theadChildren.rowspan - 1;
138
+ }
139
+ let isHaveData = this.data && this.data.length.length > 0;
140
+ theadChildren.checked = true;
141
+ theadChildren.indeterminate = false;
142
+ this.trChildren.forEach((item, index) => {
143
+ if (!item.disabled) {
144
+ item.checked = true;
145
+ if (isHaveData && item.keyValue) {
146
+ const row = this.data.find((v) => v[this.rowKey] === item.keyValue);
147
+ if (!this.backData.find((v) => v[this.rowKey] === row[this.rowKey])) {
148
+ this.backData.push(row);
149
+ }
150
+ }
151
+ if (index > startIndex - 1 && this.backIndexData.indexOf(index - startIndex) === -1) {
152
+ this.backIndexData.push(index - startIndex);
153
+ }
154
+ }
155
+ });
156
+ // this.backData = JSON.parse(JSON.stringify(this.data))
157
+ this.$emit('selection-change', {
158
+ detail: {
159
+ value: this.backData,
160
+ index: this.backIndexData
161
+ }
162
+ });
163
+ },
164
+ /**
165
+ * 用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中)
166
+ */
167
+ toggleRowSelection(row, selected) {
168
+ // if (!this.theadChildren) return
169
+ row = [].concat(row);
170
+
171
+ this.trChildren.forEach((item, index) => {
172
+ // if (item.keyValue) {
173
+
174
+ const select = row.findIndex((v) => {
175
+ //
176
+ if (typeof v === 'number') {
177
+ return v === index - 1;
178
+ } else {
179
+ return v[this.rowKey] === item.keyValue;
180
+ }
181
+ });
182
+ let ischeck = item.checked;
183
+ if (select !== -1) {
184
+ if (typeof selected === 'boolean') {
185
+ item.checked = selected;
186
+ } else {
187
+ item.checked = !item.checked;
188
+ }
189
+ if (ischeck !== item.checked) {
190
+ this.check(item.rowData || item, item.checked, item.rowData ? item.keyValue : null, true);
191
+ }
192
+ }
193
+ // }
194
+ });
195
+ this.$emit('selection-change', {
196
+ detail: {
197
+ value: this.backData,
198
+ index: this.backIndexData
199
+ }
200
+ });
201
+ },
202
+
203
+ /**
204
+ * 用于多选表格,清空用户的选择
205
+ */
206
+ clearSelection() {
207
+ let theadChildren = this.theadChildren;
208
+ if (!this.theadChildren) {
209
+ theadChildren = this.trChildren[0];
210
+ }
211
+ // if (!this.theadChildren) return
212
+ theadChildren.checked = false;
213
+ theadChildren.indeterminate = false;
214
+ this.trChildren.forEach((item) => {
215
+ // if (item.keyValue) {
216
+ item.checked = false;
217
+ // }
218
+ });
219
+ this.backData = [];
220
+ this.backIndexData = [];
221
+ this.$emit('selection-change', {
222
+ detail: {
223
+ value: [],
224
+ index: []
225
+ }
226
+ });
227
+ },
228
+ /**
229
+ * 用于多选表格,切换所有行的选中状态
230
+ */
231
+ toggleAllSelection() {
232
+ let list = [];
233
+ let startIndex = 1;
234
+ let theadChildren = this.theadChildren;
235
+ if (!this.theadChildren) {
236
+ theadChildren = this.trChildren[0];
237
+ } else {
238
+ startIndex = theadChildren.rowspan - 1;
239
+ }
240
+ this.trChildren.forEach((item, index) => {
241
+ if (!item.disabled) {
242
+ if (index > startIndex - 1) {
243
+ list.push(index - startIndex);
244
+ }
245
+ }
246
+ });
247
+ this.toggleRowSelection(list);
248
+ },
249
+
250
+ /**
251
+ * 选中\取消选中
252
+ * @param {Object} child
253
+ * @param {Object} check
254
+ * @param {Object} rowValue
255
+ */
256
+ check(child, check, keyValue, emit) {
257
+ let theadChildren = this.theadChildren;
258
+ if (!this.theadChildren) {
259
+ theadChildren = this.trChildren[0];
260
+ }
261
+
262
+ let childDomIndex = this.trChildren.findIndex((item, index) => child === item);
263
+ if (childDomIndex < 0) {
264
+ childDomIndex = this.data.findIndex((v) => v[this.rowKey] === keyValue) + 1;
265
+ }
266
+ const dataLen = this.trChildren.filter((v) => !v.disabled && v.keyValue).length;
267
+ if (childDomIndex === 0) {
268
+ check ? this.selectionAll() : this.clearSelection();
269
+ return;
270
+ }
271
+
272
+ if (check) {
273
+ if (keyValue) {
274
+ this.backData.push(child);
275
+ }
276
+ this.backIndexData.push(childDomIndex - 1);
277
+ } else {
278
+ const index = this.backData.findIndex((v) => v[this.rowKey] === keyValue);
279
+ const idx = this.backIndexData.findIndex((item) => item === childDomIndex - 1);
280
+ if (keyValue) {
281
+ this.backData.splice(index, 1);
282
+ }
283
+ this.backIndexData.splice(idx, 1);
284
+ }
285
+
286
+ const domCheckAll = this.trChildren.find((item, index) => index > 0 && !item.checked && !item.disabled);
287
+ if (!domCheckAll) {
288
+ theadChildren.indeterminate = false;
289
+ theadChildren.checked = true;
290
+ } else {
291
+ theadChildren.indeterminate = true;
292
+ theadChildren.checked = false;
293
+ }
294
+
295
+ if (this.backIndexData.length === 0) {
296
+ theadChildren.indeterminate = false;
297
+ }
298
+
299
+ if (!emit) {
300
+ this.$emit('selection-change', {
301
+ detail: {
302
+ value: this.backData,
303
+ index: this.backIndexData
304
+ }
305
+ });
306
+ }
307
+ }
308
+ }
309
+ };
310
+ </script>
311
+
312
+ <style scoped>
313
+ @charset "UTF-8";
314
+
315
+ .uni-table-scroll {
316
+ width: 100%;
317
+ /* #ifndef APP-NVUE */
318
+ overflow-x: auto;
319
+ /* #endif */
320
+ }
321
+
322
+ .uni-table {
323
+ position: relative;
324
+ width: 100%;
325
+ border-radius: 5px;
326
+ background-color: #fff;
327
+ /* #ifndef APP-NVUE */
328
+ box-sizing: border-box;
329
+ display: table;
330
+ overflow-x: auto;
331
+ /* #endif */
332
+ }
333
+
334
+ .uni-table ::v-deep .uni-table-tr:nth-child(n + 2):hover {
335
+ background-color: #f5f7fa;
336
+ }
337
+
338
+ .uni-table ::v-deep .uni-table-thead .uni-table-tr:hover {
339
+ background-color: #fafafa;
340
+ }
341
+
342
+ .table--border {
343
+ border: 1px #ebeef5 solid;
344
+ border-right: none;
345
+ }
346
+
347
+ .border-none {
348
+ /* #ifndef APP-NVUE */
349
+ border-bottom: none;
350
+ /* #endif */
351
+ }
352
+
353
+ .table--stripe {
354
+ /* #ifndef APP-NVUE */
355
+ /* #endif */
356
+ }
357
+
358
+ .table--stripe ::v-deep .uni-table-tr:nth-child(2n + 3) {
359
+ background-color: #fafafa;
360
+ }
361
+
362
+ /* 表格加载、无数据样式 */
363
+ .uni-table-loading {
364
+ position: relative;
365
+ /* #ifndef APP-NVUE */
366
+ display: table-row;
367
+ /* #endif */
368
+ height: 50px;
369
+ line-height: 50px;
370
+ overflow: hidden;
371
+ box-sizing: border-box;
372
+ }
373
+
374
+ .empty-border {
375
+ border-right: 1px #ebeef5 solid;
376
+ }
377
+
378
+ .uni-table-text {
379
+ position: absolute;
380
+ right: 0;
381
+ left: 0;
382
+ text-align: center;
383
+ font-size: 14px;
384
+ color: #999;
385
+ }
386
+
387
+ .uni-table-mask {
388
+ position: absolute;
389
+ top: 0;
390
+ bottom: 0;
391
+ left: 0;
392
+ right: 0;
393
+ background-color: rgba(255, 255, 255, 0.8);
394
+ z-index: 99;
395
+ /* #ifndef APP-NVUE */
396
+ display: flex;
397
+ margin: auto;
398
+ transition: all 0.5s;
399
+ /* #endif */
400
+ justify-content: center;
401
+ align-items: center;
402
+ }
403
+
404
+ .uni-table--loader {
405
+ width: 30px;
406
+ height: 30px;
407
+ border: 2px solid #aaa;
408
+ border-radius: 50%;
409
+ /* #ifndef APP-NVUE */
410
+ animation: 2s uni-table--loader linear infinite;
411
+ /* #endif */
412
+ position: relative;
413
+ }
414
+
415
+ @keyframes uni-table--loader {
416
+ 0% {
417
+ transform: rotate(360deg);
418
+ }
419
+
420
+ 10% {
421
+ border-left-color: transparent;
422
+ }
423
+
424
+ 20% {
425
+ border-bottom-color: transparent;
426
+ }
427
+
428
+ 30% {
429
+ border-right-color: transparent;
430
+ }
431
+
432
+ 40% {
433
+ border-top-color: transparent;
434
+ }
435
+
436
+ 50% {
437
+ transform: rotate(0deg);
438
+ }
439
+
440
+ 60% {
441
+ border-top-color: transparent;
442
+ }
443
+
444
+ 70% {
445
+ border-left-color: transparent;
446
+ }
447
+
448
+ 80% {
449
+ border-bottom-color: transparent;
450
+ }
451
+
452
+ 90% {
453
+ border-right-color: transparent;
454
+ }
455
+
456
+ 100% {
457
+ transform: rotate(-360deg);
458
+ }
459
+ }
460
+ </style>