vxe-pc-ui 4.15.11 → 4.15.13

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 (260) hide show
  1. package/dist/all.esm.js +1597 -236
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/collapse/src/collapse.js +73 -40
  5. package/es/components.js +6 -0
  6. package/es/date-picker/src/date-picker.js +1 -0
  7. package/es/icon/style.css +1 -1
  8. package/es/image/src/image.js +14 -14
  9. package/es/language/ar-EG.js +4 -0
  10. package/es/language/de-DE.js +4 -0
  11. package/es/language/en-US.js +5 -1
  12. package/es/language/es-ES.js +4 -0
  13. package/es/language/fr-FR.js +4 -0
  14. package/es/language/hu-HU.js +4 -0
  15. package/es/language/hy-AM.js +4 -0
  16. package/es/language/id-ID.js +4 -0
  17. package/es/language/it-IT.js +4 -0
  18. package/es/language/ja-JP.js +4 -0
  19. package/es/language/ko-KR.js +4 -0
  20. package/es/language/ms-MY.js +4 -0
  21. package/es/language/nb-NO.js +4 -0
  22. package/es/language/pt-BR.js +4 -0
  23. package/es/language/ru-RU.js +4 -0
  24. package/es/language/th-TH.js +4 -0
  25. package/es/language/ug-CN.js +4 -0
  26. package/es/language/uk-UA.js +4 -0
  27. package/es/language/uz-UZ.js +4 -0
  28. package/es/language/vi-VN.js +4 -0
  29. package/es/language/zh-CHT.js +4 -0
  30. package/es/language/zh-CN.js +4 -0
  31. package/es/list/src/list.js +1163 -32
  32. package/es/list/src/store.js +8 -0
  33. package/es/list/style.css +328 -0
  34. package/es/list/style.min.css +1 -1
  35. package/es/print/src/util.js +1 -1
  36. package/es/pulldown/src/pulldown.js +4 -4
  37. package/es/style.css +1 -1
  38. package/es/style.min.css +1 -1
  39. package/es/table-transfer/index.js +12 -0
  40. package/es/table-transfer/src/table-transfer.js +65 -0
  41. package/es/table-transfer/style.css +0 -0
  42. package/es/table-transfer/style.min.css +0 -0
  43. package/es/transfer/index.js +12 -0
  44. package/es/transfer/src/transfer.js +91 -0
  45. package/es/transfer/style.css +4 -0
  46. package/es/transfer/style.min.css +1 -0
  47. package/es/tree/src/tree.js +20 -26
  48. package/es/tree/src/util.js +0 -7
  49. package/es/tree-select/src/tree-select.js +8 -7
  50. package/es/ui/index.js +14 -2
  51. package/es/ui/src/log.js +1 -1
  52. package/es/ui/src/utils.js +12 -0
  53. package/es/vxe-list/style.css +328 -0
  54. package/es/vxe-list/style.min.css +1 -1
  55. package/es/vxe-table-transfer/index.js +3 -0
  56. package/es/vxe-table-transfer/style.css +0 -0
  57. package/es/vxe-table-transfer/style.min.css +0 -0
  58. package/es/vxe-transfer/index.js +3 -0
  59. package/es/vxe-transfer/style.css +4 -0
  60. package/es/vxe-transfer/style.min.css +1 -0
  61. package/lib/collapse/src/collapse.js +89 -47
  62. package/lib/collapse/src/collapse.min.js +1 -1
  63. package/lib/components.js +25 -1
  64. package/lib/components.min.js +1 -1
  65. package/lib/date-picker/src/date-picker.js +1 -0
  66. package/lib/date-picker/src/date-picker.min.js +1 -1
  67. package/lib/icon/style/style.css +1 -1
  68. package/lib/icon/style/style.min.css +1 -1
  69. package/lib/image/src/image.js +17 -17
  70. package/lib/image/src/image.min.js +1 -1
  71. package/lib/index.umd.js +1753 -188
  72. package/lib/index.umd.min.js +1 -1
  73. package/lib/language/ar-EG.js +4 -0
  74. package/lib/language/ar-EG.min.js +1 -1
  75. package/lib/language/ar-EG.umd.js +4 -0
  76. package/lib/language/de-DE.js +4 -0
  77. package/lib/language/de-DE.min.js +1 -1
  78. package/lib/language/de-DE.umd.js +4 -0
  79. package/lib/language/en-US.js +5 -1
  80. package/lib/language/en-US.min.js +1 -1
  81. package/lib/language/en-US.umd.js +5 -1
  82. package/lib/language/es-ES.js +4 -0
  83. package/lib/language/es-ES.min.js +1 -1
  84. package/lib/language/es-ES.umd.js +4 -0
  85. package/lib/language/fr-FR.js +4 -0
  86. package/lib/language/fr-FR.min.js +1 -1
  87. package/lib/language/fr-FR.umd.js +4 -0
  88. package/lib/language/hu-HU.js +4 -0
  89. package/lib/language/hu-HU.min.js +1 -1
  90. package/lib/language/hu-HU.umd.js +4 -0
  91. package/lib/language/hy-AM.js +4 -0
  92. package/lib/language/hy-AM.min.js +1 -1
  93. package/lib/language/hy-AM.umd.js +4 -0
  94. package/lib/language/id-ID.js +4 -0
  95. package/lib/language/id-ID.min.js +1 -1
  96. package/lib/language/id-ID.umd.js +4 -0
  97. package/lib/language/it-IT.js +4 -0
  98. package/lib/language/it-IT.min.js +1 -1
  99. package/lib/language/it-IT.umd.js +4 -0
  100. package/lib/language/ja-JP.js +4 -0
  101. package/lib/language/ja-JP.min.js +1 -1
  102. package/lib/language/ja-JP.umd.js +4 -0
  103. package/lib/language/ko-KR.js +4 -0
  104. package/lib/language/ko-KR.min.js +1 -1
  105. package/lib/language/ko-KR.umd.js +4 -0
  106. package/lib/language/ms-MY.js +4 -0
  107. package/lib/language/ms-MY.min.js +1 -1
  108. package/lib/language/ms-MY.umd.js +4 -0
  109. package/lib/language/nb-NO.js +4 -0
  110. package/lib/language/nb-NO.min.js +1 -1
  111. package/lib/language/nb-NO.umd.js +4 -0
  112. package/lib/language/pt-BR.js +4 -0
  113. package/lib/language/pt-BR.min.js +1 -1
  114. package/lib/language/pt-BR.umd.js +4 -0
  115. package/lib/language/ru-RU.js +4 -0
  116. package/lib/language/ru-RU.min.js +1 -1
  117. package/lib/language/ru-RU.umd.js +4 -0
  118. package/lib/language/th-TH.js +4 -0
  119. package/lib/language/th-TH.min.js +1 -1
  120. package/lib/language/th-TH.umd.js +4 -0
  121. package/lib/language/ug-CN.js +4 -0
  122. package/lib/language/ug-CN.min.js +1 -1
  123. package/lib/language/ug-CN.umd.js +4 -0
  124. package/lib/language/uk-UA.js +4 -0
  125. package/lib/language/uk-UA.min.js +1 -1
  126. package/lib/language/uk-UA.umd.js +4 -0
  127. package/lib/language/uz-UZ.js +4 -0
  128. package/lib/language/uz-UZ.min.js +1 -1
  129. package/lib/language/uz-UZ.umd.js +4 -0
  130. package/lib/language/vi-VN.js +4 -0
  131. package/lib/language/vi-VN.min.js +1 -1
  132. package/lib/language/vi-VN.umd.js +4 -0
  133. package/lib/language/zh-CHT.js +4 -0
  134. package/lib/language/zh-CHT.min.js +1 -1
  135. package/lib/language/zh-CHT.umd.js +4 -0
  136. package/lib/language/zh-CN.js +4 -0
  137. package/lib/language/zh-CN.min.js +1 -1
  138. package/lib/language/zh-CN.umd.js +4 -0
  139. package/lib/list/src/list.js +1319 -30
  140. package/lib/list/src/list.min.js +1 -1
  141. package/lib/list/src/store.js +15 -0
  142. package/lib/list/src/store.min.js +1 -0
  143. package/lib/list/style/style.css +328 -0
  144. package/lib/list/style/style.min.css +1 -1
  145. package/lib/print/src/util.js +1 -1
  146. package/lib/print/src/util.min.js +1 -1
  147. package/lib/pulldown/src/pulldown.js +4 -0
  148. package/lib/pulldown/src/pulldown.min.js +1 -1
  149. package/lib/style.css +1 -1
  150. package/lib/style.min.css +1 -1
  151. package/lib/table-transfer/index.js +19 -0
  152. package/lib/table-transfer/index.min.js +1 -0
  153. package/lib/table-transfer/src/table-transfer.js +76 -0
  154. package/lib/table-transfer/src/table-transfer.min.js +1 -0
  155. package/lib/table-transfer/style/index.js +1 -0
  156. package/lib/table-transfer/style/style.css +0 -0
  157. package/lib/table-transfer/style/style.min.css +0 -0
  158. package/lib/transfer/index.js +19 -0
  159. package/lib/transfer/index.min.js +1 -0
  160. package/lib/transfer/src/transfer.js +95 -0
  161. package/lib/transfer/src/transfer.min.js +1 -0
  162. package/lib/transfer/style/index.js +1 -0
  163. package/lib/transfer/style/style.css +4 -0
  164. package/lib/transfer/style/style.min.css +1 -0
  165. package/lib/tree/src/tree.js +18 -24
  166. package/lib/tree/src/tree.min.js +1 -1
  167. package/lib/tree/src/util.js +0 -10
  168. package/lib/tree/src/util.min.js +1 -1
  169. package/lib/tree-select/src/tree-select.js +9 -6
  170. package/lib/tree-select/src/tree-select.min.js +1 -1
  171. package/lib/ui/index.js +14 -2
  172. package/lib/ui/index.min.js +1 -1
  173. package/lib/ui/src/log.js +1 -1
  174. package/lib/ui/src/log.min.js +1 -1
  175. package/lib/ui/src/utils.js +15 -0
  176. package/lib/ui/src/utils.min.js +1 -1
  177. package/lib/vxe-list/style/style.css +328 -0
  178. package/lib/vxe-list/style/style.min.css +1 -1
  179. package/lib/vxe-table-transfer/index.js +21 -0
  180. package/lib/vxe-table-transfer/index.min.js +1 -0
  181. package/lib/vxe-table-transfer/style/index.js +1 -0
  182. package/lib/vxe-table-transfer/style/style.css +0 -0
  183. package/lib/vxe-table-transfer/style/style.min.css +0 -0
  184. package/lib/vxe-transfer/index.js +21 -0
  185. package/lib/vxe-transfer/index.min.js +1 -0
  186. package/lib/vxe-transfer/style/index.js +1 -0
  187. package/lib/vxe-transfer/style/style.css +4 -0
  188. package/lib/vxe-transfer/style/style.min.css +1 -0
  189. package/package.json +1 -1
  190. package/packages/collapse/src/collapse.ts +81 -42
  191. package/packages/components.ts +6 -0
  192. package/packages/date-picker/src/date-picker.ts +1 -0
  193. package/packages/image/src/image.ts +14 -14
  194. package/packages/language/ar-EG.ts +4 -0
  195. package/packages/language/de-DE.ts +4 -0
  196. package/packages/language/en-US.ts +5 -1
  197. package/packages/language/es-ES.ts +4 -0
  198. package/packages/language/fr-FR.ts +4 -0
  199. package/packages/language/hu-HU.ts +4 -0
  200. package/packages/language/hy-AM.ts +4 -0
  201. package/packages/language/id-ID.ts +4 -0
  202. package/packages/language/it-IT.ts +4 -0
  203. package/packages/language/ja-JP.ts +4 -0
  204. package/packages/language/ko-KR.ts +4 -0
  205. package/packages/language/ms-MY.ts +4 -0
  206. package/packages/language/nb-NO.ts +4 -0
  207. package/packages/language/pt-BR.ts +4 -0
  208. package/packages/language/ru-RU.ts +4 -0
  209. package/packages/language/th-TH.ts +4 -0
  210. package/packages/language/ug-CN.ts +4 -0
  211. package/packages/language/uk-UA.ts +4 -0
  212. package/packages/language/uz-UZ.ts +4 -0
  213. package/packages/language/vi-VN.ts +4 -0
  214. package/packages/language/zh-CHT.ts +4 -0
  215. package/packages/language/zh-CN.ts +4 -0
  216. package/packages/list/src/list.ts +1276 -37
  217. package/packages/list/src/store.ts +14 -0
  218. package/packages/print/src/util.ts +1 -2
  219. package/packages/pulldown/src/pulldown.ts +4 -4
  220. package/packages/table-transfer/index.ts +16 -0
  221. package/packages/table-transfer/src/table-transfer.ts +91 -0
  222. package/packages/transfer/index.ts +16 -0
  223. package/packages/transfer/src/transfer.ts +117 -0
  224. package/packages/tree/src/tree.ts +20 -26
  225. package/packages/tree/src/util.ts +0 -10
  226. package/packages/tree-select/src/tree-select.ts +8 -7
  227. package/packages/ui/index.ts +14 -1
  228. package/packages/ui/src/utils.ts +15 -0
  229. package/styles/all.scss +2 -0
  230. package/styles/components/list.scss +245 -0
  231. package/styles/components/table-transfer.scss +0 -0
  232. package/styles/components/transfer.scss +4 -0
  233. package/styles/components/tree.scss +1 -0
  234. package/styles/theme/base.scss +3 -0
  235. package/styles/theme/dark.scss +10 -0
  236. package/styles/theme/light.scss +10 -0
  237. package/styles/variable.scss +11 -1
  238. package/types/all.d.ts +6 -0
  239. package/types/components/collapse.d.ts +4 -2
  240. package/types/components/list.d.ts +349 -17
  241. package/types/components/pulldown.d.ts +1 -0
  242. package/types/components/table-transfer.d.ts +84 -0
  243. package/types/components/table.d.ts +4 -0
  244. package/types/components/transfer.d.ts +84 -0
  245. package/types/components/tree-select.d.ts +4 -0
  246. package/types/components/tree.d.ts +1 -1
  247. package/types/ui/global-config.d.ts +4 -0
  248. package/types/ui/global-icon.d.ts +6 -1
  249. /package/es/icon/{iconfont.1782358507268.ttf → iconfont.1782658269305.ttf} +0 -0
  250. /package/es/icon/{iconfont.1782358507268.woff → iconfont.1782658269305.woff} +0 -0
  251. /package/es/icon/{iconfont.1782358507268.woff2 → iconfont.1782658269305.woff2} +0 -0
  252. /package/es/{iconfont.1782358507268.ttf → iconfont.1782658269305.ttf} +0 -0
  253. /package/es/{iconfont.1782358507268.woff → iconfont.1782658269305.woff} +0 -0
  254. /package/es/{iconfont.1782358507268.woff2 → iconfont.1782658269305.woff2} +0 -0
  255. /package/lib/icon/style/{iconfont.1782358507268.ttf → iconfont.1782658269305.ttf} +0 -0
  256. /package/lib/icon/style/{iconfont.1782358507268.woff → iconfont.1782658269305.woff} +0 -0
  257. /package/lib/icon/style/{iconfont.1782358507268.woff2 → iconfont.1782658269305.woff2} +0 -0
  258. /package/lib/{iconfont.1782358507268.ttf → iconfont.1782658269305.ttf} +0 -0
  259. /package/lib/{iconfont.1782358507268.woff → iconfont.1782658269305.woff} +0 -0
  260. /package/lib/{iconfont.1782358507268.woff2 → iconfont.1782658269305.woff2} +0 -0
@@ -1,24 +1,49 @@
1
1
  import { h, ref, computed, onBeforeUnmount, watch, reactive, nextTick, onActivated, onMounted } from 'vue';
2
2
  import { defineVxeComponent } from '../../ui/src/comp';
3
3
  import XEUtils from 'xe-utils';
4
- import { getConfig, globalEvents, globalResize, createEvent, useSize } from '../../ui';
5
- import { isScale } from '../../ui/src/dom';
4
+ import { getConfig, getIcon, getI18n, globalEvents, globalResize, createEvent, useSize, renderEmptyElement } from '../../ui';
5
+ import { getCrossListDragRowInfo } from './store';
6
+ import { isScale, removeClass, addClass, getTpImg, toCssUnit } from '../../ui/src/dom';
7
+ import { isEnableConf, getText, enModelValue, deModelValue } from '../../ui/src/utils';
8
+ import { createComponentLog } from '../../ui/src/log';
9
+ import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime';
6
10
  import VxeLoadingComponent from '../../loading/src/loading';
11
+ const { errLog } = createComponentLog('tree');
12
+ function getRowKeyByField(row, keyField) {
13
+ return row ? ('' + (row[keyField] || '')) : '';
14
+ }
15
+ function getRowIdByField(row, keyField) {
16
+ if (!row) {
17
+ return '';
18
+ }
19
+ const rowKey = getRowKeyByField(row, keyField);
20
+ return enModelValue(rowKey);
21
+ }
7
22
  function createReactData() {
8
23
  return {
9
24
  scrollYLoad: false,
10
25
  bodyHeight: 0,
26
+ headHeight: 0,
27
+ footHeight: 0,
11
28
  customHeight: 0,
12
29
  customMaxHeight: 0,
13
30
  parentHeight: 0,
14
31
  topSpaceHeight: 0,
15
- items: []
32
+ rowList: [],
33
+ selectRadioRow: null,
34
+ currRowFlag: 1,
35
+ updateCheckboxFlag: 1,
36
+ isAllChecked: false,
37
+ isAllIndeterminate: false,
38
+ dragRow: null,
39
+ dragTipText: ''
16
40
  };
17
41
  }
18
42
  function createInternalData() {
19
43
  return {
20
44
  resizeObserver: undefined,
21
45
  fullData: [],
46
+ fullKeyMaps: {},
22
47
  lastScrollLeft: 0,
23
48
  lastScrollTop: 0,
24
49
  scrollYStore: {
@@ -27,7 +52,11 @@ function createInternalData() {
27
52
  visibleSize: 0,
28
53
  offsetSize: 0,
29
54
  rowHeight: 0
30
- }
55
+ },
56
+ currentRow: null,
57
+ selectCheckboxMaps: {}
58
+ // prevDragRow: null,
59
+ // prevDragPos: ''
31
60
  };
32
61
  }
33
62
  export default defineVxeComponent({
@@ -47,11 +76,36 @@ export default defineVxeComponent({
47
76
  default: () => getConfig().list.autoResize
48
77
  },
49
78
  syncResize: [Boolean, String, Number],
79
+ showRadio: {
80
+ type: Boolean,
81
+ default: () => getConfig().list.showRadio
82
+ },
83
+ checkRowKey: [String, Number],
84
+ radioConfig: Object,
85
+ showCheckbox: {
86
+ type: Boolean,
87
+ default: () => getConfig().list.showCheckbox
88
+ },
89
+ checkRowKeys: Array,
90
+ checkboxConfig: Object,
91
+ rowConfig: Object,
92
+ dragConfig: Object,
50
93
  virtualYConfig: Object,
51
94
  scrollY: Object
52
95
  },
53
96
  emits: [
54
- 'scroll'
97
+ 'update:checkRowKey',
98
+ 'update:checkRowKeys',
99
+ 'row-click',
100
+ 'row-dblclick',
101
+ 'current-change',
102
+ 'radio-change',
103
+ 'checkbox-change',
104
+ 'checkbox-all',
105
+ 'scroll',
106
+ 'row-dragstart',
107
+ 'row-dragover',
108
+ 'row-dragend'
55
109
  ],
56
110
  setup(props, context) {
57
111
  const { slots, emit } = context;
@@ -60,9 +114,14 @@ export default defineVxeComponent({
60
114
  const { computeSize } = useSize(props);
61
115
  const reactData = reactive(createReactData());
62
116
  const internalData = createInternalData();
117
+ const crossListDragRowInfo = getCrossListDragRowInfo();
63
118
  const refElem = ref();
119
+ const refHeaderElem = ref();
120
+ const refFooterElem = ref();
64
121
  const refVirtualWrapper = ref();
65
122
  const refVirtualBody = ref();
123
+ const refDragRowLineElem = ref();
124
+ const refDragTipElem = ref();
66
125
  const refMaps = {
67
126
  refElem
68
127
  };
@@ -74,25 +133,70 @@ export default defineVxeComponent({
74
133
  internalData,
75
134
  getRefMaps: () => refMaps
76
135
  };
136
+ const computeRowOpts = computed(() => {
137
+ return Object.assign({}, getConfig().list.rowConfig, props.rowConfig);
138
+ });
139
+ const computeDragOpts = computed(() => {
140
+ return Object.assign({}, getConfig().list.dragConfig, props.dragConfig);
141
+ });
77
142
  const computeSYOpts = computed(() => {
78
143
  return Object.assign({}, getConfig().list.virtualYConfig || getConfig().list.scrollY, props.virtualYConfig || props.scrollY);
79
144
  });
80
- const computeStyles = computed(() => {
145
+ const computeKeyField = computed(() => {
146
+ const rowOpts = computeRowOpts.value;
147
+ const { keyField } = rowOpts;
148
+ return keyField || '';
149
+ });
150
+ const computeIsDrag = computed(() => {
151
+ const { dragConfig } = props;
152
+ const dragOpts = computeDragOpts.value;
153
+ return dragConfig && isEnableConf(dragOpts);
154
+ });
155
+ const computeRowHeight = computed(() => {
156
+ const rowOpts = computeRowOpts.value;
157
+ const { height } = rowOpts;
158
+ return height;
159
+ });
160
+ const computeRadioOpts = computed(() => {
161
+ return Object.assign({ showIcon: true }, getConfig().list.radioConfig, props.radioConfig);
162
+ });
163
+ const computeCheckboxOpts = computed(() => {
164
+ return Object.assign({ showIcon: true }, getConfig().list.checkboxConfig, props.checkboxConfig);
165
+ });
166
+ const computeWrapperStyles = computed(() => {
167
+ const rowHeight = computeRowHeight.value;
168
+ const style = {};
169
+ if (rowHeight) {
170
+ style['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
171
+ }
172
+ return style;
173
+ });
174
+ const computeVirtualStyles = computed(() => {
81
175
  const { height, maxHeight } = props;
82
- const { customHeight, customMaxHeight } = reactData;
176
+ const { customHeight, customMaxHeight, headHeight, footHeight } = reactData;
83
177
  const style = {};
84
178
  if (height) {
85
- style.height = `${customHeight}px`;
179
+ style.height = toCssUnit(Math.max(20, customHeight - headHeight - footHeight));
86
180
  }
87
181
  else if (maxHeight) {
88
182
  style.height = 'auto';
89
- style.maxHeight = `${customMaxHeight}px`;
183
+ style.maxHeight = toCssUnit(Math.max(20, customMaxHeight - headHeight - footHeight));
90
184
  }
91
185
  return style;
92
186
  });
93
187
  const dispatchEvent = (type, params, evnt) => {
94
188
  emit(type, createEvent(evnt, { $list: $xeList }, params));
95
189
  };
190
+ const emitCheckboxMode = (value) => {
191
+ emit('update:checkRowKeys', value);
192
+ };
193
+ const emitRadioMode = (value) => {
194
+ emit('update:checkRowKey', value);
195
+ };
196
+ const getRowId = (row) => {
197
+ const keyField = computeKeyField.value;
198
+ return getRowIdByField(row, keyField);
199
+ };
96
200
  const calcTableHeight = (key) => {
97
201
  const { parentHeight } = reactData;
98
202
  const val = props[key];
@@ -114,6 +218,10 @@ export default defineVxeComponent({
114
218
  return num;
115
219
  };
116
220
  const updateHeight = () => {
221
+ const headEl = refHeaderElem.value;
222
+ const footEl = refFooterElem.value;
223
+ reactData.headHeight = headEl ? Math.floor(headEl.offsetHeight) : 0;
224
+ reactData.footHeight = footEl ? Math.floor(footEl.offsetHeight) : 0;
117
225
  reactData.customHeight = calcTableHeight('height');
118
226
  reactData.customMaxHeight = calcTableHeight('maxHeight');
119
227
  };
@@ -126,7 +234,7 @@ export default defineVxeComponent({
126
234
  const handleData = () => {
127
235
  const { scrollYLoad } = reactData;
128
236
  const { fullData, scrollYStore } = internalData;
129
- reactData.items = scrollYLoad ? fullData.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullData.slice(0);
237
+ reactData.rowList = scrollYLoad ? fullData.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullData.slice(0);
130
238
  return nextTick();
131
239
  };
132
240
  const updateYData = () => {
@@ -140,17 +248,17 @@ export default defineVxeComponent({
140
248
  const virtualBodyElem = refVirtualBody.value;
141
249
  const sYOpts = computeSYOpts.value;
142
250
  let rowHeight = 0;
143
- let firstItemElem;
251
+ let firstRowElem;
144
252
  if (virtualBodyElem) {
145
253
  if (sYOpts.sItem) {
146
- firstItemElem = virtualBodyElem.querySelector(sYOpts.sItem);
254
+ firstRowElem = virtualBodyElem.querySelector(sYOpts.sItem);
147
255
  }
148
- if (!firstItemElem) {
149
- firstItemElem = virtualBodyElem.children[0];
256
+ if (!firstRowElem) {
257
+ firstRowElem = virtualBodyElem.children[0];
150
258
  }
151
259
  }
152
- if (firstItemElem) {
153
- rowHeight = firstItemElem.offsetHeight;
260
+ if (firstRowElem) {
261
+ rowHeight = firstRowElem.offsetHeight;
154
262
  }
155
263
  rowHeight = Math.max(12, rowHeight);
156
264
  scrollYStore.rowHeight = rowHeight;
@@ -264,6 +372,44 @@ export default defineVxeComponent({
264
372
  }
265
373
  dispatchEvent('scroll', { scrollLeft, scrollTop, isX, isY }, evnt);
266
374
  };
375
+ const updateRadioModeValue = () => {
376
+ const { checkRowKey } = props;
377
+ const { fullKeyMaps } = internalData;
378
+ if (checkRowKey) {
379
+ const row = fullKeyMaps[checkRowKey];
380
+ reactData.selectRadioRow = row || null;
381
+ }
382
+ else {
383
+ reactData.selectRadioRow = null;
384
+ }
385
+ };
386
+ const updateCheckboxModeValue = () => {
387
+ const { checkRowKeys } = props;
388
+ const { fullKeyMaps } = internalData;
389
+ const keyField = computeKeyField.value;
390
+ const selectMaps = {};
391
+ if (checkRowKeys && checkRowKeys.length) {
392
+ for (const rowKey of checkRowKeys) {
393
+ const row = fullKeyMaps[rowKey];
394
+ if (row) {
395
+ const rowid = getRowIdByField(row, keyField);
396
+ selectMaps[rowid] = row;
397
+ }
398
+ }
399
+ }
400
+ internalData.selectCheckboxMaps = selectMaps;
401
+ updateCheckboxStatus();
402
+ };
403
+ const cacheRowMap = () => {
404
+ const { fullData } = internalData;
405
+ const keyField = computeKeyField.value;
406
+ const keyMaps = {};
407
+ fullData.forEach(row => {
408
+ const rowKey = getRowKeyByField(row, keyField);
409
+ keyMaps[rowKey] = row;
410
+ });
411
+ internalData.fullKeyMaps = keyMaps;
412
+ };
267
413
  /**
268
414
  * 加载数据
269
415
  * @param {Array} datas 数据
@@ -280,11 +426,685 @@ export default defineVxeComponent({
280
426
  internalData.fullData = fullData;
281
427
  // 如果gt为0,则总是启用
282
428
  reactData.scrollYLoad = !!sYOpts.enabled && sYOpts.gt > -1 && (sYOpts.gt === 0 || sYOpts.gt <= fullData.length);
429
+ cacheRowMap();
283
430
  handleData();
431
+ updateRadioModeValue();
432
+ updateCheckboxModeValue();
284
433
  return computeScrollLoad().then(() => {
285
434
  refreshScroll();
286
435
  });
287
436
  };
437
+ const clearRowDropOrigin = () => {
438
+ const el = refElem.value;
439
+ if (el) {
440
+ const clss = 'row--drag-origin';
441
+ XEUtils.arrayEach(el.querySelectorAll(`.${clss}`), (elem) => {
442
+ elem.draggable = false;
443
+ removeClass(elem, clss);
444
+ });
445
+ }
446
+ };
447
+ const updateRowDropOrigin = (row) => {
448
+ const sYOpts = computeSYOpts.value;
449
+ const { sItem } = sYOpts;
450
+ const el = refElem.value;
451
+ if (el) {
452
+ const clss = 'row--drag-origin';
453
+ const rowid = getRowId(row);
454
+ XEUtils.arrayEach(el.querySelectorAll(`.vxe-list--row[rowid="${rowid}"]` + (sItem ? `${sItem}[rowid="${rowid}"]` : '')), (elem) => {
455
+ addClass(elem, clss);
456
+ });
457
+ }
458
+ };
459
+ const updateRowDropTipContent = (rowEl) => {
460
+ const { dragRow } = reactData;
461
+ const dragOpts = computeDragOpts.value;
462
+ const { tooltipMethod } = dragOpts;
463
+ const rTooltipMethod = tooltipMethod;
464
+ let tipContent = '';
465
+ if (rTooltipMethod) {
466
+ const rtParams = {
467
+ $list: $xeList,
468
+ row: dragRow
469
+ };
470
+ tipContent = `${rTooltipMethod(rtParams) || ''}`;
471
+ }
472
+ else {
473
+ tipContent = getI18n('vxe.list.dragTip', [rowEl.textContent || '']);
474
+ }
475
+ reactData.dragTipText = tipContent;
476
+ };
477
+ const hideDropTip = () => {
478
+ const rdTipEl = refDragTipElem.value;
479
+ const rdLineEl = refDragRowLineElem.value;
480
+ if (rdTipEl) {
481
+ rdTipEl.style.display = '';
482
+ }
483
+ if (rdLineEl) {
484
+ rdLineEl.style.display = '';
485
+ }
486
+ };
487
+ const clearCrossListDragStatus = () => {
488
+ // crossListDragRowObj = null
489
+ crossListDragRowInfo.row = null;
490
+ };
491
+ const clearDragStatus = () => {
492
+ const { dragRow } = reactData;
493
+ if (dragRow) {
494
+ hideDropTip();
495
+ clearRowDropOrigin();
496
+ clearCrossListDragStatus();
497
+ reactData.dragRow = null;
498
+ }
499
+ };
500
+ const handleRowDragMousedownEvent = (evnt, params) => {
501
+ evnt.stopPropagation();
502
+ const { row } = params;
503
+ const dragConfig = computeDragOpts.value;
504
+ const { trigger, dragStartMethod } = dragConfig;
505
+ const dragEl = evnt.currentTarget;
506
+ const rowEl = trigger === 'row' ? dragEl : dragEl.parentElement.parentElement;
507
+ clearRowDropOrigin();
508
+ if (dragStartMethod && !dragStartMethod(params)) {
509
+ rowEl.draggable = false;
510
+ reactData.dragRow = null;
511
+ hideDropTip();
512
+ return;
513
+ }
514
+ const dragstartEventParams = {
515
+ row
516
+ };
517
+ reactData.dragRow = row;
518
+ rowEl.draggable = true;
519
+ updateRowDropOrigin(row);
520
+ updateRowDropTipContent(rowEl);
521
+ dispatchEvent('row-dragstart', dragstartEventParams, evnt);
522
+ };
523
+ const handleRowDragMouseupEvent = () => {
524
+ clearDragStatus();
525
+ };
526
+ const showDropTip = (evnt, rowEl, showLine, dragPos) => {
527
+ const wrapperEl = refElem.value;
528
+ if (!wrapperEl) {
529
+ return;
530
+ }
531
+ const wrapperRect = wrapperEl.getBoundingClientRect();
532
+ const wrapperHeight = wrapperEl.clientHeight;
533
+ if (rowEl) {
534
+ const rdLineEl = refDragRowLineElem.value;
535
+ if (rdLineEl) {
536
+ if (showLine) {
537
+ const trRect = rowEl.getBoundingClientRect();
538
+ let rowHeight = rowEl.clientHeight;
539
+ const offsetTop = Math.max(1, trRect.y - wrapperRect.y);
540
+ if (offsetTop + rowHeight > wrapperHeight) {
541
+ rowHeight = wrapperHeight - offsetTop;
542
+ }
543
+ rdLineEl.style.display = 'block';
544
+ rdLineEl.style.top = `${offsetTop}px`;
545
+ rdLineEl.style.height = `${rowHeight}px`;
546
+ rdLineEl.setAttribute('drag-pos', dragPos);
547
+ }
548
+ else {
549
+ rdLineEl.style.display = '';
550
+ }
551
+ }
552
+ }
553
+ const rdTipEl = refDragTipElem.value;
554
+ if (rdTipEl) {
555
+ rdTipEl.style.display = 'block';
556
+ rdTipEl.style.top = `${Math.min(wrapperEl.clientHeight - wrapperEl.scrollTop - rdTipEl.clientHeight, evnt.clientY - wrapperRect.y)}px`;
557
+ rdTipEl.style.left = `${Math.min(wrapperEl.clientWidth - wrapperEl.scrollLeft - rdTipEl.clientWidth - 1, evnt.clientX - wrapperRect.x)}px`;
558
+ rdTipEl.setAttribute('drag-status', showLine ? 'normal' : 'disabled');
559
+ }
560
+ };
561
+ const clearRowDragData = () => {
562
+ const wrapperEl = refElem.value;
563
+ const dtClss = ['.vxe-list--row'];
564
+ hideDropTip();
565
+ clearRowDropOrigin();
566
+ clearRowAnimate(wrapperEl, dtClss);
567
+ reactData.dragRow = null;
568
+ };
569
+ const handleRowDragSwapEvent = (evnt, dragRow, prevDragRow, prevDragPos) => {
570
+ const { fullData } = internalData;
571
+ const dragConfig = computeDragOpts.value;
572
+ const { animation, dragEndMethod } = dragConfig;
573
+ const dEndMethod = dragEndMethod || (dragConfig ? dragConfig.dragEndMethod : null);
574
+ const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
575
+ const el = refElem.value;
576
+ const errRest = {
577
+ status: false
578
+ };
579
+ if (!(el && prevDragRow && dragRow)) {
580
+ return Promise.resolve(errRest);
581
+ }
582
+ // 判断是否有拖动
583
+ if (prevDragRow !== dragRow) {
584
+ const dragParams = {
585
+ oldRow: dragRow,
586
+ newRow: prevDragRow,
587
+ dragRow,
588
+ dragPos: prevDragPos,
589
+ offsetIndex: dragOffsetIndex
590
+ };
591
+ const dragRowid = getRowId(dragRow);
592
+ const _dragRowIndex = findRowIndexOfByKey(fullData, dragRowid);
593
+ const newRowid = getRowKey(prevDragRow);
594
+ let dragRowHeight = 0;
595
+ let dragOffsetTop = -1;
596
+ if (animation) {
597
+ const prevRowEl = el.querySelector(`.vxe-list--row[rowid="${newRowid}"]`);
598
+ const oldRowEl = el.querySelector(`.vxe-list--row[rowid="${dragRowid}"]`);
599
+ const targetRowEl = prevRowEl || oldRowEl;
600
+ if (targetRowEl) {
601
+ dragRowHeight = targetRowEl.offsetHeight;
602
+ }
603
+ if (oldRowEl) {
604
+ dragOffsetTop = oldRowEl.offsetTop;
605
+ }
606
+ }
607
+ let oafIndex = -1;
608
+ let nafIndex = -1;
609
+ return Promise.resolve(dEndMethod ? dEndMethod(dragParams) : true).then((status) => {
610
+ if (!status) {
611
+ return errRest;
612
+ }
613
+ // 移出
614
+ oafIndex = findRowIndexOf(fullData, dragRow);
615
+ fullData.splice(oafIndex, 1);
616
+ // 插入
617
+ const pafIndex = findRowIndexOf(fullData, prevDragRow);
618
+ nafIndex = pafIndex + dragOffsetIndex;
619
+ fullData.splice(nafIndex, 0, dragRow);
620
+ handleData();
621
+ if (reactData.scrollYLoad) {
622
+ updateYSpace();
623
+ }
624
+ if (evnt) {
625
+ const dragendEventParams = {
626
+ oldRow: dragRow,
627
+ newRow: prevDragRow,
628
+ dragRow,
629
+ dragPos: prevDragPos,
630
+ offsetIndex: dragOffsetIndex,
631
+ _index: {
632
+ newIndex: nafIndex,
633
+ oldIndex: oafIndex
634
+ }
635
+ };
636
+ dispatchEvent('row-dragend', dragendEventParams, evnt);
637
+ }
638
+ return nextTick().then(() => {
639
+ if (animation) {
640
+ const { rowList } = reactData;
641
+ const { fullData } = internalData;
642
+ const _newRowIndex = findRowIndexOfByKey(fullData, dragRowid);
643
+ const firstRow = fullData[0];
644
+ const _firstRowIndex = findRowIndexOf(fullData, firstRow);
645
+ const wrapperEl = el;
646
+ if (_firstRowIndex > -1) {
647
+ const _lastRowIndex = _firstRowIndex + fullData.length;
648
+ let rsIndex = -1;
649
+ let reIndex = -1;
650
+ let offsetRate = 1;
651
+ if (_dragRowIndex < _firstRowIndex) {
652
+ // 从上往下虚拟拖拽
653
+ rsIndex = 0;
654
+ reIndex = _newRowIndex - _firstRowIndex;
655
+ }
656
+ else if (_dragRowIndex > _lastRowIndex) {
657
+ // 从下往上虚拟拖拽
658
+ const $newRowIndex = findRowIndexOfByKey(rowList, dragRowid);
659
+ rsIndex = $newRowIndex + 1;
660
+ reIndex = fullData.length;
661
+ offsetRate = -1;
662
+ }
663
+ else {
664
+ if (_newRowIndex > _dragRowIndex) {
665
+ // 从上往下拖拽
666
+ rsIndex = _dragRowIndex - _firstRowIndex;
667
+ reIndex = rsIndex + _newRowIndex - _dragRowIndex;
668
+ }
669
+ else {
670
+ // 从下往上拖拽
671
+ rsIndex = _newRowIndex - _firstRowIndex;
672
+ reIndex = rsIndex + _dragRowIndex - _newRowIndex + 1;
673
+ offsetRate = -1;
674
+ }
675
+ }
676
+ const dragRangeList = fullData.slice(rsIndex, reIndex);
677
+ if (dragRangeList.length) {
678
+ const dtClss = [];
679
+ dragRangeList.forEach(obj => {
680
+ const rowid = getRowId(obj);
681
+ dtClss.push(`.vxe-list--row[rowid="${rowid}"]`);
682
+ });
683
+ const dtTrList = wrapperEl.querySelectorAll(dtClss.join(','));
684
+ moveRowAnimateToTb(dtTrList, offsetRate * dragRowHeight);
685
+ }
686
+ }
687
+ const drClss = [`.vxe-list--row[rowid="${dragRowid}"]`];
688
+ const newDtTrList = wrapperEl.querySelectorAll(drClss.join(','));
689
+ const newTrEl = newDtTrList[0];
690
+ if (dragOffsetTop > -1 && newTrEl) {
691
+ moveRowAnimateToTb(newDtTrList, dragOffsetTop - newTrEl.offsetTop);
692
+ }
693
+ }
694
+ recalculate();
695
+ }).then(() => {
696
+ return {
697
+ status: true
698
+ };
699
+ });
700
+ }).catch(() => {
701
+ return errRest;
702
+ }).then((rest) => {
703
+ clearRowDragData();
704
+ clearCrossListDragStatus();
705
+ return rest;
706
+ });
707
+ }
708
+ clearRowDragData();
709
+ clearCrossListDragStatus();
710
+ return Promise.resolve(errRest);
711
+ };
712
+ const handleRowDragDragstartEvent = (evnt) => {
713
+ if (evnt.dataTransfer) {
714
+ evnt.dataTransfer.setDragImage(getTpImg(), 0, 0);
715
+ }
716
+ };
717
+ const handleRowDragDragendEvent = (evnt) => {
718
+ const { dragRow } = reactData;
719
+ const { prevDragRow, prevDragPos } = internalData;
720
+ handleRowDragSwapEvent(evnt, dragRow, prevDragRow, prevDragPos);
721
+ };
722
+ const handleRowDragDragoverEvent = (evnt) => {
723
+ const { dragRow } = reactData;
724
+ const { fullData } = internalData;
725
+ if (!dragRow) {
726
+ evnt.preventDefault();
727
+ }
728
+ const rowEl = evnt.currentTarget;
729
+ const rowid = rowEl.getAttribute('rowid') || '';
730
+ const row = findRowByKey(fullData, rowid);
731
+ if (row) {
732
+ evnt.preventDefault();
733
+ const offsetY = evnt.clientY - rowEl.getBoundingClientRect().y;
734
+ const dragPos = offsetY < rowEl.clientHeight / 2 ? 'top' : 'bottom';
735
+ internalData.prevDragRow = row;
736
+ internalData.prevDragPos = dragPos;
737
+ if ((dragRow && getRowId(dragRow) === rowid)) {
738
+ showDropTip(evnt, rowEl, false, dragPos);
739
+ return;
740
+ }
741
+ const dragOffsetIndex = dragPos === 'bottom' ? 1 : 0;
742
+ const offsetIndex = dragOffsetIndex;
743
+ const dragoverEventParams = {
744
+ oldRow: dragRow,
745
+ targetRow: row,
746
+ dragPos,
747
+ dragRow,
748
+ offsetIndex
749
+ };
750
+ showDropTip(evnt, rowEl, true, dragPos);
751
+ dispatchEvent('row-dragover', dragoverEventParams, evnt);
752
+ }
753
+ };
754
+ const handleRowMousedownEvent = (evnt, row) => {
755
+ const dragConfig = computeDragOpts.value;
756
+ const isDrag = computeIsDrag.value;
757
+ const { trigger, disabledMethod } = dragConfig;
758
+ let isRowDrag = false;
759
+ if (isDrag) {
760
+ isRowDrag = trigger === 'row';
761
+ }
762
+ const params = { row, $list: $xeList };
763
+ if (isRowDrag && !(disabledMethod && disabledMethod(params))) {
764
+ handleRowDragMousedownEvent(evnt, params);
765
+ }
766
+ };
767
+ const handleRowClickEvent = (evnt, row) => {
768
+ const { currentRow } = internalData;
769
+ const rowOpts = computeRowOpts.value;
770
+ const { isCurrent } = rowOpts;
771
+ let triggerCurrent = false;
772
+ if (isCurrent) {
773
+ triggerCurrent = true;
774
+ changeCurrentEvent(evnt, row);
775
+ }
776
+ else if (currentRow) {
777
+ internalData.currentRow = null;
778
+ reactData.currRowFlag++;
779
+ }
780
+ dispatchEvent('row-click', { row, triggerCurrent }, evnt);
781
+ };
782
+ const handleRowDblclickEvent = (evnt, row) => {
783
+ dispatchEvent('row-dblclick', { row }, evnt);
784
+ };
785
+ const getRowKey = (row) => {
786
+ const keyField = computeKeyField.value;
787
+ return getRowKeyByField(row, keyField);
788
+ };
789
+ const eqRowKey = (rowKey1, rowKey2) => {
790
+ return ('' + rowKey1) === ('' + rowKey2);
791
+ };
792
+ const eqRow = (row1, row2) => {
793
+ if (row1 && row2) {
794
+ if (row1 === row2) {
795
+ return true;
796
+ }
797
+ return eqRowKey(getRowId(row1), getRowId(row2));
798
+ }
799
+ return false;
800
+ };
801
+ const eqRowByKey = (row, rowKey) => {
802
+ return row && eqRowKey(getRowKey(row), rowKey);
803
+ };
804
+ const findRow = (list, row) => {
805
+ return row ? XEUtils.find(list, obj => eqRow(obj, row)) : null;
806
+ };
807
+ const findRowByKey = (list, rowKey) => {
808
+ const keyField = computeKeyField.value;
809
+ return XEUtils.find(list, obj => eqRowKey(getRowIdByField(obj, keyField), rowKey));
810
+ };
811
+ const findRowIndexOf = (list, row) => {
812
+ return row ? XEUtils.findIndexOf(list, obj => eqRow(obj, row)) : -1;
813
+ };
814
+ const findRowIndexOfByKey = (list, rowKey) => {
815
+ const keyField = computeKeyField.value;
816
+ return XEUtils.findIndexOf(list, obj => eqRowKey(getRowIdByField(obj, keyField), rowKey));
817
+ };
818
+ const isCheckedByRadioRowKey = (rowKey) => {
819
+ const { selectRadioRow } = reactData;
820
+ return getRowKey(selectRadioRow) === rowKey;
821
+ };
822
+ const isCheckedByRadioRow = (row) => {
823
+ return isCheckedByRadioRowKey(getRowKey(row));
824
+ };
825
+ const isCheckedByCheckboxRowKey = (rowid) => {
826
+ const { updateCheckboxFlag } = reactData;
827
+ const { selectCheckboxMaps } = internalData;
828
+ return !!(updateCheckboxFlag && selectCheckboxMaps[rowid]);
829
+ };
830
+ const isCheckedByCheckboxRow = (row) => {
831
+ return isCheckedByCheckboxRowKey(getRowKey(row));
832
+ };
833
+ const setCurrentRow = (row) => {
834
+ internalData.currentRow = row;
835
+ reactData.currRowFlag++;
836
+ return nextTick();
837
+ };
838
+ const setCurrentRowByKey = (rowKey) => {
839
+ const { fullData } = internalData;
840
+ internalData.currentRow = findRowByKey(fullData, rowKey);
841
+ reactData.currRowFlag++;
842
+ return nextTick();
843
+ };
844
+ const getCurrentRow = () => {
845
+ const { currentRow } = internalData;
846
+ return currentRow;
847
+ };
848
+ const getCurrentRowKey = () => {
849
+ const { currentRow } = internalData;
850
+ return currentRow ? getRowKey(currentRow) : null;
851
+ };
852
+ const clearCurrentRow = () => {
853
+ internalData.currentRow = null;
854
+ reactData.currRowFlag++;
855
+ return nextTick();
856
+ };
857
+ const setRadioRow = (row) => {
858
+ reactData.selectRadioRow = row;
859
+ const value = getRowKey(row);
860
+ emitRadioMode(value);
861
+ return nextTick();
862
+ };
863
+ const setRadioRowByKey = (rowKey) => {
864
+ const { fullData } = internalData;
865
+ reactData.selectRadioRow = findRowByKey(fullData, rowKey);
866
+ const value = rowKey;
867
+ emitRadioMode(value);
868
+ return nextTick();
869
+ };
870
+ const getRadioRow = () => {
871
+ const { selectRadioRow } = reactData;
872
+ return selectRadioRow;
873
+ };
874
+ const getRadioRowKey = () => {
875
+ const { selectRadioRow } = reactData;
876
+ return selectRadioRow ? getRowKey(selectRadioRow) : null;
877
+ };
878
+ const clearRadioRow = () => {
879
+ const value = null;
880
+ reactData.selectRadioRow = value;
881
+ emitRadioMode(value);
882
+ return nextTick();
883
+ };
884
+ const setCheckboxRow = (row, checked) => {
885
+ const { selectCheckboxMaps } = internalData;
886
+ const keyField = computeKeyField.value;
887
+ const rowList = row ? (XEUtils.isArray(row) ? row : [row]) : [];
888
+ rowList.forEach(checked
889
+ ? (obj) => {
890
+ const rowid = getRowIdByField(obj, keyField);
891
+ if (!selectCheckboxMaps[rowid]) {
892
+ selectCheckboxMaps[rowid] = obj;
893
+ }
894
+ }
895
+ : (obj) => {
896
+ const rowid = getRowIdByField(obj, keyField);
897
+ if (selectCheckboxMaps[rowid]) {
898
+ delete selectCheckboxMaps[rowid];
899
+ }
900
+ });
901
+ const value = getCheckboxRowKeys();
902
+ emitCheckboxMode(value);
903
+ return updateCheckboxStatus();
904
+ };
905
+ const setCheckboxRowByKey = (rowKey, checked) => {
906
+ const { selectCheckboxMaps, fullKeyMaps } = internalData;
907
+ const keyField = computeKeyField.value;
908
+ const rowKeys = rowKey ? (XEUtils.isArray(rowKey) ? rowKey : [rowKey]) : [];
909
+ rowKeys.forEach(checked
910
+ ? (key) => {
911
+ const row = fullKeyMaps[key || ''];
912
+ if (row) {
913
+ const rowid = getRowIdByField(row, keyField);
914
+ if (row && !selectCheckboxMaps[rowid]) {
915
+ selectCheckboxMaps[rowid] = row;
916
+ }
917
+ }
918
+ }
919
+ : (key) => {
920
+ const row = fullKeyMaps[key || ''];
921
+ if (row) {
922
+ const rowid = getRowIdByField(row, keyField);
923
+ if (selectCheckboxMaps[rowid]) {
924
+ delete selectCheckboxMaps[rowid];
925
+ }
926
+ }
927
+ });
928
+ const value = getCheckboxRowKeys();
929
+ emitCheckboxMode(value);
930
+ return updateCheckboxStatus();
931
+ };
932
+ const getCheckboxRows = () => {
933
+ const { updateCheckboxFlag } = reactData;
934
+ const { selectCheckboxMaps } = internalData;
935
+ const rowList = [];
936
+ if (updateCheckboxFlag) {
937
+ XEUtils.each(selectCheckboxMaps, row => {
938
+ if (row) {
939
+ rowList.push(row);
940
+ }
941
+ });
942
+ }
943
+ return rowList;
944
+ };
945
+ const getCheckboxRowKeys = () => {
946
+ const { updateCheckboxFlag } = reactData;
947
+ const { selectCheckboxMaps } = internalData;
948
+ const keyField = computeKeyField.value;
949
+ const rowKeys = [];
950
+ if (updateCheckboxFlag) {
951
+ XEUtils.each(selectCheckboxMaps, row => {
952
+ if (row) {
953
+ const rowKey = getRowKeyByField(row, keyField);
954
+ rowKeys.push(rowKey);
955
+ }
956
+ });
957
+ }
958
+ return rowKeys;
959
+ };
960
+ const clearCheckboxRow = () => {
961
+ internalData.selectCheckboxMaps = {};
962
+ reactData.updateCheckboxFlag++;
963
+ reactData.isAllChecked = false;
964
+ reactData.isAllIndeterminate = false;
965
+ const value = [];
966
+ emitCheckboxMode(value);
967
+ return nextTick();
968
+ };
969
+ const setAllCheckboxRow = (checked) => {
970
+ const { fullData, selectCheckboxMaps } = internalData;
971
+ const keyField = computeKeyField.value;
972
+ if (checked) {
973
+ const value = [];
974
+ for (const row of fullData) {
975
+ const rowKey = getRowKeyByField(row, keyField);
976
+ const rowid = getRowIdByField(row, keyField);
977
+ selectCheckboxMaps[rowid] = row;
978
+ value.push(rowKey);
979
+ }
980
+ emitCheckboxMode(value);
981
+ return updateCheckboxStatus();
982
+ }
983
+ return clearCheckboxRow();
984
+ };
985
+ const updateCheckboxStatus = () => {
986
+ const { selectCheckboxMaps, fullData } = internalData;
987
+ const keyField = computeKeyField.value;
988
+ const checkboxOpts = computeCheckboxOpts.value;
989
+ const { checkMethod } = checkboxOpts;
990
+ let hasChecked = false;
991
+ let hasUnchecked = false;
992
+ if (checkMethod) {
993
+ for (const row of fullData) {
994
+ if (checkMethod({ row, $list: $xeList })) {
995
+ const rowid = getRowIdByField(row, keyField);
996
+ if (selectCheckboxMaps[rowid]) {
997
+ hasChecked = true;
998
+ }
999
+ else {
1000
+ hasUnchecked = true;
1001
+ if (hasChecked) {
1002
+ break;
1003
+ }
1004
+ }
1005
+ }
1006
+ }
1007
+ }
1008
+ else {
1009
+ for (const row of fullData) {
1010
+ const rowid = getRowIdByField(row, keyField);
1011
+ if (selectCheckboxMaps[rowid]) {
1012
+ hasChecked = true;
1013
+ }
1014
+ else {
1015
+ hasUnchecked = true;
1016
+ if (hasChecked) {
1017
+ break;
1018
+ }
1019
+ }
1020
+ }
1021
+ }
1022
+ reactData.isAllChecked = hasChecked && !hasUnchecked;
1023
+ reactData.isAllIndeterminate = hasChecked && hasUnchecked;
1024
+ reactData.updateCheckboxFlag++;
1025
+ return nextTick();
1026
+ };
1027
+ const changeCheckboxAllEvent = (evnt) => {
1028
+ const { isAllChecked } = reactData;
1029
+ const isChecked = !isAllChecked;
1030
+ if (isChecked) {
1031
+ setAllCheckboxRow(true);
1032
+ }
1033
+ else {
1034
+ clearCheckboxRow();
1035
+ }
1036
+ dispatchEvent('checkbox-all', { checked: isChecked }, evnt);
1037
+ };
1038
+ const changeCheckboxEvent = (evnt, row) => {
1039
+ evnt.preventDefault();
1040
+ evnt.stopPropagation();
1041
+ const { selectCheckboxMaps } = internalData;
1042
+ const checkboxOpts = computeCheckboxOpts.value;
1043
+ const { checkMethod } = checkboxOpts;
1044
+ const rowid = getRowId(row);
1045
+ const isDisabled = checkMethod ? !checkMethod({ $list: $xeList, row }) : false;
1046
+ if (isDisabled) {
1047
+ return;
1048
+ }
1049
+ let isChecked = false;
1050
+ if (selectCheckboxMaps[rowid]) {
1051
+ delete selectCheckboxMaps[rowid];
1052
+ }
1053
+ else {
1054
+ isChecked = true;
1055
+ selectCheckboxMaps[rowid] = row;
1056
+ }
1057
+ reactData.updateCheckboxFlag++;
1058
+ updateCheckboxStatus();
1059
+ const rowids = XEUtils.keys(selectCheckboxMaps);
1060
+ const value = rowids.map(deModelValue);
1061
+ emitCheckboxMode(value);
1062
+ dispatchEvent('checkbox-change', { row, value, checked: isChecked }, evnt);
1063
+ };
1064
+ const changeCurrentEvent = (evnt, row) => {
1065
+ evnt.preventDefault();
1066
+ const rowOpts = computeRowOpts.value;
1067
+ const { currentMethod } = rowOpts;
1068
+ let isDisabled = false;
1069
+ if (currentMethod) {
1070
+ isDisabled = !currentMethod({ row });
1071
+ }
1072
+ if (isDisabled) {
1073
+ return;
1074
+ }
1075
+ const isChecked = true;
1076
+ internalData.currentRow = row;
1077
+ reactData.currRowFlag++;
1078
+ dispatchEvent('current-change', { row, checked: isChecked }, evnt);
1079
+ };
1080
+ const changeRadioEvent = (evnt, row) => {
1081
+ evnt.preventDefault();
1082
+ evnt.stopPropagation();
1083
+ const { selectRadioRow } = reactData;
1084
+ const radioOpts = computeRadioOpts.value;
1085
+ const { strict, checkMethod } = radioOpts;
1086
+ const rowKey = getRowKey(row);
1087
+ const isDisabled = checkMethod ? !checkMethod({ $list: $xeList, row }) : false;
1088
+ if (isDisabled) {
1089
+ return;
1090
+ }
1091
+ const value = rowKey;
1092
+ let isChecked = true;
1093
+ if (strict) {
1094
+ if (selectRadioRow && rowKey === getRowKey(selectRadioRow)) {
1095
+ isChecked = false;
1096
+ reactData.selectRadioRow = null;
1097
+ }
1098
+ else {
1099
+ reactData.selectRadioRow = row;
1100
+ }
1101
+ }
1102
+ else {
1103
+ reactData.selectRadioRow = row;
1104
+ }
1105
+ emitRadioMode(value);
1106
+ dispatchEvent('radio-change', { row, value, checked: isChecked }, evnt);
1107
+ };
288
1108
  const listMethods = {
289
1109
  dispatchEvent,
290
1110
  loadData,
@@ -296,29 +1116,286 @@ export default defineVxeComponent({
296
1116
  clearScroll();
297
1117
  return loadData(datas);
298
1118
  },
1119
+ getFullData() {
1120
+ const { fullData } = internalData;
1121
+ return fullData;
1122
+ },
299
1123
  recalculate,
300
1124
  scrollTo,
301
1125
  refreshScroll,
302
- clearScroll
1126
+ clearScroll,
1127
+ getRowKey,
1128
+ eqRowKey,
1129
+ eqRow,
1130
+ eqRowByKey,
1131
+ findRow,
1132
+ findRowByKey,
1133
+ findRowIndexOf,
1134
+ findRowIndexOfByKey,
1135
+ isCheckedByRadioRowKey,
1136
+ isCheckedByRadioRow,
1137
+ isCheckedByCheckboxRowKey,
1138
+ isCheckedByCheckboxRow,
1139
+ setCurrentRow,
1140
+ setCurrentRowByKey,
1141
+ getCurrentRow,
1142
+ getCurrentRowKey,
1143
+ clearCurrentRow,
1144
+ setRadioRow,
1145
+ setRadioRowByKey,
1146
+ getRadioRow,
1147
+ getRadioRowKey,
1148
+ clearRadioRow,
1149
+ setCheckboxRow,
1150
+ setCheckboxRowByKey,
1151
+ getCheckboxRows,
1152
+ getCheckboxRowKeys,
1153
+ clearCheckboxRow,
1154
+ setAllCheckboxRow
1155
+ };
1156
+ const listPrivateMethods = {};
1157
+ Object.assign($xeList, listMethods, listPrivateMethods);
1158
+ const renderDragTip = () => {
1159
+ const { dragRow, dragTipText } = reactData;
1160
+ const dragOpts = computeDragOpts.value;
1161
+ const isDrag = computeIsDrag.value;
1162
+ const dRow = dragRow;
1163
+ if (isDrag) {
1164
+ return h('div', {
1165
+ class: 'vxe-list--drag-wrapper'
1166
+ }, [
1167
+ h('div', {
1168
+ ref: refDragRowLineElem,
1169
+ class: ['vxe-list--drag-row-line', {
1170
+ 'is--guides': dragOpts.showGuidesStatus
1171
+ }]
1172
+ }),
1173
+ dRow && dragOpts.showDragTip
1174
+ ? h('div', {
1175
+ ref: refDragTipElem,
1176
+ class: 'vxe-list--drag-sort-tip'
1177
+ }, [
1178
+ h('div', {
1179
+ class: 'vxe-list--drag-sort-tip-wrapper'
1180
+ }, [
1181
+ h('div', {
1182
+ class: 'vxe-list--drag-sort-tip-status'
1183
+ }, [
1184
+ h('span', {
1185
+ class: ['vxe-list--drag-sort-tip-normal-status', getIcon().LIST_DRAG_STATUS_NODE]
1186
+ }),
1187
+ h('span', {
1188
+ class: ['vxe-list--drag-sort-tip-disabled-status', getIcon().LIST_DRAG_DISABLED]
1189
+ })
1190
+ ]),
1191
+ h('div', {
1192
+ class: 'vxe-list--drag-sort-tip-content'
1193
+ }, dragTipText)
1194
+ ])
1195
+ ])
1196
+ : renderEmptyElement($xeList)
1197
+ ]);
1198
+ }
1199
+ return renderEmptyElement($xeList);
1200
+ };
1201
+ const renderRadio = (row, rowid, isChecked) => {
1202
+ const { showRadio } = props;
1203
+ const radioOpts = computeRadioOpts.value;
1204
+ const { showIcon, checkMethod, visibleMethod } = radioOpts;
1205
+ const isVisible = !visibleMethod || visibleMethod({ $list: $xeList, row });
1206
+ if (showRadio && showIcon && isVisible) {
1207
+ const isDisabled = checkMethod ? !checkMethod({ $list: $xeList, row }) : false;
1208
+ return h('div', {
1209
+ key: 'ct2',
1210
+ class: ['vxe-list--radio-option', {
1211
+ 'is--checked': isChecked,
1212
+ 'is--disabled': isDisabled
1213
+ }],
1214
+ onClick(evnt) {
1215
+ if (!isDisabled) {
1216
+ changeRadioEvent(evnt, row);
1217
+ }
1218
+ }
1219
+ }, [
1220
+ h('span', {
1221
+ class: ['vxe-radio--icon', isChecked ? getIcon().RADIO_CHECKED : getIcon().RADIO_UNCHECKED]
1222
+ })
1223
+ ]);
1224
+ }
1225
+ return renderEmptyElement($xeList);
1226
+ };
1227
+ const renderCheckbox = (row, rowid, isChecked) => {
1228
+ const { showCheckbox } = props;
1229
+ const checkboxOpts = computeCheckboxOpts.value;
1230
+ const { showIcon, checkMethod, visibleMethod } = checkboxOpts;
1231
+ const isVisible = !visibleMethod || visibleMethod({ $list: $xeList, row });
1232
+ if (showCheckbox && showIcon && isVisible) {
1233
+ const isDisabled = checkMethod ? !checkMethod({ $list: $xeList, row }) : false;
1234
+ return h('div', {
1235
+ key: 'ct3',
1236
+ class: ['vxe-list--checkbox-option', {
1237
+ 'is--checked': isChecked,
1238
+ 'is--disabled': isDisabled
1239
+ }],
1240
+ onClick(evnt) {
1241
+ if (!isDisabled) {
1242
+ changeCheckboxEvent(evnt, row);
1243
+ }
1244
+ }
1245
+ }, [
1246
+ h('span', {
1247
+ class: ['vxe-checkbox--icon', isChecked ? getIcon().CHECKBOX_CHECKED : getIcon().CHECKBOX_UNCHECKED]
1248
+ })
1249
+ ]);
1250
+ }
1251
+ return renderEmptyElement($xeList);
1252
+ };
1253
+ const renderRow = (row, rowIndex) => {
1254
+ const { showRadio, showCheckbox } = props;
1255
+ const { selectRadioRow, currRowFlag, updateCheckboxFlag } = reactData;
1256
+ const { selectCheckboxMaps, currentRow } = internalData;
1257
+ const contentSlot = slots.content;
1258
+ const dragOpts = computeDragOpts.value;
1259
+ const { trigger, icon, disabledMethod, visibleMethod } = dragOpts;
1260
+ const rowOpts = computeRowOpts.value;
1261
+ const { useKey, contentField, className: rowClassName, isCurrent } = rowOpts;
1262
+ const isDrag = computeIsDrag.value;
1263
+ const keyField = computeKeyField.value;
1264
+ const isRowFnCls = rowClassName && XEUtils.isFunction(rowClassName);
1265
+ const hasKey = keyField || useKey || isDrag || isCurrent || showRadio || showCheckbox;
1266
+ const rowKey = hasKey && keyField ? getRowIdByField(row, keyField) : '';
1267
+ const rowid = enModelValue(rowKey);
1268
+ const rowParams = { row, $list: $xeList };
1269
+ let isRadioChecked = false;
1270
+ if (showRadio) {
1271
+ isRadioChecked = selectRadioRow && (row === selectRadioRow || eqRowByKey(selectRadioRow, rowKey));
1272
+ }
1273
+ let isCheckboxChecked = false;
1274
+ if (showCheckbox) {
1275
+ isCheckboxChecked = !!(updateCheckboxFlag && selectCheckboxMaps[rowid]);
1276
+ }
1277
+ const ctVNs = [];
1278
+ let isDragDisabled = false;
1279
+ if (isDrag && keyField && (!visibleMethod || visibleMethod(rowParams))) {
1280
+ const handleOns = {};
1281
+ if (trigger !== 'row') {
1282
+ isDragDisabled = !!(disabledMethod && disabledMethod(rowParams));
1283
+ handleOns.onMousedown = (evnt) => {
1284
+ if (!isDragDisabled) {
1285
+ handleRowDragMousedownEvent(evnt, rowParams);
1286
+ }
1287
+ };
1288
+ handleOns.onMouseup = handleRowDragMouseupEvent;
1289
+ }
1290
+ ctVNs.push(h('div', {
1291
+ key: 'ct1',
1292
+ class: 'vxe-list--row-drag'
1293
+ }, [
1294
+ h('span', Object.assign({ class: 'vxe-list--drag-handle' }, handleOns), [
1295
+ h('i', {
1296
+ class: icon || getIcon().LIST_DRAG
1297
+ })
1298
+ ])
1299
+ ]));
1300
+ }
1301
+ if (showRadio) {
1302
+ ctVNs.push(renderRadio(row, rowid, isRadioChecked));
1303
+ }
1304
+ if (showCheckbox) {
1305
+ ctVNs.push(renderCheckbox(row, rowid, isCheckboxChecked));
1306
+ }
1307
+ ctVNs.push(h('div', {
1308
+ key: 'ct5',
1309
+ class: 'vxe-list--row-content'
1310
+ }, contentSlot ? contentSlot(rowParams) : (contentField ? getText(row[contentField]) : '')));
1311
+ const rowOns = {
1312
+ onMousedown(evnt) {
1313
+ handleRowMousedownEvent(evnt, row);
1314
+ },
1315
+ onMouseup: handleRowDragMouseupEvent,
1316
+ onClick(evnt) {
1317
+ handleRowClickEvent(evnt, row);
1318
+ },
1319
+ onDblclick(evnt) {
1320
+ handleRowDblclickEvent(evnt, row);
1321
+ }
1322
+ };
1323
+ // 拖拽行事件
1324
+ if (isDrag) {
1325
+ rowOns.onDragstart = handleRowDragDragstartEvent;
1326
+ rowOns.onDragend = handleRowDragDragendEvent;
1327
+ rowOns.onDragover = handleRowDragDragoverEvent;
1328
+ }
1329
+ return h('div', Object.assign({ key: hasKey && keyField ? rowid : rowIndex, class: ['vxe-list--row', isRowFnCls ? rowClassName(rowParams) : (rowClassName || ''), {
1330
+ 'is--drag-disabled': isDragDisabled,
1331
+ 'is--current': currRowFlag && currentRow && eqRowByKey(currentRow, rowKey),
1332
+ 'is-radio--checked': isRadioChecked,
1333
+ 'is-checkbox--checked': isCheckboxChecked
1334
+ }], rowid: hasKey && keyField ? rowid : undefined }, rowOns), ctVNs);
303
1335
  };
304
- Object.assign($xeList, listMethods);
305
1336
  const renderVN = () => {
306
- const { className, loading } = props;
307
- const { bodyHeight, topSpaceHeight, items } = reactData;
1337
+ const { showCheckbox, className, loading } = props;
1338
+ const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate } = reactData;
308
1339
  const defaultSlot = slots.default;
1340
+ const headerSlot = slots.header;
1341
+ const footerSlot = slots.footer;
309
1342
  const vSize = computeSize.value;
310
- const styles = computeStyles.value;
1343
+ const wrapperStyles = computeWrapperStyles.value;
1344
+ const virtualStyles = computeVirtualStyles.value;
1345
+ const radioOpts = computeRadioOpts.value;
1346
+ const checkboxOpts = computeCheckboxOpts.value;
1347
+ const { showHeader, headerTitle } = checkboxOpts;
1348
+ const dragOpts = computeDragOpts.value;
1349
+ const { trigger } = dragOpts;
1350
+ const rowOpts = computeRowOpts.value;
1351
+ const { isHover, padding } = rowOpts;
1352
+ const isDrag = computeIsDrag.value;
1353
+ const showDefChekboxHead = showCheckbox && showHeader !== false;
311
1354
  return h('div', {
312
1355
  ref: refElem,
313
1356
  class: ['vxe-list', className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '', {
314
1357
  [`size--${vSize}`]: vSize,
1358
+ 'is--drag': isDrag,
315
1359
  'is--loading': loading
316
- }]
1360
+ }],
1361
+ style: wrapperStyles
317
1362
  }, [
1363
+ headerSlot || showDefChekboxHead
1364
+ ? h('div', {
1365
+ ref: refHeaderElem,
1366
+ class: 'vxe-list--header-wrapper'
1367
+ }, [
1368
+ showDefChekboxHead
1369
+ ? h('div', {
1370
+ class: 'vxe-list--header-left'
1371
+ }, [
1372
+ h('div', {
1373
+ class: ['vxe-list--checkbox-header', {
1374
+ 'is--checked': isAllChecked,
1375
+ 'is--indeterminate': isAllIndeterminate
1376
+ }],
1377
+ onClick: changeCheckboxAllEvent
1378
+ }, [
1379
+ h('span', {
1380
+ class: ['vxe-checkbox--icon', isAllChecked ? getIcon().CHECKBOX_CHECKED : (isAllIndeterminate ? getIcon().CHECKBOX_INDETERMINATE : getIcon().CHECKBOX_UNCHECKED)]
1381
+ }),
1382
+ h('span', {
1383
+ class: 'vxe-checkbox--label'
1384
+ }, XEUtils.eqNull(headerTitle) ? getI18n('vxe.list.allChecked') : getText(headerTitle))
1385
+ ])
1386
+ ])
1387
+ : renderEmptyElement($xeList),
1388
+ headerSlot
1389
+ ? h('div', {
1390
+ class: 'vxe-list--header-content'
1391
+ }, headerSlot({ items: rowList, $list: $xeList }))
1392
+ : renderEmptyElement($xeList)
1393
+ ])
1394
+ : renderEmptyElement($xeList),
318
1395
  h('div', {
319
1396
  ref: refVirtualWrapper,
320
1397
  class: 'vxe-list--virtual-wrapper',
321
- style: styles,
1398
+ style: virtualStyles,
322
1399
  onScroll: scrollEvent
323
1400
  }, [
324
1401
  h('div', {
@@ -329,12 +1406,28 @@ export default defineVxeComponent({
329
1406
  }),
330
1407
  h('div', {
331
1408
  ref: refVirtualBody,
332
- class: 'vxe-list--body',
1409
+ class: ['vxe-list--body', {
1410
+ 'trigger--row': trigger === 'row',
1411
+ 'checkbox--highlight': checkboxOpts.highlight,
1412
+ 'radio--highlight': radioOpts.highlight,
1413
+ 'row--hover': isHover,
1414
+ 'is--padding': padding
1415
+ }],
333
1416
  style: {
334
1417
  marginTop: topSpaceHeight ? `${topSpaceHeight}px` : ''
335
1418
  }
336
- }, defaultSlot ? defaultSlot({ items, $list: $xeList }) : [])
1419
+ }, defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => renderRow(row, i)))
337
1420
  ]),
1421
+ footerSlot
1422
+ ? h('div', {
1423
+ ref: refFooterElem,
1424
+ class: 'vxe-list--footer-wrapper'
1425
+ }, footerSlot({ items: rowList, $list: $xeList }))
1426
+ : renderEmptyElement($xeList),
1427
+ /**
1428
+ * 拖拽提示
1429
+ */
1430
+ renderDragTip(),
338
1431
  /**
339
1432
  * 加载中
340
1433
  */
@@ -354,17 +1447,36 @@ export default defineVxeComponent({
354
1447
  watch(dataFlag, () => {
355
1448
  loadData(props.data || []);
356
1449
  });
1450
+ const reFlag = ref(0);
357
1451
  watch(() => props.height, () => {
358
- recalculate();
1452
+ reFlag.value++;
359
1453
  });
360
1454
  watch(() => props.maxHeight, () => {
361
- recalculate();
1455
+ reFlag.value++;
1456
+ });
1457
+ watch(() => props.syncResize, () => {
1458
+ reFlag.value++;
1459
+ });
1460
+ watch(computeRowHeight, () => {
1461
+ reFlag.value++;
362
1462
  });
363
- watch(() => props.syncResize, (value) => {
364
- if (value) {
1463
+ watch(reFlag, () => {
1464
+ nextTick(() => {
365
1465
  recalculate();
366
- nextTick(() => setTimeout(() => recalculate()));
367
- }
1466
+ });
1467
+ });
1468
+ watch(() => props.checkRowKey, () => {
1469
+ updateRadioModeValue();
1470
+ });
1471
+ const checkKeyFlag = ref(0);
1472
+ watch(() => props.checkRowKeys ? props.checkRowKeys.length : -1, () => {
1473
+ checkKeyFlag.value++;
1474
+ });
1475
+ watch(() => props.checkRowKeys, () => {
1476
+ checkKeyFlag.value++;
1477
+ });
1478
+ watch(checkKeyFlag, () => {
1479
+ updateCheckboxModeValue();
368
1480
  });
369
1481
  onActivated(() => {
370
1482
  recalculate().then(() => refreshScroll());
@@ -373,7 +1485,25 @@ export default defineVxeComponent({
373
1485
  loadData(props.data || []);
374
1486
  });
375
1487
  onMounted(() => {
376
- recalculate();
1488
+ const { showRadio, showCheckbox } = props;
1489
+ const rowOpts = computeRowOpts.value;
1490
+ const { useKey } = rowOpts;
1491
+ const isDrag = computeIsDrag.value;
1492
+ const keyField = computeKeyField.value;
1493
+ if (!keyField) {
1494
+ if (showRadio) {
1495
+ errLog('vxe.error.reqSupportProp', ['show-radio', 'row-config.keyField']);
1496
+ }
1497
+ if (showCheckbox) {
1498
+ errLog('vxe.error.reqSupportProp', ['show-checkbox', 'row-config.keyField']);
1499
+ }
1500
+ if (isDrag) {
1501
+ errLog('vxe.error.reqSupportProp', ['drag-config', 'row-config.keyField']);
1502
+ }
1503
+ }
1504
+ if (useKey && !keyField) {
1505
+ errLog('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField']);
1506
+ }
377
1507
  if (props.autoResize) {
378
1508
  const el = refElem.value;
379
1509
  const resizeObserver = globalResize.create(() => recalculate());
@@ -383,6 +1513,7 @@ export default defineVxeComponent({
383
1513
  }
384
1514
  internalData.resizeObserver = resizeObserver;
385
1515
  }
1516
+ recalculate();
386
1517
  globalEvents.on($xeList, 'resize', recalculate);
387
1518
  });
388
1519
  onBeforeUnmount(() => {