vxe-table 3.14.0-beta.9 → 3.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/es/grid/src/grid.js +62 -42
  2. package/es/locale/lang/ar-EG.js +7 -1
  3. package/es/locale/lang/de-DE.js +7 -1
  4. package/es/locale/lang/en-US.js +7 -1
  5. package/es/locale/lang/es-ES.js +7 -1
  6. package/es/locale/lang/fr-FR.js +7 -1
  7. package/es/locale/lang/hu-HU.js +7 -1
  8. package/es/locale/lang/hy-AM.js +7 -1
  9. package/es/locale/lang/id-ID.js +7 -1
  10. package/es/locale/lang/it-IT.js +7 -1
  11. package/es/locale/lang/ja-JP.js +7 -1
  12. package/es/locale/lang/ko-KR.js +7 -1
  13. package/es/locale/lang/nb-NO.js +7 -1
  14. package/es/locale/lang/pt-BR.js +7 -1
  15. package/es/locale/lang/ru-RU.js +7 -1
  16. package/es/locale/lang/th-TH.js +7 -1
  17. package/es/locale/lang/ug-CN.js +7 -1
  18. package/es/locale/lang/uk-UA.js +7 -1
  19. package/es/locale/lang/vi-VN.js +7 -1
  20. package/es/locale/lang/zh-CHT.js +7 -1
  21. package/es/locale/lang/zh-CN.js +7 -1
  22. package/es/style.css +1 -1
  23. package/es/table/module/custom/mixin.js +4 -2
  24. package/es/table/module/custom/panel.js +24 -23
  25. package/es/table/module/edit/mixin.js +103 -68
  26. package/es/table/module/export/export-panel.js +5 -4
  27. package/es/table/module/export/import-panel.js +8 -7
  28. package/es/table/module/export/mixin.js +30 -27
  29. package/es/table/module/filter/panel.js +21 -10
  30. package/es/table/module/keyboard/mixin.js +141 -41
  31. package/es/table/module/menu/mixin.js +6 -3
  32. package/es/table/module/menu/panel.js +7 -7
  33. package/es/table/module/validator/mixin.js +2 -5
  34. package/es/table/render/index.js +2 -2
  35. package/es/table/src/body.js +43 -25
  36. package/es/table/src/cell.js +27 -22
  37. package/es/table/src/column.js +11 -9
  38. package/es/table/src/columnInfo.js +6 -6
  39. package/es/table/src/footer.js +12 -7
  40. package/es/table/src/group.js +6 -5
  41. package/es/table/src/header.js +15 -9
  42. package/es/table/src/methods.js +1047 -971
  43. package/es/table/src/props.js +4 -0
  44. package/es/table/src/table.js +100 -64
  45. package/es/table/src/util.js +55 -20
  46. package/es/toolbar/src/toolbar.js +3 -3
  47. package/es/ui/index.js +2 -1
  48. package/es/ui/src/log.js +1 -1
  49. package/helper/vetur/attributes.json +1 -1
  50. package/helper/vetur/tags.json +1 -1
  51. package/lib/grid/src/grid.js +69 -59
  52. package/lib/grid/src/grid.min.js +1 -1
  53. package/lib/index.umd.js +2006 -1686
  54. package/lib/index.umd.min.js +1 -1
  55. package/lib/locale/lang/ar-EG.js +7 -1
  56. package/lib/locale/lang/ar-EG.min.js +1 -1
  57. package/lib/locale/lang/de-DE.js +7 -1
  58. package/lib/locale/lang/de-DE.min.js +1 -1
  59. package/lib/locale/lang/en-US.js +7 -1
  60. package/lib/locale/lang/en-US.min.js +1 -1
  61. package/lib/locale/lang/en-US.umd.js +7 -1
  62. package/lib/locale/lang/es-ES.js +7 -1
  63. package/lib/locale/lang/es-ES.min.js +1 -1
  64. package/lib/locale/lang/es-ES.umd.js +7 -1
  65. package/lib/locale/lang/fr-FR.js +7 -1
  66. package/lib/locale/lang/fr-FR.min.js +1 -1
  67. package/lib/locale/lang/hu-HU.js +7 -1
  68. package/lib/locale/lang/hu-HU.min.js +1 -1
  69. package/lib/locale/lang/hu-HU.umd.js +7 -1
  70. package/lib/locale/lang/hy-AM.js +7 -1
  71. package/lib/locale/lang/hy-AM.min.js +1 -1
  72. package/lib/locale/lang/id-ID.js +7 -1
  73. package/lib/locale/lang/id-ID.min.js +1 -1
  74. package/lib/locale/lang/it-IT.js +7 -1
  75. package/lib/locale/lang/it-IT.min.js +1 -1
  76. package/lib/locale/lang/ja-JP.js +7 -1
  77. package/lib/locale/lang/ja-JP.min.js +1 -1
  78. package/lib/locale/lang/ja-JP.umd.js +7 -1
  79. package/lib/locale/lang/ko-KR.js +7 -1
  80. package/lib/locale/lang/ko-KR.min.js +1 -1
  81. package/lib/locale/lang/ko-KR.umd.js +7 -1
  82. package/lib/locale/lang/nb-NO.js +7 -1
  83. package/lib/locale/lang/nb-NO.min.js +1 -1
  84. package/lib/locale/lang/pt-BR.js +7 -1
  85. package/lib/locale/lang/pt-BR.min.js +1 -1
  86. package/lib/locale/lang/pt-BR.umd.js +7 -1
  87. package/lib/locale/lang/ru-RU.js +7 -1
  88. package/lib/locale/lang/ru-RU.min.js +1 -1
  89. package/lib/locale/lang/ru-RU.umd.js +7 -1
  90. package/lib/locale/lang/th-TH.js +7 -1
  91. package/lib/locale/lang/th-TH.min.js +1 -1
  92. package/lib/locale/lang/ug-CN.js +7 -1
  93. package/lib/locale/lang/ug-CN.min.js +1 -1
  94. package/lib/locale/lang/uk-UA.js +7 -1
  95. package/lib/locale/lang/uk-UA.min.js +1 -1
  96. package/lib/locale/lang/uk-UA.umd.js +7 -1
  97. package/lib/locale/lang/vi-VN.js +7 -1
  98. package/lib/locale/lang/vi-VN.min.js +1 -1
  99. package/lib/locale/lang/zh-CHT.js +7 -1
  100. package/lib/locale/lang/zh-CHT.min.js +1 -1
  101. package/lib/locale/lang/zh-CHT.umd.js +7 -1
  102. package/lib/locale/lang/zh-CN.js +7 -1
  103. package/lib/locale/lang/zh-CN.min.js +1 -1
  104. package/lib/locale/lang/zh-CN.umd.js +7 -1
  105. package/lib/style.css +1 -1
  106. package/lib/table/module/custom/mixin.js +5 -3
  107. package/lib/table/module/custom/mixin.min.js +1 -1
  108. package/lib/table/module/custom/panel.js +22 -29
  109. package/lib/table/module/custom/panel.min.js +1 -1
  110. package/lib/table/module/edit/mixin.js +119 -105
  111. package/lib/table/module/edit/mixin.min.js +1 -1
  112. package/lib/table/module/export/export-panel.js +5 -4
  113. package/lib/table/module/export/export-panel.min.js +1 -1
  114. package/lib/table/module/export/import-panel.js +8 -7
  115. package/lib/table/module/export/import-panel.min.js +1 -1
  116. package/lib/table/module/export/mixin.js +35 -34
  117. package/lib/table/module/export/mixin.min.js +1 -1
  118. package/lib/table/module/filter/panel.js +16 -16
  119. package/lib/table/module/filter/panel.min.js +1 -1
  120. package/lib/table/module/keyboard/mixin.js +149 -47
  121. package/lib/table/module/keyboard/mixin.min.js +1 -1
  122. package/lib/table/module/menu/mixin.js +6 -3
  123. package/lib/table/module/menu/mixin.min.js +1 -1
  124. package/lib/table/module/menu/panel.js +7 -7
  125. package/lib/table/module/menu/panel.min.js +1 -1
  126. package/lib/table/module/validator/mixin.js +4 -10
  127. package/lib/table/module/validator/mixin.min.js +1 -1
  128. package/lib/table/render/index.js +3 -2
  129. package/lib/table/render/index.min.js +1 -1
  130. package/lib/table/src/body.js +51 -25
  131. package/lib/table/src/body.min.js +1 -1
  132. package/lib/table/src/cell.js +39 -23
  133. package/lib/table/src/cell.min.js +1 -1
  134. package/lib/table/src/column.js +11 -9
  135. package/lib/table/src/column.min.js +1 -1
  136. package/lib/table/src/columnInfo.js +6 -6
  137. package/lib/table/src/columnInfo.min.js +1 -1
  138. package/lib/table/src/footer.js +12 -5
  139. package/lib/table/src/footer.min.js +1 -1
  140. package/lib/table/src/group.js +6 -5
  141. package/lib/table/src/group.min.js +1 -1
  142. package/lib/table/src/header.js +16 -8
  143. package/lib/table/src/header.min.js +1 -1
  144. package/lib/table/src/methods.js +1219 -1151
  145. package/lib/table/src/methods.min.js +1 -1
  146. package/lib/table/src/props.js +4 -0
  147. package/lib/table/src/props.min.js +1 -1
  148. package/lib/table/src/table.js +108 -67
  149. package/lib/table/src/table.min.js +1 -1
  150. package/lib/table/src/util.js +62 -21
  151. package/lib/table/src/util.min.js +1 -1
  152. package/lib/toolbar/src/toolbar.js +3 -3
  153. package/lib/ui/index.js +2 -1
  154. package/lib/ui/index.min.js +1 -1
  155. package/lib/ui/src/log.js +1 -1
  156. package/lib/ui/src/log.min.js +1 -1
  157. package/package.json +2 -2
  158. package/packages/grid/src/grid.ts +75 -51
  159. package/packages/locale/lang/ar-EG.ts +7 -1
  160. package/packages/locale/lang/de-DE.ts +7 -1
  161. package/packages/locale/lang/en-US.ts +7 -1
  162. package/packages/locale/lang/es-ES.ts +7 -1
  163. package/packages/locale/lang/fr-FR.ts +7 -1
  164. package/packages/locale/lang/hu-HU.ts +7 -1
  165. package/packages/locale/lang/hy-AM.ts +7 -1
  166. package/packages/locale/lang/id-ID.ts +7 -1
  167. package/packages/locale/lang/it-IT.ts +7 -1
  168. package/packages/locale/lang/ja-JP.ts +7 -1
  169. package/packages/locale/lang/ko-KR.ts +7 -1
  170. package/packages/locale/lang/nb-NO.ts +7 -1
  171. package/packages/locale/lang/pt-BR.ts +7 -1
  172. package/packages/locale/lang/ru-RU.ts +7 -1
  173. package/packages/locale/lang/th-TH.ts +7 -1
  174. package/packages/locale/lang/ug-CN.ts +7 -1
  175. package/packages/locale/lang/uk-UA.ts +7 -1
  176. package/packages/locale/lang/vi-VN.ts +7 -1
  177. package/packages/locale/lang/zh-CHT.ts +7 -1
  178. package/packages/locale/lang/zh-CN.ts +7 -1
  179. package/packages/table/module/custom/mixin.ts +6 -3
  180. package/packages/table/module/custom/panel.ts +42 -37
  181. package/packages/table/module/edit/mixin.ts +139 -95
  182. package/packages/table/module/export/export-panel.ts +8 -5
  183. package/packages/table/module/export/import-panel.ts +11 -7
  184. package/packages/table/module/export/mixin.ts +37 -32
  185. package/packages/table/module/filter/panel.ts +25 -10
  186. package/packages/table/module/keyboard/mixin.ts +155 -49
  187. package/packages/table/module/menu/mixin.ts +12 -6
  188. package/packages/table/module/menu/panel.ts +10 -7
  189. package/packages/table/module/validator/mixin.ts +3 -6
  190. package/packages/table/render/index.ts +2 -2
  191. package/packages/table/src/body.ts +43 -25
  192. package/packages/table/src/cell.ts +27 -22
  193. package/packages/table/src/column.ts +14 -10
  194. package/packages/table/src/columnInfo.ts +9 -6
  195. package/packages/table/src/footer.ts +12 -7
  196. package/packages/table/src/group.ts +9 -5
  197. package/packages/table/src/header.ts +16 -9
  198. package/packages/table/src/methods.ts +1174 -1027
  199. package/packages/table/src/props.ts +16 -12
  200. package/packages/table/src/table.ts +117 -70
  201. package/packages/table/src/util.ts +65 -23
  202. package/packages/toolbar/src/toolbar.ts +3 -3
  203. package/packages/ui/index.ts +1 -0
  204. /package/es/{iconfont.1741336976538.ttf → iconfont.1743045564244.ttf} +0 -0
  205. /package/es/{iconfont.1741336976538.woff → iconfont.1743045564244.woff} +0 -0
  206. /package/es/{iconfont.1741336976538.woff2 → iconfont.1743045564244.woff2} +0 -0
  207. /package/lib/{iconfont.1741336976538.ttf → iconfont.1743045564244.ttf} +0 -0
  208. /package/lib/{iconfont.1741336976538.woff → iconfont.1743045564244.woff} +0 -0
  209. /package/lib/{iconfont.1741336976538.woff2 → iconfont.1743045564244.woff2} +0 -0
@@ -3,10 +3,11 @@ import { browse, getTpImg, isPx, isScale, hasClass, addClass, removeClass, getEv
3
3
  import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue } from '../../ui/src/utils';
4
4
  import { VxeUI } from '../../ui';
5
5
  import Cell from './cell';
6
- import { getRowUniqueId, clearTableAllStatus, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleRowidOrRow, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getColReMinWidth, updateDeepRowKey, updateFastRowKey, getRefElem } from './util';
6
+ import { getRowUniqueId, clearTableAllStatus, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleRowidOrRow, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getColReMinWidth, createHandleUpdateRowId, createHandleGetRowId, getRefElem } from './util';
7
7
  import { getSlotVNs } from '../../ui/src/vn';
8
8
  import { warnLog, errLog } from '../../ui/src/log';
9
9
  const { getConfig, getI18n, renderer, formats, interceptor, createEvent } = VxeUI;
10
+ const supportMaxRow = 5e6;
10
11
  const customStorageKey = 'VXE_CUSTOM_STORE';
11
12
  const maxYHeight = 5e6;
12
13
  const maxXWidth = 5e6;
@@ -218,7 +219,7 @@ function cacheColumnMap($xeTable) {
218
219
  }
219
220
  else {
220
221
  if ((storage && !type) || (columnOpts.drag && (isCrossDrag || isSelfToChildDrag))) {
221
- errLog('vxe.error.reqProp', [`${column.getTitle() || type || ''} -> column.field`]);
222
+ errLog('vxe.error.reqProp', [`${column.getTitle() || type || ''} -> column.field=?`]);
222
223
  }
223
224
  }
224
225
  if (!hasFixed && fixed) {
@@ -303,12 +304,12 @@ const updateScrollYStatus = ($xeTable, fullData) => {
303
304
  const reactData = $xeTable;
304
305
  const internalData = $xeTable;
305
306
  const { treeConfig } = props;
306
- const sYOpts = $xeTable.computeSYOpts;
307
+ const virtualYOpts = $xeTable.computeVirtualYOpts;
307
308
  const treeOpts = $xeTable.computeTreeOpts;
308
309
  const { transform } = treeOpts;
309
310
  const allList = fullData || internalData.tableFullData;
310
311
  // 如果gt为0,则总是启用
311
- const scrollYLoad = (transform || !treeConfig) && !!sYOpts.enabled && sYOpts.gt > -1 && (sYOpts.gt === 0 || sYOpts.gt < allList.length);
312
+ const scrollYLoad = (transform || !treeConfig) && !!virtualYOpts.enabled && virtualYOpts.gt > -1 && (virtualYOpts.gt === 0 || virtualYOpts.gt < allList.length);
312
313
  reactData.scrollYLoad = scrollYLoad;
313
314
  return scrollYLoad;
314
315
  };
@@ -317,9 +318,10 @@ function updateAfterListIndex($xeTable) {
317
318
  const internalData = $xeTable;
318
319
  const { treeConfig } = props;
319
320
  const { afterFullData, fullDataRowIdData, fullAllDataRowIdData } = internalData;
321
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
320
322
  const fullMaps = {};
321
323
  afterFullData.forEach((row, index) => {
322
- const rowid = getRowid($xeTable, row);
324
+ const rowid = handleGetRowId(row);
323
325
  const rowRest = fullAllDataRowIdData[rowid];
324
326
  const seq = index + 1;
325
327
  if (rowRest) {
@@ -351,8 +353,9 @@ function updateAfterDataIndex($xeTable) {
351
353
  const childrenField = treeOpts.children || treeOpts.childrenField;
352
354
  const fullMaps = {};
353
355
  if (treeConfig) {
356
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
354
357
  XEUtils.eachTree(afterTreeFullData, (row, index, items, path) => {
355
- const rowid = getRowid($xeTable, row);
358
+ const rowid = handleGetRowId(row);
356
359
  const rowRest = fullAllDataRowIdData[rowid];
357
360
  const seq = path.map((num, i) => i % 2 === 0 ? (Number(num) + 1) : '.').join('');
358
361
  if (rowRest) {
@@ -379,19 +382,18 @@ function updateAfterDataIndex($xeTable) {
379
382
  */
380
383
  function handleVirtualTreeToList($xeTable) {
381
384
  const props = $xeTable;
382
- const reactData = $xeTable;
383
385
  const internalData = $xeTable;
384
386
  const { treeConfig } = props;
385
- const { treeExpandedMaps } = reactData;
386
- const { fullAllDataRowIdData } = internalData;
387
+ const { fullAllDataRowIdData, treeExpandedMaps } = internalData;
387
388
  const treeOpts = $xeTable.computeTreeOpts;
388
389
  const childrenField = treeOpts.children || treeOpts.childrenField;
389
390
  if (treeConfig && treeOpts.transform) {
391
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
390
392
  const fullData = [];
391
393
  const expandMaps = {};
392
394
  XEUtils.eachTree(internalData.afterTreeFullData, (row, index, items, path, parentRow) => {
393
- const rowid = getRowid($xeTable, row);
394
- const parentRowid = getRowid($xeTable, parentRow);
395
+ const rowid = handleGetRowId(row);
396
+ const parentRowid = handleGetRowId(parentRow);
395
397
  if (!parentRow || (expandMaps[parentRowid] && treeExpandedMaps[parentRowid])) {
396
398
  const rowRest = fullAllDataRowIdData[rowid];
397
399
  if (rowRest) {
@@ -411,9 +413,9 @@ function updateStyle($xeTable) {
411
413
  const props = $xeTable;
412
414
  const reactData = $xeTable;
413
415
  const internalData = $xeTable;
414
- const { border, showHeaderOverflow: allColumnHeaderOverflow, showFooterOverflow: allColumnFooterOverflow, mouseConfig, spanMethod, footerSpanMethod } = props;
416
+ const { showHeaderOverflow: allColumnHeaderOverflow, showFooterOverflow: allColumnFooterOverflow, mouseConfig, spanMethod, footerSpanMethod } = props;
415
417
  const { isGroup, currentRow, tableColumn, scrollXLoad, scrollYLoad, overflowX, scrollbarWidth, overflowY, scrollbarHeight, scrollXWidth, columnStore, editStore, isAllOverflow, expandColumn } = reactData;
416
- const { visibleColumn, fullColumnIdData, tableHeight, headerHeight, footerHeight, elemStore, customHeight, customMinHeight, customMaxHeight } = internalData;
418
+ const { visibleColumn, tableHeight, headerHeight, footerHeight, elemStore, customHeight, customMinHeight, customMaxHeight } = internalData;
417
419
  const el = $xeTable.$refs.refElem;
418
420
  if (!el) {
419
421
  return;
@@ -422,7 +424,6 @@ function updateStyle($xeTable) {
422
424
  const osbWidth = overflowY ? scrollbarWidth : 0;
423
425
  const osbHeight = overflowX ? scrollbarHeight : 0;
424
426
  const emptyPlaceholderElem = $xeTable.$refs.refEmptyPlaceholder;
425
- const cellOffsetWidth = $xeTable.computeCellOffsetWidth;
426
427
  const mouseOpts = $xeTable.computeMouseOpts;
427
428
  const expandOpts = $xeTable.computeExpandOpts;
428
429
  const bodyWrapperElem = getRefElem(elemStore['main-body-wrapper']);
@@ -565,32 +566,6 @@ function updateStyle($xeTable) {
565
566
  if (tableElem) {
566
567
  tableElem.style.width = tWidth ? `${tWidth}px` : '';
567
568
  }
568
- const listElem = getRefElem(elemStore[`${name}-${layout}-list`]);
569
- if (isGroup && listElem) {
570
- XEUtils.arrayEach(listElem.querySelectorAll('.col--group'), (thElem) => {
571
- const colNode = $xeTable.getColumnNode(thElem);
572
- if (colNode) {
573
- const column = colNode.item;
574
- const { showHeaderOverflow } = column;
575
- const cellOverflow = XEUtils.isBoolean(showHeaderOverflow) ? showHeaderOverflow : allColumnHeaderOverflow;
576
- const showEllipsis = cellOverflow === 'ellipsis';
577
- const showTitle = cellOverflow === 'title';
578
- const showTooltip = cellOverflow === true || cellOverflow === 'tooltip';
579
- const hasEllipsis = showTitle || showTooltip || showEllipsis;
580
- let childWidth = 0;
581
- let countChild = 0;
582
- if (hasEllipsis) {
583
- XEUtils.eachTree(column.children, (item) => {
584
- if (!item.children || !column.children.length) {
585
- countChild++;
586
- }
587
- childWidth += item.renderWidth;
588
- }, { children: 'children' });
589
- }
590
- thElem.style.width = hasEllipsis ? `${childWidth - countChild - (border ? 2 : 0)}px` : '';
591
- }
592
- });
593
- }
594
569
  }
595
570
  else if (layout === 'body') {
596
571
  if (currScrollElem) {
@@ -690,56 +665,6 @@ function updateStyle($xeTable) {
690
665
  tableElem.style.width = tWidth ? `${tWidth}px` : '';
691
666
  }
692
667
  }
693
- const colgroupElem = getRefElem(elemStore[`${name}-${layout}-colgroup`]);
694
- if (colgroupElem) {
695
- XEUtils.arrayEach(colgroupElem.children, (colElem) => {
696
- const colid = colElem.getAttribute('name');
697
- if (fullColumnIdData[colid]) {
698
- const colRest = fullColumnIdData[colid];
699
- const column = colRest.column;
700
- const { showHeaderOverflow, showFooterOverflow, showOverflow } = column;
701
- let cellOverflow;
702
- colElem.style.width = `${column.renderWidth}px`;
703
- if (layout === 'header') {
704
- cellOverflow = XEUtils.isUndefined(showHeaderOverflow) || XEUtils.isNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow;
705
- }
706
- else if (layout === 'footer') {
707
- cellOverflow = XEUtils.isUndefined(showFooterOverflow) || XEUtils.isNull(showFooterOverflow) ? allColumnFooterOverflow : showFooterOverflow;
708
- }
709
- else {
710
- cellOverflow = XEUtils.isUndefined(showOverflow) || XEUtils.isNull(showOverflow) ? isAllOverflow : showOverflow;
711
- }
712
- const showEllipsis = cellOverflow === 'ellipsis';
713
- const showTitle = cellOverflow === 'title';
714
- const showTooltip = cellOverflow === true || cellOverflow === 'tooltip';
715
- let hasEllipsis = showTitle || showTooltip || showEllipsis;
716
- const listElem = getRefElem(elemStore[`${name}-${layout}-list`]);
717
- // 纵向虚拟滚动不支持动态行高
718
- if (scrollYLoad && !hasEllipsis) {
719
- hasEllipsis = true;
720
- }
721
- if (listElem) {
722
- XEUtils.arrayEach(listElem.querySelectorAll(`.${column.id}`), (elem) => {
723
- const colspan = parseInt(elem.getAttribute('colspan') || 1);
724
- const cellElem = elem.querySelector('.vxe-cell');
725
- let colWidth = column.renderWidth;
726
- if (cellElem) {
727
- if (colspan > 1) {
728
- const columnIndex = $xeTable.getColumnIndex(column);
729
- for (let index = 1; index < colspan; index++) {
730
- const nextColumn = $xeTable.getColumns(columnIndex + index);
731
- if (nextColumn) {
732
- colWidth += nextColumn.renderWidth;
733
- }
734
- }
735
- }
736
- cellElem.style.width = hasEllipsis ? `${colWidth - (cellOffsetWidth * colspan)}px` : '';
737
- }
738
- });
739
- }
740
- }
741
- });
742
- }
743
668
  });
744
669
  });
745
670
  if (currentRow) {
@@ -750,6 +675,125 @@ function updateStyle($xeTable) {
750
675
  }
751
676
  return $xeTable.$nextTick();
752
677
  }
678
+ function checkValidate($xeTable, type) {
679
+ if ($xeTable.triggerValidate) {
680
+ return $xeTable.triggerValidate(type);
681
+ }
682
+ return $xeTable.$nextTick();
683
+ }
684
+ /**
685
+ * 当单元格发生改变时
686
+ * 如果存在规则,则校验
687
+ */
688
+ function handleChangeCell($xeTable, evnt, params) {
689
+ checkValidate($xeTable, 'blur')
690
+ .catch((e) => e)
691
+ .then(() => {
692
+ $xeTable.handleEdit(params, evnt)
693
+ .then(() => checkValidate($xeTable, 'change'))
694
+ .catch((e) => e);
695
+ });
696
+ }
697
+ function handleDefaultSort($xeTable) {
698
+ const props = $xeTable;
699
+ const { sortConfig } = props;
700
+ if (sortConfig) {
701
+ const sortOpts = $xeTable.computeSortOpts;
702
+ let { defaultSort } = sortOpts;
703
+ if (defaultSort) {
704
+ if (!XEUtils.isArray(defaultSort)) {
705
+ defaultSort = [defaultSort];
706
+ }
707
+ if (defaultSort.length) {
708
+ (sortConfig.multiple ? defaultSort : defaultSort.slice(0, 1)).forEach((item, index) => {
709
+ const { field, order } = item;
710
+ if (field && order) {
711
+ const column = $xeTable.getColumnByField(field);
712
+ if (column && column.sortable) {
713
+ column.order = order;
714
+ column.sortTime = Date.now() + index;
715
+ }
716
+ }
717
+ });
718
+ if (!sortOpts.remote) {
719
+ $xeTable.handleTableData(true).then(updateStyle);
720
+ }
721
+ }
722
+ }
723
+ }
724
+ }
725
+ /**
726
+ * 处理默认勾选
727
+ */
728
+ function handleDefaultSelectionChecked($xeTable) {
729
+ const props = $xeTable;
730
+ const internalData = $xeTable;
731
+ const { checkboxConfig } = props;
732
+ if (checkboxConfig) {
733
+ const { fullDataRowIdData } = internalData;
734
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
735
+ const { checkAll, checkRowKeys } = checkboxOpts;
736
+ if (checkAll) {
737
+ handleCheckedAllCheckboxRow($xeTable, true, true);
738
+ }
739
+ else if (checkRowKeys) {
740
+ const defSelection = [];
741
+ checkRowKeys.forEach((rowid) => {
742
+ if (fullDataRowIdData[rowid]) {
743
+ defSelection.push(fullDataRowIdData[rowid].row);
744
+ }
745
+ });
746
+ handleCheckedCheckboxRow($xeTable, defSelection, true, true);
747
+ }
748
+ }
749
+ }
750
+ /**
751
+ * 处理单选框默认勾选
752
+ */
753
+ function handleDefaultRadioChecked($xeTable) {
754
+ const props = $xeTable;
755
+ const internalData = $xeTable;
756
+ const { radioConfig } = props;
757
+ if (radioConfig) {
758
+ const { fullDataRowIdData } = internalData;
759
+ const radioOpts = $xeTable.computeRadioOpts;
760
+ const { checkRowKey: rowid, reserve } = radioOpts;
761
+ if (rowid) {
762
+ if (fullDataRowIdData[rowid]) {
763
+ handleCheckedRadioRow(fullDataRowIdData[rowid].row, true);
764
+ }
765
+ if (reserve) {
766
+ const rowkey = getRowkey($xeTable);
767
+ internalData.radioReserveRow = { [rowkey]: rowid };
768
+ }
769
+ }
770
+ }
771
+ }
772
+ /**
773
+ * 处理默认展开行
774
+ */
775
+ function handleDefaultRowExpand($xeTable) {
776
+ const props = $xeTable;
777
+ const internalData = $xeTable;
778
+ const { expandConfig } = props;
779
+ if (expandConfig) {
780
+ const { fullDataRowIdData } = internalData;
781
+ const expandOpts = $xeTable.computeExpandOpts;
782
+ const { expandAll, expandRowKeys } = expandOpts;
783
+ if (expandAll) {
784
+ $xeTable.setAllRowExpand(true);
785
+ }
786
+ else if (expandRowKeys) {
787
+ const defExpandeds = [];
788
+ expandRowKeys.forEach((rowid) => {
789
+ if (fullDataRowIdData[rowid]) {
790
+ defExpandeds.push(fullDataRowIdData[rowid].row);
791
+ }
792
+ });
793
+ $xeTable.setRowExpand(defExpandeds, true);
794
+ }
795
+ }
796
+ }
753
797
  function handleRadioReserveRow($xeTable, row) {
754
798
  const internalData = $xeTable;
755
799
  const radioOpts = $xeTable.computeRadioOpts;
@@ -794,12 +838,12 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
794
838
  const reactData = $xeTable;
795
839
  const internalData = $xeTable;
796
840
  const { treeConfig } = props;
797
- const { selectCheckboxMaps } = reactData;
798
- const { afterFullData, checkboxReserveRowMap } = internalData;
841
+ const { afterFullData, checkboxReserveRowMap, selectCheckboxMaps } = internalData;
799
842
  const treeOpts = $xeTable.computeTreeOpts;
800
843
  const childrenField = treeOpts.children || treeOpts.childrenField;
801
844
  const checkboxOpts = $xeTable.computeCheckboxOpts;
802
845
  const { checkField, reserve, checkMethod } = checkboxOpts;
846
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
803
847
  // indeterminateField 仅支持读取
804
848
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
805
849
  const selectRowMaps = {};
@@ -811,7 +855,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
811
855
  const checkValFn = (row) => {
812
856
  if (isForce || (!checkMethod || checkMethod({ row }))) {
813
857
  if (checked) {
814
- selectRowMaps[getRowid($xeTable, row)] = row;
858
+ selectRowMaps[handleGetRowId(row)] = row;
815
859
  }
816
860
  XEUtils.set(row, checkField, checked);
817
861
  }
@@ -841,7 +885,8 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
841
885
  */
842
886
  XEUtils.eachTree(afterFullData, (row) => {
843
887
  if (isForce || (!checkMethod || checkMethod({ row }))) {
844
- selectRowMaps[getRowid($xeTable, row)] = row;
888
+ const rowid = handleGetRowId(row);
889
+ selectRowMaps[rowid] = row;
845
890
  }
846
891
  }, { children: childrenField });
847
892
  }
@@ -852,7 +897,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
852
897
  */
853
898
  if (!isForce && checkMethod) {
854
899
  XEUtils.eachTree(afterFullData, (row) => {
855
- const rowid = getRowid($xeTable, row);
900
+ const rowid = handleGetRowId(row);
856
901
  if (checkMethod({ row }) ? 0 : selectCheckboxMaps[rowid]) {
857
902
  selectRowMaps[rowid] = row;
858
903
  }
@@ -869,7 +914,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
869
914
  */
870
915
  if (!isForce && checkMethod) {
871
916
  afterFullData.forEach((row) => {
872
- const rowid = getRowid($xeTable, row);
917
+ const rowid = handleGetRowId(row);
873
918
  if (selectCheckboxMaps[rowid] || checkMethod({ row })) {
874
919
  selectRowMaps[rowid] = row;
875
920
  }
@@ -877,7 +922,8 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
877
922
  }
878
923
  else {
879
924
  afterFullData.forEach(row => {
880
- selectRowMaps[getRowid($xeTable, row)] = row;
925
+ const rowid = handleGetRowId(row);
926
+ selectRowMaps[rowid] = row;
881
927
  });
882
928
  }
883
929
  }
@@ -889,7 +935,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
889
935
  */
890
936
  if (!isForce && checkMethod) {
891
937
  afterFullData.forEach((row) => {
892
- const rowid = getRowid($xeTable, row);
938
+ const rowid = handleGetRowId(row);
893
939
  if (checkMethod({ row }) ? 0 : selectCheckboxMaps[rowid]) {
894
940
  selectRowMaps[rowid] = row;
895
941
  }
@@ -908,10 +954,10 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
908
954
  afterFullData.forEach((row) => handleCheckboxReserveRow($xeTable, row, false));
909
955
  }
910
956
  }
911
- reactData.selectCheckboxMaps = checkField ? {} : selectRowMaps;
957
+ reactData.updateCheckboxFlag++;
958
+ internalData.selectCheckboxMaps = checkField ? {} : selectRowMaps;
912
959
  reactData.isAllSelected = checked;
913
960
  reactData.isIndeterminate = false;
914
- reactData.treeIndeterminateMaps = {};
915
961
  internalData.treeIndeterminateRowMaps = {};
916
962
  $xeTable.checkSelectionStatus();
917
963
  return $xeTable.$nextTick();
@@ -922,8 +968,8 @@ function handleReserveStatus($xeTable) {
922
968
  const reactData = $xeTable;
923
969
  const internalData = $xeTable;
924
970
  const { treeConfig } = props;
925
- const { expandColumn, currentRow, selectCheckboxMaps, selectRadioRow, rowExpandedMaps, treeExpandedMaps } = reactData;
926
- const { fullDataRowIdData, fullAllDataRowIdData, radioReserveRow } = internalData;
971
+ const { expandColumn, currentRow, selectRadioRow } = reactData;
972
+ const { fullDataRowIdData, fullAllDataRowIdData, radioReserveRow, selectCheckboxMaps, treeExpandedMaps, rowExpandedMaps } = internalData;
927
973
  const expandOpts = $xeTable.computeExpandOpts;
928
974
  const treeOpts = $xeTable.computeTreeOpts;
929
975
  const radioOpts = $xeTable.computeRadioOpts;
@@ -940,7 +986,8 @@ function handleReserveStatus($xeTable) {
940
986
  }
941
987
  }
942
988
  // 复选框
943
- reactData.selectCheckboxMaps = getRecoverRowMaps($xeTable, selectCheckboxMaps); // 刷新多选行状态
989
+ internalData.selectCheckboxMaps = getRecoverRowMaps($xeTable, selectCheckboxMaps); // 刷新多选行状态
990
+ reactData.updateCheckboxFlag++;
944
991
  // 还原保留选中状态
945
992
  if (checkboxOpts.reserve) {
946
993
  handleCheckedCheckboxRow($xeTable, handleReserveRow($xeTable, internalData.checkboxReserveRowMap), true, true);
@@ -949,17 +996,161 @@ function handleReserveStatus($xeTable) {
949
996
  reactData.currentRow = null; // 刷新当前行状态
950
997
  }
951
998
  // 行展开
952
- reactData.rowExpandedMaps = expandColumn ? getRecoverRowMaps($xeTable, rowExpandedMaps) : {}; // 刷新行展开状态
999
+ internalData.rowExpandedMaps = expandColumn ? getRecoverRowMaps($xeTable, rowExpandedMaps) : {}; // 刷新行展开状态
1000
+ reactData.rowExpandedFlag++;
953
1001
  // 还原保留状态
954
1002
  if (expandColumn && expandOpts.reserve) {
955
1003
  $xeTable.setRowExpand(handleReserveRow($xeTable, internalData.rowExpandedReserveRowMap), true);
956
1004
  }
957
1005
  // 树展开
958
- reactData.treeExpandedMaps = treeConfig ? getRecoverRowMaps($xeTable, treeExpandedMaps) : {}; // 刷新树展开状态
1006
+ internalData.treeExpandedMaps = treeConfig ? getRecoverRowMaps($xeTable, treeExpandedMaps) : {}; // 刷新树展开状态
1007
+ reactData.treeExpandedFlag++;
959
1008
  if (treeConfig && treeOpts.reserve) {
960
1009
  $xeTable.setTreeExpand(handleReserveRow($xeTable, internalData.treeExpandedReserveRowMap), true);
961
1010
  }
962
1011
  }
1012
+ /**
1013
+ * 处理默认展开树节点
1014
+ */
1015
+ const handleDefaultTreeExpand = ($xeTable) => {
1016
+ const props = $xeTable;
1017
+ const internalData = $xeTable;
1018
+ const { treeConfig } = props;
1019
+ if (treeConfig) {
1020
+ const { tableFullData } = internalData;
1021
+ const treeOpts = $xeTable.computeTreeOpts;
1022
+ const { expandAll, expandRowKeys } = treeOpts;
1023
+ const childrenField = treeOpts.children || treeOpts.childrenField;
1024
+ if (expandAll) {
1025
+ $xeTable.setAllTreeExpand(true);
1026
+ }
1027
+ else if (expandRowKeys) {
1028
+ const defExpandeds = [];
1029
+ const rowkey = getRowkey($xeTable);
1030
+ expandRowKeys.forEach((rowid) => {
1031
+ const matchObj = XEUtils.findTree(tableFullData, item => rowid === XEUtils.get(item, rowkey), { children: childrenField });
1032
+ if (matchObj) {
1033
+ defExpandeds.push(matchObj.item);
1034
+ }
1035
+ });
1036
+ $xeTable.setTreeExpand(defExpandeds, true);
1037
+ }
1038
+ }
1039
+ };
1040
+ const handleAsyncTreeExpandChilds = ($xeTable, row) => {
1041
+ const reactData = $xeTable;
1042
+ const internalData = $xeTable;
1043
+ const treeOpts = $xeTable.computeTreeOpts;
1044
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
1045
+ const { transform, loadMethod } = treeOpts;
1046
+ const { checkStrictly } = checkboxOpts;
1047
+ return new Promise(resolve => {
1048
+ if (loadMethod) {
1049
+ const { fullAllDataRowIdData, treeExpandLazyLoadedMaps } = internalData;
1050
+ const rowid = getRowid($xeTable, row);
1051
+ const rowRest = fullAllDataRowIdData[rowid];
1052
+ treeExpandLazyLoadedMaps[rowid] = row;
1053
+ Promise.resolve(loadMethod({ $table: $xeTable, row })).then((childRecords) => {
1054
+ if (rowRest) {
1055
+ rowRest.treeLoaded = true;
1056
+ }
1057
+ if (treeExpandLazyLoadedMaps[rowid]) {
1058
+ delete treeExpandLazyLoadedMaps[rowid];
1059
+ }
1060
+ if (!XEUtils.isArray(childRecords)) {
1061
+ childRecords = [];
1062
+ }
1063
+ if (childRecords) {
1064
+ return $xeTable.loadTreeChildren(row, childRecords).then(childRows => {
1065
+ const { treeExpandedMaps } = internalData;
1066
+ if (childRows.length && !treeExpandedMaps[rowid]) {
1067
+ treeExpandedMaps[rowid] = row;
1068
+ }
1069
+ reactData.treeExpandedFlag++;
1070
+ // 如果当前节点已选中,则展开后子节点也被选中
1071
+ if (!checkStrictly && $xeTable.isCheckedByCheckboxRow(row)) {
1072
+ handleCheckedCheckboxRow($xeTable, childRows, true);
1073
+ }
1074
+ return $xeTable.$nextTick().then(() => {
1075
+ if (transform) {
1076
+ $xeTable.handleTableData();
1077
+ updateAfterDataIndex($xeTable);
1078
+ return $xeTable.$nextTick();
1079
+ }
1080
+ });
1081
+ });
1082
+ }
1083
+ }).catch(() => {
1084
+ const { treeExpandLazyLoadedMaps } = internalData;
1085
+ if (rowRest) {
1086
+ rowRest.treeLoaded = false;
1087
+ }
1088
+ if (treeExpandLazyLoadedMaps[rowid]) {
1089
+ delete treeExpandLazyLoadedMaps[rowid];
1090
+ }
1091
+ }).finally(() => {
1092
+ reactData.treeExpandedFlag++;
1093
+ $xeTable.$nextTick().then(() => $xeTable.recalculate()).then(() => resolve());
1094
+ });
1095
+ }
1096
+ else {
1097
+ resolve();
1098
+ }
1099
+ });
1100
+ };
1101
+ const handleTreeExpandReserve = ($xeTable, row, expanded) => {
1102
+ const internalData = $xeTable;
1103
+ const { treeExpandedReserveRowMap } = internalData;
1104
+ const treeOpts = $xeTable.computeTreeOpts;
1105
+ if (treeOpts.reserve) {
1106
+ const rowid = getRowid($xeTable, row);
1107
+ if (expanded) {
1108
+ treeExpandedReserveRowMap[rowid] = row;
1109
+ }
1110
+ else if (treeExpandedReserveRowMap[rowid]) {
1111
+ delete treeExpandedReserveRowMap[rowid];
1112
+ }
1113
+ }
1114
+ };
1115
+ const handleAsyncRowExpand = ($xeTable, row) => {
1116
+ const reactData = $xeTable;
1117
+ const internalData = $xeTable;
1118
+ return new Promise(resolve => {
1119
+ const expandOpts = $xeTable.computeExpandOpts;
1120
+ const { loadMethod } = expandOpts;
1121
+ if (loadMethod) {
1122
+ const { fullAllDataRowIdData, rowExpandLazyLoadedMaps } = internalData;
1123
+ const rowid = getRowid($xeTable, row);
1124
+ const rowRest = fullAllDataRowIdData[rowid];
1125
+ rowExpandLazyLoadedMaps[rowid] = row;
1126
+ loadMethod({ $table: $xeTable, row, rowIndex: $xeTable.getRowIndex(row), $rowIndex: $xeTable.getVMRowIndex(row) }).then(() => {
1127
+ const { rowExpandedMaps } = internalData;
1128
+ if (rowRest) {
1129
+ rowRest.expandLoaded = true;
1130
+ }
1131
+ rowExpandedMaps[rowid] = row;
1132
+ reactData.rowExpandedFlag++;
1133
+ }).catch(() => {
1134
+ if (rowRest) {
1135
+ rowRest.expandLoaded = false;
1136
+ }
1137
+ }).finally(() => {
1138
+ const { rowExpandLazyLoadedMaps } = internalData;
1139
+ if (rowExpandLazyLoadedMaps[rowid]) {
1140
+ delete rowExpandLazyLoadedMaps[rowid];
1141
+ }
1142
+ reactData.rowExpandedFlag++;
1143
+ $xeTable.$nextTick()
1144
+ .then(() => $xeTable.recalculate())
1145
+ .then(() => $xeTable.updateCellAreas())
1146
+ .then(() => resolve());
1147
+ });
1148
+ }
1149
+ else {
1150
+ resolve();
1151
+ }
1152
+ });
1153
+ };
963
1154
  function calcVarRowHeightConfig($xeTable, sizeKey, sizeEl) {
964
1155
  const reactData = $xeTable;
965
1156
  const { rowHeightStore } = reactData;
@@ -1022,12 +1213,13 @@ function handleVirtualYVisible($xeTable) {
1022
1213
  visibleSize = Math.ceil(clientHeight / defaultRowHeight) + 1;
1023
1214
  }
1024
1215
  else {
1216
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
1025
1217
  let leftIndex = 0;
1026
1218
  let rightIndex = afterFullData.length;
1027
1219
  while (leftIndex < rightIndex) {
1028
1220
  const rIndex = Math.floor((leftIndex + rightIndex) / 2);
1029
1221
  const row = afterFullData[rIndex];
1030
- const rowid = getRowid($xeTable, row);
1222
+ const rowid = handleGetRowId(row);
1031
1223
  const rowRest = fullAllDataRowIdData[rowid] || {};
1032
1224
  if (rowRest.oTop <= startTop) {
1033
1225
  leftIndex = rIndex + 1;
@@ -1039,7 +1231,7 @@ function handleVirtualYVisible($xeTable) {
1039
1231
  toVisibleIndex = Math.max(0, leftIndex < afterFullData.length ? leftIndex - 2 : 0);
1040
1232
  for (let rIndex = toVisibleIndex, rLen = afterFullData.length; rIndex < rLen; rIndex++) {
1041
1233
  const row = afterFullData[rIndex];
1042
- const rowid = getRowid($xeTable, row);
1234
+ const rowid = handleGetRowId(row);
1043
1235
  const rowRest = fullAllDataRowIdData[rowid] || {};
1044
1236
  visibleSize++;
1045
1237
  if (rowRest.oTop > endTop || visibleSize >= 100) {
@@ -1069,15 +1261,18 @@ function calculateMergerOffsetIndex(list, offsetItem, type) {
1069
1261
  }
1070
1262
  }
1071
1263
  }
1072
- function setMerges(_vm, merges, mList, rowList) {
1264
+ function setMerges($xeTable, merges, mList, rowList) {
1265
+ // const props = $xeTable
1266
+ const internalData = $xeTable;
1073
1267
  if (merges) {
1074
- const { treeConfig, visibleColumn } = _vm;
1268
+ // const { treeConfig } = props
1269
+ const { visibleColumn } = internalData;
1075
1270
  if (!XEUtils.isArray(merges)) {
1076
1271
  merges = [merges];
1077
1272
  }
1078
- if (treeConfig && merges.length) {
1079
- errLog('vxe.error.noTree', ['merge-cells | merge-footer-items']);
1080
- }
1273
+ // if (treeConfig && merges.length) {
1274
+ // errLog('vxe.error.noTree', ['merge-cells | merge-footer-items'])
1275
+ // }
1081
1276
  merges.forEach((item) => {
1082
1277
  let { row, col, rowspan, colspan } = item;
1083
1278
  if (rowList && XEUtils.isNumber(row)) {
@@ -1117,16 +1312,19 @@ function setMerges(_vm, merges, mList, rowList) {
1117
1312
  });
1118
1313
  }
1119
1314
  }
1120
- function removeMerges(_vm, merges, mList, rowList) {
1315
+ function removeMerges($xeTable, merges, mList, rowList) {
1316
+ // const props = $xeTable
1317
+ const internalData = $xeTable;
1121
1318
  const rest = [];
1122
1319
  if (merges) {
1123
- const { treeConfig, visibleColumn } = _vm;
1320
+ // const { treeConfig } = props
1321
+ const { visibleColumn } = internalData;
1124
1322
  if (!XEUtils.isArray(merges)) {
1125
1323
  merges = [merges];
1126
1324
  }
1127
- if (treeConfig && merges.length) {
1128
- errLog('vxe.error.noTree', ['merge-cells | merge-footer-items']);
1129
- }
1325
+ // if (treeConfig && merges.length) {
1326
+ // errLog('vxe.error.noTree', ['merge-cells | merge-footer-items'])
1327
+ // }
1130
1328
  merges.forEach((item) => {
1131
1329
  let { row, col } = item;
1132
1330
  if (rowList && XEUtils.isNumber(row)) {
@@ -1300,6 +1498,7 @@ function autoCellWidth($xeTable) {
1300
1498
  internalData.headerHeight = headerHeight;
1301
1499
  internalData.footerHeight = footerHeight;
1302
1500
  reactData.overflowX = overflowX;
1501
+ reactData.resizeWidthFlag++;
1303
1502
  updateColumnOffsetLeft($xeTable);
1304
1503
  updateHeight($xeTable);
1305
1504
  reactData.parentHeight = Math.max(internalData.headerHeight + footerHeight + 20, $xeTable.getParentHeight());
@@ -1327,8 +1526,9 @@ const calcCellHeight = ($xeTable) => {
1327
1526
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
1328
1527
  const el = $xeTable.$refs.refElem;
1329
1528
  if (!isAllOverflow && scrollYLoad && el) {
1529
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
1330
1530
  tableData.forEach(row => {
1331
- const rowid = getRowid($xeTable, row);
1531
+ const rowid = handleGetRowId(row);
1332
1532
  const rowRest = fullAllDataRowIdData[rowid];
1333
1533
  if (rowRest) {
1334
1534
  const height = calcCellAutoHeight(rowRest, el);
@@ -1569,9 +1769,10 @@ function hideDropTip($xeTable) {
1569
1769
  * @param {Event} evnt 事件
1570
1770
  * @param {Row} row 行对象
1571
1771
  */
1572
- function handleTooltip($xeTable, evnt, tdEl, overflowElem, tipElem, params) {
1772
+ function handleTooltip($xeTable, evnt, tdEl, overflowElem, params) {
1573
1773
  const reactData = $xeTable;
1574
- if (!overflowElem) {
1774
+ const tipOverEl = overflowElem || tdEl;
1775
+ if (!tipOverEl) {
1575
1776
  return $xeTable.$nextTick();
1576
1777
  }
1577
1778
  params.cell = tdEl;
@@ -1581,9 +1782,8 @@ function handleTooltip($xeTable, evnt, tdEl, overflowElem, tipElem, params) {
1581
1782
  const { showAll, contentMethod } = tooltipOpts;
1582
1783
  const customContent = contentMethod ? contentMethod(params) : null;
1583
1784
  const useCustom = contentMethod && !XEUtils.eqNull(customContent);
1584
- const content = useCustom ? customContent : XEUtils.toString(column.type === 'html' ? overflowElem.innerText : overflowElem.textContent).trim();
1585
- const isCellOverflow = overflowElem.scrollWidth > overflowElem.clientWidth;
1586
- if (content && (showAll || useCustom || isCellOverflow)) {
1785
+ const content = useCustom ? customContent : XEUtils.toString(column.type === 'html' ? tipOverEl.innerText : tipOverEl.textContent).trim();
1786
+ if (content && (showAll || useCustom || (tipOverEl.scrollWidth > tipOverEl.clientWidth))) {
1587
1787
  Object.assign(tooltipStore, {
1588
1788
  row,
1589
1789
  column,
@@ -1593,7 +1793,7 @@ function handleTooltip($xeTable, evnt, tdEl, overflowElem, tipElem, params) {
1593
1793
  $xeTable.$nextTick(() => {
1594
1794
  const $tooltip = $xeTable.$refs.refTooltip;
1595
1795
  if ($tooltip && $tooltip.open) {
1596
- $tooltip.open(isCellOverflow ? overflowElem : (tipElem || overflowElem), formatText(content));
1796
+ $tooltip.open(tipOverEl, formatText(content));
1597
1797
  }
1598
1798
  });
1599
1799
  }
@@ -1608,7 +1808,7 @@ function handleScrollToRowColumn($xeTable, fieldOrColumn, row) {
1608
1808
  }
1609
1809
  return $xeTable.$nextTick();
1610
1810
  }
1611
- const handleRowExpandReserve = ($xeTable, row, expanded) => {
1811
+ function handleRowExpandReserve($xeTable, row, expanded) {
1612
1812
  const internalData = $xeTable;
1613
1813
  const { rowExpandedReserveRowMap } = internalData;
1614
1814
  const expandOpts = $xeTable.computeExpandOpts;
@@ -1621,7 +1821,21 @@ const handleRowExpandReserve = ($xeTable, row, expanded) => {
1621
1821
  delete rowExpandedReserveRowMap[rowid];
1622
1822
  }
1623
1823
  }
1624
- };
1824
+ }
1825
+ function handleDefaultMergeCells($xeTable) {
1826
+ const props = $xeTable;
1827
+ const { mergeCells } = props;
1828
+ if (mergeCells) {
1829
+ $xeTable.setMergeCells(mergeCells);
1830
+ }
1831
+ }
1832
+ function handleDefaultMergeFooterItems($xeTable) {
1833
+ const props = $xeTable;
1834
+ const { mergeFooterItems } = props;
1835
+ if (mergeFooterItems) {
1836
+ $xeTable.setMergeFooterItems(mergeFooterItems);
1837
+ }
1838
+ }
1625
1839
  // 计算可视渲染相关数据
1626
1840
  function computeScrollLoad($xeTable) {
1627
1841
  const reactData = $xeTable;
@@ -1709,6 +1923,26 @@ function handleRecalculateLayout($xeTable, reFull) {
1709
1923
  }
1710
1924
  });
1711
1925
  }
1926
+ /**
1927
+ * 处理数据加载默认行为
1928
+ * 默认执行一次,除非被重置
1929
+ */
1930
+ function handleLoadDefaults($xeTable) {
1931
+ handleDefaultSelectionChecked($xeTable);
1932
+ handleDefaultRadioChecked($xeTable);
1933
+ handleDefaultRowExpand($xeTable);
1934
+ handleDefaultTreeExpand($xeTable);
1935
+ handleDefaultMergeCells($xeTable);
1936
+ handleDefaultMergeFooterItems($xeTable);
1937
+ $xeTable.$nextTick(() => setTimeout(() => $xeTable.recalculate()));
1938
+ }
1939
+ /**
1940
+ * 处理初始化的默认行为
1941
+ * 只会执行一次
1942
+ */
1943
+ function handleInitDefaults($xeTable) {
1944
+ handleDefaultSort($xeTable);
1945
+ }
1712
1946
  function handleTableColumn($xeTable) {
1713
1947
  const reactData = $xeTable;
1714
1948
  const internalData = $xeTable;
@@ -1768,13 +2002,13 @@ function parseColumns($xeTable, isReset) {
1768
2002
  const props = $xeTable;
1769
2003
  const reactData = $xeTable;
1770
2004
  const internalData = $xeTable;
1771
- const { showOverflow } = props;
1772
- const rowOpts = $xeTable.computeRowOpts;
2005
+ // const { showOverflow } = props
2006
+ // const rowOpts = $xeTable.computeRowOpts
1773
2007
  const leftList = [];
1774
2008
  const centerList = [];
1775
2009
  const rightList = [];
1776
2010
  const { isGroup, columnStore } = reactData;
1777
- const sXOpts = $xeTable.computeSXOpts;
2011
+ const virtualXOpts = $xeTable.computeVirtualXOpts;
1778
2012
  const { collectColumn, tableFullColumn, scrollXStore, fullColumnIdData } = internalData;
1779
2013
  // 如果是分组表头,如果子列全部被隐藏,则根列也隐藏
1780
2014
  if (isGroup) {
@@ -1838,32 +2072,32 @@ function parseColumns($xeTable, isReset) {
1838
2072
  }
1839
2073
  const visibleColumn = leftList.concat(centerList).concat(rightList);
1840
2074
  // 如果gt为0,则总是启用
1841
- const scrollXLoad = !!sXOpts.enabled && sXOpts.gt > -1 && (sXOpts.gt === 0 || sXOpts.gt < tableFullColumn.length);
2075
+ const scrollXLoad = !!virtualXOpts.enabled && virtualXOpts.gt > -1 && (virtualXOpts.gt === 0 || virtualXOpts.gt < tableFullColumn.length);
1842
2076
  reactData.hasFixedColumn = leftList.length > 0 || rightList.length > 0;
1843
2077
  Object.assign(columnStore, { leftList, centerList, rightList });
1844
2078
  if (scrollXLoad) {
1845
- if (showOverflow) {
1846
- if (!rowOpts.height) {
1847
- const errColumn = internalData.tableFullColumn.find(column => column.showOverflow === false);
1848
- if (errColumn) {
1849
- errLog('vxe.error.errProp', [`column[field="${errColumn.field}"].show-overflow=false`, 'show-overflow=true']);
1850
- }
1851
- }
1852
- }
1853
- if (process.env.NODE_ENV === 'development') {
1854
- // if (props.showHeader && !props.showHeaderOverflow) {
1855
- // warnLog('vxe.error.reqProp', ['show-header-overflow'])
1856
- // }
1857
- // if (props.showFooter && !props.showFooterOverflow) {
1858
- // warnLog('vxe.error.reqProp', ['show-footer-overflow'])
1859
- // }
1860
- if (props.spanMethod) {
1861
- warnLog('vxe.error.scrollErrProp', ['span-method']);
1862
- }
1863
- if (props.footerSpanMethod) {
1864
- warnLog('vxe.error.scrollErrProp', ['footer-span-method']);
1865
- }
1866
- }
2079
+ // if (showOverflow) {
2080
+ // if (!rowOpts.height) {
2081
+ // const errColumn = internalData.tableFullColumn.find(column => column.showOverflow === false)
2082
+ // if (errColumn) {
2083
+ // errLog('vxe.error.errProp', [`column[field="${errColumn.field}"].show-overflow=false`, 'show-overflow=true'])
2084
+ // }
2085
+ // }
2086
+ // }
2087
+ // if (process.env.NODE_ENV === 'development') {
2088
+ // if (props.showHeader && !props.showHeaderOverflow) {
2089
+ // warnLog('vxe.error.reqProp', ['show-header-overflow'])
2090
+ // }
2091
+ // if (props.showFooter && !props.showFooterOverflow) {
2092
+ // warnLog('vxe.error.reqProp', ['show-footer-overflow'])
2093
+ // }
2094
+ if (props.spanMethod) {
2095
+ warnLog('vxe.error.scrollErrProp', ['span-method']);
2096
+ }
2097
+ if (props.footerSpanMethod) {
2098
+ warnLog('vxe.error.scrollErrProp', ['footer-span-method']);
2099
+ }
2100
+ // }
1867
2101
  if (isReset) {
1868
2102
  const { visibleSize } = handleVirtualXVisible($xeTable);
1869
2103
  scrollXStore.startIndex = 0;
@@ -1975,6 +2209,35 @@ function loadScrollYData($xeTable) {
1975
2209
  }
1976
2210
  }
1977
2211
  }
2212
+ const createGetRowCacheProp = (prop) => {
2213
+ return function (row) {
2214
+ const $xeTable = this;
2215
+ const internalData = $xeTable;
2216
+ const { fullAllDataRowIdData } = internalData;
2217
+ if (row) {
2218
+ const rowid = getRowid($xeTable, row);
2219
+ const rowRest = fullAllDataRowIdData[rowid];
2220
+ if (rowRest) {
2221
+ return rowRest[prop];
2222
+ }
2223
+ }
2224
+ return -1;
2225
+ };
2226
+ };
2227
+ const createGetColumnCacheProp = (prop) => {
2228
+ return function (column) {
2229
+ const $xeTable = this;
2230
+ const internalData = $xeTable;
2231
+ const { fullColumnIdData } = internalData;
2232
+ if (column) {
2233
+ const colRest = fullColumnIdData[column.id];
2234
+ if (colRest) {
2235
+ return colRest[prop];
2236
+ }
2237
+ }
2238
+ return -1;
2239
+ };
2240
+ };
1978
2241
  function lazyScrollXData($xeTable) {
1979
2242
  const internalData = $xeTable;
1980
2243
  const { lxTimeout, lxRunTime, scrollXStore } = internalData;
@@ -2132,7 +2395,7 @@ function calcCellWidth($xeTable) {
2132
2395
  }
2133
2396
  function handleUpdateColResize($xeTable, evnt, params) {
2134
2397
  $xeTable.analyColumnWidth();
2135
- $xeTable.recalculate(true).then(() => {
2398
+ $xeTable.recalculate().then(() => {
2136
2399
  $xeTable.saveCustomStore('update:width');
2137
2400
  $xeTable.updateCellAreas();
2138
2401
  $xeTable.dispatchEvent('column-resizable-change', params, evnt);
@@ -2144,7 +2407,7 @@ function handleUpdateColResize($xeTable, evnt, params) {
2144
2407
  function handleUpdateRowResize($xeTable, evnt, params) {
2145
2408
  const reactData = $xeTable;
2146
2409
  reactData.resizeHeightFlag++;
2147
- $xeTable.recalculate(true).then(() => {
2410
+ $xeTable.recalculate().then(() => {
2148
2411
  $xeTable.updateCellAreas();
2149
2412
  $xeTable.dispatchEvent('row-resizable-change', params, evnt);
2150
2413
  setTimeout(() => $xeTable.recalculate(true), 300);
@@ -2165,16 +2428,17 @@ function updateColumnOffsetLeft($xeTable) {
2165
2428
  function updateRowOffsetTop($xeTable) {
2166
2429
  const reactData = $xeTable;
2167
2430
  const internalData = $xeTable;
2168
- const { expandColumn, rowExpandedMaps } = reactData;
2169
- const { afterFullData, fullAllDataRowIdData } = internalData;
2431
+ const { expandColumn } = reactData;
2432
+ const { afterFullData, fullAllDataRowIdData, rowExpandedMaps } = internalData;
2170
2433
  const expandOpts = $xeTable.computeExpandOpts;
2171
2434
  const rowOpts = $xeTable.computeRowOpts;
2172
2435
  const cellOpts = $xeTable.computeCellOpts;
2173
2436
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
2437
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
2174
2438
  let offsetTop = 0;
2175
2439
  for (let rIndex = 0, rLen = afterFullData.length; rIndex < rLen; rIndex++) {
2176
2440
  const row = afterFullData[rIndex];
2177
- const rowid = getRowid($xeTable, row);
2441
+ const rowid = handleGetRowId(row);
2178
2442
  const rowRest = fullAllDataRowIdData[rowid] || {};
2179
2443
  rowRest.oTop = offsetTop;
2180
2444
  offsetTop += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight;
@@ -2187,47 +2451,43 @@ function updateRowOffsetTop($xeTable) {
2187
2451
  function updateRowExpandStyle($xeTable) {
2188
2452
  const reactData = $xeTable;
2189
2453
  const internalData = $xeTable;
2190
- const { expandColumn, scrollYLoad, rowExpandedMaps } = reactData;
2454
+ const { expandColumn, scrollYLoad, scrollYTop, isScrollYBig } = reactData;
2191
2455
  const expandOpts = $xeTable.computeExpandOpts;
2192
2456
  const rowOpts = $xeTable.computeRowOpts;
2193
2457
  const cellOpts = $xeTable.computeCellOpts;
2194
2458
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
2195
2459
  const { mode } = expandOpts;
2196
2460
  if (expandColumn && mode === 'fixed') {
2197
- const { elemStore, afterFullData, fullAllDataRowIdData } = internalData;
2461
+ const { elemStore, fullAllDataRowIdData } = internalData;
2198
2462
  const rowExpandEl = $xeTable.$refs.refRowExpandElem;
2199
2463
  const bodyScrollElem = getRefElem(elemStore['main-body-scroll']);
2200
2464
  if (rowExpandEl && bodyScrollElem) {
2201
2465
  let isUpdateHeight = false;
2202
- if (scrollYLoad) {
2203
- let offsetTop = 0;
2204
- for (let rIndex = 0, rLen = afterFullData.length; rIndex < rLen; rIndex++) {
2205
- const row = afterFullData[rIndex];
2206
- const rowid = getRowid($xeTable, row);
2207
- const rowRest = fullAllDataRowIdData[rowid] || {};
2208
- rowRest.oTop = offsetTop;
2209
- offsetTop += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight;
2210
- // 是否展开行
2211
- if (expandColumn && rowExpandedMaps[rowid]) {
2212
- offsetTop += rowRest.expandHeight || expandOpts.height || 0;
2213
- }
2214
- }
2215
- }
2216
2466
  XEUtils.arrayEach(rowExpandEl.children, reEl => {
2217
2467
  const expandEl = reEl;
2218
2468
  const rowid = expandEl.getAttribute('rowid') || '';
2219
2469
  const rowRest = fullAllDataRowIdData[rowid];
2220
2470
  if (rowRest) {
2221
2471
  const expandHeight = expandEl.offsetHeight + 1;
2472
+ const trEl = bodyScrollElem.querySelector(`.vxe-body--row[rowid="${rowid}"]`);
2473
+ let offsetTop = 0;
2222
2474
  if (scrollYLoad) {
2223
- expandEl.style.top = toCssUnit(rowRest.oTop + (rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight));
2475
+ if (isScrollYBig && trEl) {
2476
+ offsetTop = trEl.offsetTop + trEl.offsetHeight;
2477
+ }
2478
+ else {
2479
+ offsetTop = rowRest.oTop + (rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight);
2480
+ }
2224
2481
  }
2225
2482
  else {
2226
- const trEl = bodyScrollElem.querySelector(`.vxe-body--row[rowid="${rowid}"]`);
2227
2483
  if (trEl) {
2228
- expandEl.style.top = toCssUnit(trEl.offsetTop + trEl.offsetHeight);
2484
+ offsetTop = trEl.offsetTop + trEl.offsetHeight;
2229
2485
  }
2230
2486
  }
2487
+ if (isScrollYBig) {
2488
+ offsetTop += scrollYTop;
2489
+ }
2490
+ expandEl.style.top = toCssUnit(offsetTop);
2231
2491
  if (!isUpdateHeight) {
2232
2492
  if (rowRest.expandHeight !== expandHeight) {
2233
2493
  isUpdateHeight = true;
@@ -2238,6 +2498,9 @@ function updateRowExpandStyle($xeTable) {
2238
2498
  });
2239
2499
  if (isUpdateHeight) {
2240
2500
  reactData.rowExpandHeightFlag++;
2501
+ $xeTable.$nextTick(() => {
2502
+ updateRowOffsetTop($xeTable);
2503
+ });
2241
2504
  }
2242
2505
  }
2243
2506
  }
@@ -2253,10 +2516,11 @@ function handleRowExpandScroll($xeTable) {
2253
2516
  }
2254
2517
  const Methods = {
2255
2518
  callSlot(slotFunc, params, h, vNodes) {
2519
+ const $xeTable = this;
2520
+ const $xeGrid = $xeTable.$xeGrid;
2256
2521
  if (slotFunc) {
2257
- const { $xegrid } = this;
2258
- if ($xegrid) {
2259
- return $xegrid.callSlot(slotFunc, params, h, vNodes);
2522
+ if ($xeGrid) {
2523
+ return $xeGrid.callSlot(slotFunc, params, h, vNodes);
2260
2524
  }
2261
2525
  if (XEUtils.isFunction(slotFunc)) {
2262
2526
  return getSlotVNs(slotFunc.call(this, params, h, vNodes));
@@ -2272,8 +2536,10 @@ const Methods = {
2272
2536
  * 获取父容器元素
2273
2537
  */
2274
2538
  getParentElem() {
2275
- const { $el, $xegrid } = this;
2276
- return $xegrid ? $xegrid.$el.parentNode : $el.parentNode;
2539
+ const $xeTable = this;
2540
+ const $xeGrid = $xeTable.$xeGrid;
2541
+ const { $el } = this;
2542
+ return $xeGrid ? $xeGrid.$el.parentNode : $el.parentNode;
2277
2543
  },
2278
2544
  /**
2279
2545
  * 获取父容器的高度
@@ -2306,8 +2572,9 @@ const Methods = {
2306
2572
  * 如果存在表尾合计滚动条,则需要排除滚动条高度
2307
2573
  */
2308
2574
  getExcludeHeight() {
2309
- const { $xegrid } = this;
2310
- return $xegrid ? $xegrid.getExcludeHeight() : 0;
2575
+ const $xeTable = this;
2576
+ const $xeGrid = $xeTable.$xeGrid;
2577
+ return $xeGrid ? $xeGrid.getExcludeHeight() : 0;
2311
2578
  },
2312
2579
  /**
2313
2580
  * 重置表格的一切数据状态
@@ -2380,15 +2647,23 @@ const Methods = {
2380
2647
  */
2381
2648
  loadTableData(datas, isReset) {
2382
2649
  const $xeTable = this;
2650
+ const props = $xeTable;
2383
2651
  const reactData = $xeTable;
2384
2652
  const internalData = $xeTable;
2385
- const { keepSource, treeConfig, treeOpts, editStore, scrollYStore, scrollXStore, lastScrollLeft, lastScrollTop, scrollYLoad: oldScrollYLoad, sXOpts, sYOpts } = this;
2653
+ const { keepSource, treeConfig } = props;
2654
+ const { scrollYLoad: oldScrollYLoad } = reactData;
2655
+ const { scrollYStore, scrollXStore, lastScrollLeft, lastScrollTop } = internalData;
2656
+ const treeOpts = $xeTable.computeTreeOpts;
2657
+ const { transform } = treeOpts;
2386
2658
  const childrenField = treeOpts.children || treeOpts.childrenField;
2387
2659
  let treeData = [];
2388
2660
  let fullData = datas ? datas.slice(0) : [];
2661
+ if (fullData.length > supportMaxRow) {
2662
+ errLog('vxe.error.errMaxRow', [supportMaxRow]);
2663
+ }
2389
2664
  if (treeConfig) {
2390
2665
  // 树结构自动转换
2391
- if (treeOpts.transform) {
2666
+ if (transform) {
2392
2667
  if (!treeOpts.rowField) {
2393
2668
  errLog('vxe.error.reqProp', ['table.tree-config.rowField']);
2394
2669
  }
@@ -2427,8 +2702,8 @@ const Methods = {
2427
2702
  scrollXStore.endIndex = 1;
2428
2703
  reactData.isRowLoading = true;
2429
2704
  reactData.scrollVMLoading = false;
2430
- editStore.insertMaps = {};
2431
- editStore.removeMaps = {};
2705
+ internalData.insertRowMaps = {};
2706
+ internalData.removeRowMaps = {};
2432
2707
  const sYLoad = updateScrollYStatus($xeTable, fullData);
2433
2708
  reactData.isDragColMove = false;
2434
2709
  reactData.isDragRowMove = false;
@@ -2446,15 +2721,15 @@ const Methods = {
2446
2721
  if (keepSource) {
2447
2722
  $xeTable.cacheSourceMap(fullData);
2448
2723
  }
2449
- if (this.clearCellAreas && this.mouseConfig) {
2450
- this.clearCellAreas();
2451
- this.clearCopyCellArea();
2724
+ if ($xeTable.clearCellAreas && props.mouseConfig) {
2725
+ $xeTable.clearCellAreas();
2726
+ $xeTable.clearCopyCellArea();
2452
2727
  }
2453
- this.clearMergeCells();
2454
- this.clearMergeFooterItems();
2455
- this.handleTableData(true);
2456
- this.updateFooter();
2457
- return this.$nextTick().then(() => {
2728
+ $xeTable.clearMergeCells();
2729
+ $xeTable.clearMergeFooterItems();
2730
+ $xeTable.handleTableData(true);
2731
+ $xeTable.updateFooter();
2732
+ return $xeTable.$nextTick().then(() => {
2458
2733
  updateHeight($xeTable);
2459
2734
  updateStyle($xeTable);
2460
2735
  }).then(() => {
@@ -2467,49 +2742,51 @@ const Methods = {
2467
2742
  if (sYLoad) {
2468
2743
  // if (showOverflow) {
2469
2744
  // if (!rowOpts.height) {
2470
- // const errColumn = this.tableFullColumn.find((column: any) => column.showOverflow === false)
2745
+ // const errColumn = internalData.tableFullColumn.find((column: any) => column.showOverflow === false)
2471
2746
  // if (errColumn) {
2472
2747
  // errLog('vxe.error.errProp', [`column[field="${errColumn.field}"].show-overflow=false`, 'show-overflow=true'])
2473
2748
  // }
2474
2749
  // }
2475
2750
  // }
2476
- if (!(this.height || this.maxHeight)) {
2751
+ if (!(props.height || props.maxHeight)) {
2477
2752
  errLog('vxe.error.reqProp', ['table.height | table.max-height | table.scroll-y={enabled: false}']);
2478
2753
  }
2479
- // if (!this.showOverflow) {
2754
+ // if (!props.showOverflow) {
2480
2755
  // warnLog('vxe.error.reqProp', ['table.show-overflow'])
2481
2756
  // }
2482
- if (this.spanMethod) {
2757
+ if (props.spanMethod) {
2483
2758
  errLog('vxe.error.scrollErrProp', ['table.span-method']);
2484
2759
  }
2485
2760
  }
2486
2761
  handleReserveStatus($xeTable);
2487
- this.checkSelectionStatus();
2762
+ $xeTable.checkSelectionStatus();
2488
2763
  return new Promise(resolve => {
2489
2764
  this.$nextTick()
2490
- .then(() => this.recalculate())
2765
+ .then(() => $xeTable.recalculate())
2491
2766
  .then(() => {
2492
2767
  let targetScrollLeft = lastScrollLeft;
2493
2768
  let targetScrollTop = lastScrollTop;
2769
+ const virtualXOpts = $xeTable.computeVirtualXOpts;
2770
+ const virtualYOpts = $xeTable.computeVirtualYOpts;
2494
2771
  // 是否在更新数据之后自动滚动重置滚动条
2495
- if (sXOpts.scrollToLeftOnChange) {
2772
+ if (virtualXOpts.scrollToLeftOnChange) {
2496
2773
  targetScrollLeft = 0;
2497
2774
  }
2498
- if (sYOpts.scrollToTopOnChange) {
2775
+ if (virtualYOpts.scrollToTopOnChange) {
2499
2776
  targetScrollTop = 0;
2500
2777
  }
2501
2778
  reactData.isRowLoading = false;
2502
2779
  calcCellHeight($xeTable);
2503
2780
  // 是否变更虚拟滚动
2504
2781
  if (oldScrollYLoad === sYLoad) {
2505
- restoreScrollLocation(this, targetScrollLeft, targetScrollTop)
2782
+ restoreScrollLocation($xeTable, targetScrollLeft, targetScrollTop)
2506
2783
  .then(() => {
2507
2784
  resolve();
2508
2785
  });
2509
2786
  }
2510
2787
  else {
2511
2788
  setTimeout(() => {
2512
- restoreScrollLocation(this, targetScrollLeft, targetScrollTop)
2789
+ restoreScrollLocation($xeTable, targetScrollLeft, targetScrollTop)
2513
2790
  .then(() => {
2514
2791
  resolve();
2515
2792
  });
@@ -2524,12 +2801,13 @@ const Methods = {
2524
2801
  * @param {Array} datas 数据
2525
2802
  */
2526
2803
  loadData(datas) {
2804
+ const $xeTable = this;
2527
2805
  const { initStatus } = this;
2528
2806
  return this.loadTableData(datas, false).then(() => {
2529
2807
  this.inited = true;
2530
2808
  this.initStatus = true;
2531
2809
  if (!initStatus) {
2532
- this.handleLoadDefaults();
2810
+ handleLoadDefaults($xeTable);
2533
2811
  }
2534
2812
  return this.recalculate();
2535
2813
  });
@@ -2539,6 +2817,7 @@ const Methods = {
2539
2817
  * @param {Array} datas 数据
2540
2818
  */
2541
2819
  reloadData(datas) {
2820
+ const $xeTable = this;
2542
2821
  return this.clearAll()
2543
2822
  .then(() => {
2544
2823
  this.inited = true;
@@ -2546,7 +2825,7 @@ const Methods = {
2546
2825
  return this.loadTableData(datas, true);
2547
2826
  })
2548
2827
  .then(() => {
2549
- this.handleLoadDefaults();
2828
+ handleLoadDefaults($xeTable);
2550
2829
  return this.recalculate();
2551
2830
  });
2552
2831
  },
@@ -2628,18 +2907,14 @@ const Methods = {
2628
2907
  const reactData = $xeTable;
2629
2908
  const internalData = $xeTable;
2630
2909
  const { treeConfig } = props;
2631
- const { treeExpandedMaps } = reactData;
2632
- const { fullAllDataRowIdData, tableFullData, tableFullTreeData } = internalData;
2910
+ const { fullAllDataRowIdData, tableFullData, tableFullTreeData, treeExpandedMaps } = internalData;
2633
2911
  const treeOpts = $xeTable.computeTreeOpts;
2634
2912
  const childrenField = treeOpts.children || treeOpts.childrenField;
2635
2913
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
2636
2914
  const { lazy } = treeOpts;
2637
- const rowkey = getRowkey($xeTable);
2638
- const isDeepKey = rowkey.indexOf('.') > -1;
2639
2915
  const fullAllDataRowIdMaps = Object.assign({}, fullAllDataRowIdData); // 存在已删除数据
2640
2916
  const fullDataRowIdMaps = {};
2641
- const treeTempExpandedMaps = Object.assign({}, treeExpandedMaps);
2642
- const handleRowId = isDeepKey ? updateDeepRowKey : updateFastRowKey;
2917
+ const { handleUpdateRowId } = createHandleUpdateRowId($xeTable);
2643
2918
  const handleRowCache = (row, index, items, currIndex, parentRow, rowid, level, seq) => {
2644
2919
  let rowRest = fullAllDataRowIdMaps[rowid];
2645
2920
  if (!rowRest) {
@@ -2658,15 +2933,14 @@ const Methods = {
2658
2933
  };
2659
2934
  if (treeConfig) {
2660
2935
  XEUtils.eachTree(tableFullTreeData, (row, index, items, path, parentRow, nodes) => {
2661
- const rowid = handleRowId(row, rowkey);
2936
+ const rowid = handleUpdateRowId(row);
2662
2937
  if (treeConfig && lazy) {
2663
- const treeExpRest = treeTempExpandedMaps[rowid];
2664
2938
  if (row[hasChildField] && row[childrenField] === undefined) {
2665
2939
  row[childrenField] = null;
2666
2940
  }
2667
- if (treeExpRest) {
2941
+ if (treeExpandedMaps[rowid]) {
2668
2942
  if (!row[childrenField] || !row[childrenField].length) {
2669
- delete treeTempExpandedMaps[rowid];
2943
+ delete treeExpandedMaps[rowid];
2670
2944
  }
2671
2945
  }
2672
2946
  }
@@ -2675,12 +2949,12 @@ const Methods = {
2675
2949
  }
2676
2950
  else {
2677
2951
  tableFullData.forEach((row, index, items) => {
2678
- handleRowCache(row, index, items, index, null, handleRowId(row, rowkey), 0, index + 1);
2952
+ handleRowCache(row, index, items, index, null, handleUpdateRowId(row), 0, index + 1);
2679
2953
  });
2680
2954
  }
2681
2955
  internalData.fullDataRowIdData = fullDataRowIdMaps;
2682
2956
  internalData.fullAllDataRowIdData = fullAllDataRowIdMaps;
2683
- reactData.treeExpandedMaps = treeTempExpandedMaps;
2957
+ reactData.treeExpandedFlag++;
2684
2958
  },
2685
2959
  cacheSourceMap(fullData) {
2686
2960
  const $xeTable = this;
@@ -2688,17 +2962,12 @@ const Methods = {
2688
2962
  const internalData = $xeTable;
2689
2963
  const { treeConfig } = props;
2690
2964
  const treeOpts = $xeTable.computeTreeOpts;
2691
- let { sourceDataRowIdData } = internalData;
2692
2965
  const sourceData = XEUtils.clone(fullData, true);
2693
- const rowkey = getRowkey($xeTable);
2694
- sourceDataRowIdData = internalData.sourceDataRowIdData = {};
2966
+ const { handleUpdateRowId } = createHandleUpdateRowId($xeTable);
2967
+ const sourceRowIdData = {};
2695
2968
  const handleSourceRow = (row) => {
2696
- let rowid = getRowid($xeTable, row);
2697
- if (eqEmptyValue(rowid)) {
2698
- rowid = getRowUniqueId();
2699
- XEUtils.set(row, rowkey, rowid);
2700
- }
2701
- sourceDataRowIdData[rowid] = row;
2969
+ const rowid = handleUpdateRowId(row);
2970
+ sourceRowIdData[rowid] = row;
2702
2971
  };
2703
2972
  // 源数据缓存
2704
2973
  if (treeConfig) {
@@ -2708,14 +2977,21 @@ const Methods = {
2708
2977
  else {
2709
2978
  sourceData.forEach(handleSourceRow);
2710
2979
  }
2980
+ internalData.sourceDataRowIdData = sourceRowIdData;
2711
2981
  internalData.tableSourceData = sourceData;
2712
2982
  },
2713
2983
  getParams() {
2714
- return this.params;
2984
+ const $xeTable = this;
2985
+ const props = $xeTable;
2986
+ return props.params;
2715
2987
  },
2716
2988
  loadTreeChildren(row, childRecords) {
2717
2989
  const $xeTable = this;
2718
- const { keepSource, tableSourceData, treeOpts, fullDataRowIdData, fullAllDataRowIdData, sourceDataRowIdData } = this;
2990
+ const props = $xeTable;
2991
+ const internalData = $xeTable;
2992
+ const { keepSource } = props;
2993
+ const { tableSourceData, fullDataRowIdData, fullAllDataRowIdData, sourceDataRowIdData } = internalData;
2994
+ const treeOpts = $xeTable.computeTreeOpts;
2719
2995
  const { transform, mapChildrenField } = treeOpts;
2720
2996
  const childrenField = treeOpts.children || treeOpts.childrenField;
2721
2997
  const parentRest = fullAllDataRowIdData[getRowid($xeTable, row)];
@@ -2752,18 +3028,22 @@ const Methods = {
2752
3028
  * @param {Element} tr 元素
2753
3029
  */
2754
3030
  getRowNode(tr) {
3031
+ const $xeTable = this;
3032
+ const internalData = $xeTable;
2755
3033
  if (tr) {
2756
- const { fullAllDataRowIdData } = this;
3034
+ const { fullAllDataRowIdData } = internalData;
2757
3035
  const rowid = tr.getAttribute('rowid');
2758
- const rowRest = fullAllDataRowIdData[rowid];
2759
- if (rowRest) {
2760
- return {
2761
- rowid: rowRest.rowid,
2762
- item: rowRest.row,
2763
- index: rowRest.index,
2764
- items: rowRest.items,
2765
- parent: rowRest.parent
2766
- };
3036
+ if (rowid) {
3037
+ const rowRest = fullAllDataRowIdData[rowid];
3038
+ if (rowRest) {
3039
+ return {
3040
+ rowid: rowRest.rowid,
3041
+ item: rowRest.row,
3042
+ index: rowRest.index,
3043
+ items: rowRest.items,
3044
+ parent: rowRest.parent
3045
+ };
3046
+ }
2767
3047
  }
2768
3048
  }
2769
3049
  return null;
@@ -2773,8 +3053,10 @@ const Methods = {
2773
3053
  * @param {Element} cell 元素
2774
3054
  */
2775
3055
  getColumnNode(cell) {
3056
+ const $xeTable = this;
3057
+ const internalData = $xeTable;
2776
3058
  if (cell) {
2777
- const { fullColumnIdData } = this;
3059
+ const { fullColumnIdData } = internalData;
2778
3060
  const colid = cell.getAttribute('colid');
2779
3061
  if (colid) {
2780
3062
  const colRest = fullColumnIdData[colid];
@@ -2795,47 +3077,22 @@ const Methods = {
2795
3077
  * 根据 row 获取序号
2796
3078
  * @param {Row} row 行对象
2797
3079
  */
2798
- getRowSeq(row) {
2799
- const { fullAllDataRowIdData } = this;
2800
- if (row) {
2801
- const rowid = getRowid(this, row);
2802
- const rest = fullAllDataRowIdData[rowid];
2803
- if (rest) {
2804
- return rest.seq;
2805
- }
2806
- }
2807
- return -1;
2808
- },
3080
+ getRowSeq: createGetRowCacheProp('seq'),
2809
3081
  /**
2810
3082
  * 根据 row 获取相对于 data 中的索引
2811
3083
  * @param {Row} row 行对象
2812
3084
  */
2813
- getRowIndex(row) {
2814
- const { fullAllDataRowIdData } = this;
2815
- if (row) {
2816
- const rowid = getRowid(this, row);
2817
- const rest = fullAllDataRowIdData[rowid];
2818
- if (rest) {
2819
- return rest.index;
2820
- }
2821
- }
2822
- return -1;
2823
- },
3085
+ getRowIndex: createGetRowCacheProp('index'),
2824
3086
  /**
2825
3087
  * 根据 row 获取相对于当前数据中的索引
2826
3088
  * @param {Row} row 行对象
2827
3089
  */
2828
- getVTRowIndex(row) {
2829
- const { fullAllDataRowIdData } = this;
2830
- if (row) {
2831
- const rowid = getRowid(this, row);
2832
- const rest = fullAllDataRowIdData[rowid];
2833
- if (rest) {
2834
- return rest._index;
2835
- }
2836
- }
2837
- return -1;
2838
- },
3090
+ getVTRowIndex: createGetRowCacheProp('_index'),
3091
+ /**
3092
+ * 根据 row 获取渲染中的虚拟索引
3093
+ * @param {Row} row 行对象
3094
+ */
3095
+ getVMRowIndex: createGetRowCacheProp('$index'),
2839
3096
  // 在 v3 中废弃
2840
3097
  _getRowIndex(row) {
2841
3098
  if (process.env.NODE_ENV === 'development') {
@@ -2843,21 +3100,6 @@ const Methods = {
2843
3100
  }
2844
3101
  return this.getVTRowIndex(row);
2845
3102
  },
2846
- /**
2847
- * 根据 row 获取渲染中的虚拟索引
2848
- * @param {Row} row 行对象
2849
- */
2850
- getVMRowIndex(row) {
2851
- const { fullAllDataRowIdData } = this;
2852
- if (row) {
2853
- const rowid = getRowid(this, row);
2854
- const rest = fullAllDataRowIdData[rowid];
2855
- if (rest) {
2856
- return rest.$index;
2857
- }
2858
- }
2859
- return -1;
2860
- },
2861
3103
  // 在 v3 中废弃
2862
3104
  $getRowIndex(row) {
2863
3105
  if (process.env.NODE_ENV === 'development') {
@@ -2869,30 +3111,17 @@ const Methods = {
2869
3111
  * 根据 column 获取相对于 columns 中的索引
2870
3112
  * @param {ColumnInfo} column 列配置
2871
3113
  */
2872
- getColumnIndex(column) {
2873
- const { fullColumnIdData } = this;
2874
- if (column) {
2875
- const rest = fullColumnIdData[column.id];
2876
- if (rest) {
2877
- return rest.index;
2878
- }
2879
- }
2880
- return -1;
2881
- },
3114
+ getColumnIndex: createGetColumnCacheProp('index'),
2882
3115
  /**
2883
3116
  * 根据 column 获取相对于当前表格列中的索引
2884
3117
  * @param {ColumnInfo} column 列配置
2885
3118
  */
2886
- getVTColumnIndex(column) {
2887
- const { fullColumnIdData } = this;
2888
- if (column) {
2889
- const rest = fullColumnIdData[column.id];
2890
- if (rest) {
2891
- return rest._index;
2892
- }
2893
- }
2894
- return -1;
2895
- },
3119
+ getVTColumnIndex: createGetColumnCacheProp('_index'),
3120
+ /**
3121
+ * 根据 column 获取渲染中的虚拟索引
3122
+ * @param {ColumnInfo} column 列配置
3123
+ */
3124
+ getVMColumnIndex: createGetColumnCacheProp('$index'),
2896
3125
  // 在 v3 中废弃
2897
3126
  _getColumnIndex(column) {
2898
3127
  if (process.env.NODE_ENV === 'development') {
@@ -2900,20 +3129,6 @@ const Methods = {
2900
3129
  }
2901
3130
  return this.getVTColumnIndex(column);
2902
3131
  },
2903
- /**
2904
- * 根据 column 获取渲染中的虚拟索引
2905
- * @param {ColumnInfo} column 列配置
2906
- */
2907
- getVMColumnIndex(column) {
2908
- const { fullColumnIdData } = this;
2909
- if (column) {
2910
- const rest = fullColumnIdData[column.id];
2911
- if (rest) {
2912
- return rest.$index;
2913
- }
2914
- }
2915
- return -1;
2916
- },
2917
3132
  // 在 v3 中废弃
2918
3133
  $getColumnIndex(column) {
2919
3134
  if (process.env.NODE_ENV === 'development') {
@@ -2933,14 +3148,21 @@ const Methods = {
2933
3148
  * @param {Row} records 行数据
2934
3149
  */
2935
3150
  defineField(records) {
2936
- const { radioOpts, checkboxOpts, treeConfig, treeOpts, expandOpts } = this;
3151
+ const $xeTable = this;
3152
+ const props = $xeTable;
3153
+ const internalData = $xeTable;
3154
+ const { treeConfig } = props;
3155
+ const expandOpts = $xeTable.computeExpandOpts;
3156
+ const treeOpts = $xeTable.computeTreeOpts;
3157
+ const radioOpts = $xeTable.computeRadioOpts;
3158
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
2937
3159
  const childrenField = treeOpts.children || treeOpts.childrenField;
2938
- const rowkey = getRowkey(this);
3160
+ const rowkey = getRowkey($xeTable);
2939
3161
  if (!XEUtils.isArray(records)) {
2940
3162
  records = [records || {}];
2941
3163
  }
2942
3164
  return records.map((record) => {
2943
- this.tableFullColumn.forEach((column) => {
3165
+ internalData.tableFullColumn.forEach(column => {
2944
3166
  const { field, editRender } = column;
2945
3167
  if (field && !XEUtils.has(record, field)) {
2946
3168
  let cellValue = null;
@@ -2978,8 +3200,9 @@ const Methods = {
2978
3200
  * @param {Array} records 新数据
2979
3201
  */
2980
3202
  createData(records) {
2981
- return this.$nextTick().then(() => {
2982
- return this.defineField(records);
3203
+ const $xeTable = this;
3204
+ return $xeTable.$nextTick().then(() => {
3205
+ return $xeTable.defineField(records);
2983
3206
  });
2984
3207
  },
2985
3208
  /**
@@ -2988,11 +3211,12 @@ const Methods = {
2988
3211
  * @param {Array/Object} records 新数据
2989
3212
  */
2990
3213
  createRow(records) {
3214
+ const $xeTable = this;
2991
3215
  const isArr = XEUtils.isArray(records);
2992
3216
  if (!isArr) {
2993
3217
  records = [records];
2994
3218
  }
2995
- return this.createData(records).then((rows) => isArr ? rows : rows[0]);
3219
+ return $xeTable.createData(records).then((rows) => isArr ? rows : rows[0]);
2996
3220
  },
2997
3221
  /**
2998
3222
  * 还原数据
@@ -3007,11 +3231,10 @@ const Methods = {
3007
3231
  const reactData = $xeTable;
3008
3232
  const internalData = $xeTable;
3009
3233
  const { keepSource, treeConfig } = props;
3010
- const { editStore } = reactData;
3011
- const { fullAllDataRowIdData, fullDataRowIdData, tableSourceData, sourceDataRowIdData, tableFullData, afterFullData } = internalData;
3012
- const removeTempMaps = Object.assign({}, editStore.removeMaps);
3234
+ const { fullAllDataRowIdData, fullDataRowIdData, tableSourceData, sourceDataRowIdData, tableFullData, afterFullData, removeRowMaps } = internalData;
3013
3235
  const treeOpts = $xeTable.computeTreeOpts;
3014
3236
  const { transform } = treeOpts;
3237
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
3015
3238
  if (!keepSource) {
3016
3239
  if (process.env.NODE_ENV === 'development') {
3017
3240
  errLog('vxe.error.reqProp', ['keep-source']);
@@ -3030,7 +3253,7 @@ const Methods = {
3030
3253
  let reDelFlag = false;
3031
3254
  if (targetRows.length) {
3032
3255
  targetRows.forEach((item) => {
3033
- const rowid = getRowid($xeTable, item);
3256
+ const rowid = handleGetRowId(item);
3034
3257
  const rowRest = fullAllDataRowIdData[rowid];
3035
3258
  if (rowRest) {
3036
3259
  const row = rowRest.row;
@@ -3044,7 +3267,9 @@ const Methods = {
3044
3267
  XEUtils.destructuring(row, XEUtils.clone(oRow, true));
3045
3268
  }
3046
3269
  if (!fullDataRowIdData[rowid] && $xeTable.isRemoveByRow(row)) {
3047
- delete removeTempMaps[rowid];
3270
+ if (removeRowMaps[rowid]) {
3271
+ delete removeRowMaps[rowid];
3272
+ }
3048
3273
  tableFullData.unshift(row);
3049
3274
  afterFullData.unshift(row);
3050
3275
  reDelFlag = true;
@@ -3056,7 +3281,7 @@ const Methods = {
3056
3281
  }
3057
3282
  if (rows) {
3058
3283
  if (reDelFlag) {
3059
- editStore.removeMaps = removeTempMaps;
3284
+ reactData.removeRowFlag++;
3060
3285
  $xeTable.updateFooter();
3061
3286
  $xeTable.cacheRowMap(false);
3062
3287
  $xeTable.handleTableData(treeConfig && transform);
@@ -3085,7 +3310,9 @@ const Methods = {
3085
3310
  * @param {String} field 字段名
3086
3311
  */
3087
3312
  clearData(rows, field) {
3088
- const { tableFullData, visibleColumn } = this;
3313
+ const $xeTable = this;
3314
+ const internalData = $xeTable;
3315
+ const { tableFullData, visibleColumn } = internalData;
3089
3316
  if (!arguments.length) {
3090
3317
  rows = tableFullData;
3091
3318
  }
@@ -3104,7 +3331,7 @@ const Methods = {
3104
3331
  });
3105
3332
  });
3106
3333
  }
3107
- return this.$nextTick();
3334
+ return $xeTable.$nextTick();
3108
3335
  },
3109
3336
  getCellElement(row, fieldOrColumn) {
3110
3337
  const $xeTable = this;
@@ -3195,16 +3422,16 @@ const Methods = {
3195
3422
  isInsertByRow(row) {
3196
3423
  const $xeTable = this;
3197
3424
  const reactData = $xeTable;
3198
- const { editStore } = reactData;
3425
+ const internalData = $xeTable;
3199
3426
  const rowid = getRowid($xeTable, row);
3200
- return !!editStore.insertMaps[rowid];
3427
+ return !!reactData.insertRowFlag && !!internalData.insertRowMaps[rowid];
3201
3428
  },
3202
3429
  isRemoveByRow(row) {
3203
3430
  const $xeTable = this;
3204
3431
  const reactData = $xeTable;
3205
- const { editStore } = reactData;
3432
+ const internalData = $xeTable;
3206
3433
  const rowid = getRowid($xeTable, row);
3207
- return !!editStore.removeMaps[rowid];
3434
+ return !!reactData.removeRowFlag && !!internalData.removeRowMaps[rowid];
3208
3435
  },
3209
3436
  /**
3210
3437
  * 删除所有新增的临时数据
@@ -3212,9 +3439,8 @@ const Methods = {
3212
3439
  */
3213
3440
  removeInsertRow() {
3214
3441
  const $xeTable = this;
3215
- const reactData = $xeTable;
3216
- const { editStore } = reactData;
3217
- editStore.insertMaps = {};
3442
+ const internalData = $xeTable;
3443
+ internalData.insertRowMaps = {};
3218
3444
  return $xeTable.remove($xeTable.getInsertRecords());
3219
3445
  },
3220
3446
  /**
@@ -3256,14 +3482,17 @@ const Methods = {
3256
3482
  * @param {Number} columnIndex 索引
3257
3483
  */
3258
3484
  getColumns(columnIndex) {
3259
- const columns = this.visibleColumn;
3260
- return XEUtils.isUndefined(columnIndex) ? columns.slice(0) : columns[columnIndex];
3485
+ const $xeTable = this;
3486
+ const internalData = $xeTable;
3487
+ const { visibleColumn } = internalData;
3488
+ return XEUtils.isUndefined(columnIndex) ? visibleColumn.slice(0) : visibleColumn[columnIndex];
3261
3489
  },
3262
3490
  /**
3263
3491
  * 根据列获取列的唯一主键
3264
3492
  */
3265
3493
  getColid(fieldOrColumn) {
3266
- const column = handleFieldOrColumn(this, fieldOrColumn);
3494
+ const $xeTable = this;
3495
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn);
3267
3496
  return column ? column.id : null;
3268
3497
  },
3269
3498
  /**
@@ -3271,7 +3500,9 @@ const Methods = {
3271
3500
  * @param {String} colid 列主键
3272
3501
  */
3273
3502
  getColumnById(colid) {
3274
- const fullColumnIdData = this.fullColumnIdData;
3503
+ const $xeTable = this;
3504
+ const internalData = $xeTable;
3505
+ const { fullColumnIdData } = internalData;
3275
3506
  return fullColumnIdData[colid] ? fullColumnIdData[colid].column : null;
3276
3507
  },
3277
3508
  /**
@@ -3279,7 +3510,9 @@ const Methods = {
3279
3510
  * @param {String} field 字段名
3280
3511
  */
3281
3512
  getColumnByField(field) {
3282
- const fullColumnFieldData = this.fullColumnFieldData;
3513
+ const $xeTable = this;
3514
+ const internalData = $xeTable;
3515
+ const { fullColumnFieldData } = internalData;
3283
3516
  return fullColumnFieldData[field] ? fullColumnFieldData[field].column : null;
3284
3517
  },
3285
3518
  getParentColumn(fieldOrColumn) {
@@ -3292,11 +3525,14 @@ const Methods = {
3292
3525
  * 收集到的全量列、全量表头列、处理条件之后的全量表头列、当前渲染中的表头列
3293
3526
  */
3294
3527
  getTableColumn() {
3528
+ const $xeTable = this;
3529
+ const reactData = $xeTable;
3530
+ const internalData = $xeTable;
3295
3531
  return {
3296
- collectColumn: this.collectColumn.slice(0),
3297
- fullColumn: this.tableFullColumn.slice(0),
3298
- visibleColumn: this.visibleColumn.slice(0),
3299
- tableColumn: this.tableColumn.slice(0)
3532
+ collectColumn: internalData.collectColumn.slice(0),
3533
+ fullColumn: internalData.tableFullColumn.slice(0),
3534
+ visibleColumn: internalData.visibleColumn.slice(0),
3535
+ tableColumn: reactData.tableColumn.slice(0)
3300
3536
  };
3301
3537
  },
3302
3538
  /**
@@ -3414,11 +3650,9 @@ const Methods = {
3414
3650
  getCheckboxRecords(isFull) {
3415
3651
  const $xeTable = this;
3416
3652
  const props = $xeTable;
3417
- const reactData = $xeTable;
3418
3653
  const internalData = $xeTable;
3419
3654
  const { treeConfig } = props;
3420
- const { selectCheckboxMaps } = reactData;
3421
- const { tableFullData, afterFullData, afterTreeFullData, tableFullTreeData, fullDataRowIdData, afterFullRowMaps } = internalData;
3655
+ const { tableFullData, afterFullData, afterTreeFullData, tableFullTreeData, fullDataRowIdData, afterFullRowMaps, selectCheckboxMaps } = internalData;
3422
3656
  const treeOpts = $xeTable.computeTreeOpts;
3423
3657
  const checkboxOpts = $xeTable.computeCheckboxOpts;
3424
3658
  const { transform, mapChildrenField } = treeOpts;
@@ -3466,7 +3700,7 @@ const Methods = {
3466
3700
  const treeOpts = $xeTable.computeTreeOpts;
3467
3701
  const childrenField = treeOpts.children || treeOpts.childrenField;
3468
3702
  const { transform, rowField, parentField, mapChildrenField } = treeOpts;
3469
- const { remote: allRemoteFilter, filterMethod: allFilterMethod } = filterOpts;
3703
+ const { isEvery, remote: allRemoteFilter, filterMethod: allFilterMethod } = filterOpts;
3470
3704
  const { remote: allRemoteSort, sortMethod: allSortMethod, multiple: sortMultiple, chronological } = sortOpts;
3471
3705
  let tableData = [];
3472
3706
  let tableTree = [];
@@ -3525,7 +3759,7 @@ const Methods = {
3525
3759
  // 筛选虚拟树
3526
3760
  tableTree = XEUtils.searchTree(tableFullTreeData, handleFilter, {
3527
3761
  original: true,
3528
- isEvery: true,
3762
+ isEvery,
3529
3763
  children: mapChildrenField,
3530
3764
  mapChildren: childrenField
3531
3765
  });
@@ -3541,7 +3775,7 @@ const Methods = {
3541
3775
  // 还原虚拟树
3542
3776
  tableTree = XEUtils.searchTree(tableFullTreeData, () => true, {
3543
3777
  original: true,
3544
- isEvery: true,
3778
+ isEvery,
3545
3779
  children: mapChildrenField,
3546
3780
  mapChildren: childrenField
3547
3781
  });
@@ -3604,7 +3838,7 @@ const Methods = {
3604
3838
  // 还原虚拟树
3605
3839
  tableTree = XEUtils.searchTree(tableFullTreeData, () => true, {
3606
3840
  original: true,
3607
- isEvery: true,
3841
+ isEvery,
3608
3842
  children: treeOpts.mapChildrenField,
3609
3843
  mapChildren: childrenField
3610
3844
  });
@@ -3711,9 +3945,14 @@ const Methods = {
3711
3945
  * 如果存在排序,继续处理
3712
3946
  */
3713
3947
  getTableData() {
3714
- const { treeConfig, tableFullData, afterFullData, tableData, footerTableData, tableFullTreeData } = this;
3948
+ const $xeTable = this;
3949
+ const props = $xeTable;
3950
+ const reactData = $xeTable;
3951
+ const internalData = $xeTable;
3952
+ const { tableData, footerTableData } = reactData;
3953
+ const { tableFullData, afterFullData, tableFullTreeData } = internalData;
3715
3954
  return {
3716
- fullData: treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0),
3955
+ fullData: props.treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0),
3717
3956
  visibleData: afterFullData.slice(0),
3718
3957
  tableData: tableData.slice(0),
3719
3958
  footerData: footerTableData.slice(0)
@@ -3751,35 +3990,16 @@ const Methods = {
3751
3990
  * 默认执行一次,除非被重置
3752
3991
  */
3753
3992
  handleLoadDefaults() {
3754
- if (this.checkboxConfig) {
3755
- this.handleDefaultSelectionChecked();
3756
- }
3757
- if (this.radioConfig) {
3758
- this.handleDefaultRadioChecked();
3759
- }
3760
- if (this.expandConfig) {
3761
- this.handleDefaultRowExpand();
3762
- }
3763
- if (this.treeConfig) {
3764
- this.handleDefaultTreeExpand();
3765
- }
3766
- if (this.mergeCells) {
3767
- this.handleDefaultMergeCells();
3768
- }
3769
- if (this.mergeFooterItems) {
3770
- this.handleDefaultMergeFooterItems();
3771
- }
3772
- this.$nextTick(() => setTimeout(this.recalculate));
3993
+ const $xeTable = this;
3994
+ handleLoadDefaults($xeTable);
3773
3995
  },
3774
3996
  /**
3775
3997
  * 处理初始化的默认行为
3776
3998
  * 只会执行一次
3777
3999
  */
3778
4000
  handleInitDefaults() {
3779
- const { sortConfig } = this;
3780
- if (sortConfig) {
3781
- this.handleDefaultSort();
3782
- }
4001
+ const $xeTable = this;
4002
+ handleInitDefaults($xeTable);
3783
4003
  },
3784
4004
  /**
3785
4005
  * 设置为固定列
@@ -3935,64 +4155,30 @@ const Methods = {
3935
4155
  return this.resetCustom(options);
3936
4156
  },
3937
4157
  handleCustom() {
3938
- const { mouseConfig } = this;
4158
+ const $xeTable = this;
4159
+ const props = $xeTable;
4160
+ const { mouseConfig } = props;
3939
4161
  if (mouseConfig) {
3940
- if (this.clearSelected) {
3941
- this.clearSelected();
3942
- }
3943
- if (this.clearCellAreas) {
3944
- this.clearCellAreas();
3945
- this.clearCopyCellArea();
3946
- }
3947
- }
3948
- this.analyColumnWidth();
3949
- return this.refreshColumn(true);
3950
- },
3951
- handleCustomRestore(storeData) {
3952
- const $xetable = this;
3953
- const reactData = $xetable;
3954
- const internalData = $xetable;
3955
- let { collectColumn } = internalData;
3956
- const { resizableData, sortData, visibleData, fixedData } = storeData;
3957
- let hasCustomSort = false;
3958
- // 处理还原
3959
- if (resizableData || sortData || visibleData || fixedData) {
3960
- XEUtils.eachTree(collectColumn, (column, index, items, path, parentRow) => {
3961
- const colKey = column.getKey();
3962
- // 支持一级
3963
- if (!parentRow) {
3964
- if (fixedData && fixedData[colKey] !== undefined) {
3965
- column.fixed = fixedData[colKey];
3966
- }
3967
- if (sortData && XEUtils.isNumber(sortData[colKey])) {
3968
- hasCustomSort = true;
3969
- column.renderSortNumber = sortData[colKey];
3970
- }
3971
- }
3972
- if (resizableData && XEUtils.isNumber(resizableData[colKey])) {
3973
- column.resizeWidth = resizableData[colKey];
3974
- }
3975
- if (visibleData && XEUtils.isBoolean(visibleData[colKey])) {
3976
- column.visible = visibleData[colKey];
3977
- }
3978
- });
3979
- // 如果自定义了顺序
3980
- if (hasCustomSort) {
3981
- collectColumn = XEUtils.orderBy(collectColumn, 'renderSortNumber');
3982
- internalData.collectColumn = collectColumn;
3983
- internalData.tableFullColumn = getColumnList(collectColumn);
4162
+ if ($xeTable.clearSelected) {
4163
+ $xeTable.clearSelected();
4164
+ }
4165
+ if ($xeTable.clearCellAreas) {
4166
+ $xeTable.clearCellAreas();
4167
+ $xeTable.clearCopyCellArea();
3984
4168
  }
3985
- reactData.isCustomStatus = true;
3986
- }
3987
- else {
3988
- reactData.isCustomStatus = false;
3989
4169
  }
4170
+ $xeTable.analyColumnWidth();
4171
+ return $xeTable.refreshColumn(true);
3990
4172
  },
3991
4173
  /**
3992
4174
  * 还原自定义列操作状态
3993
4175
  */
3994
4176
  restoreCustomStorage() {
3995
- const { tableId, customConfig, customOpts } = this;
4177
+ const $xeTable = this;
4178
+ const props = $xeTable;
4179
+ const { customConfig } = props;
4180
+ const tableId = $xeTable.computeTableId;
4181
+ const customOpts = $xeTable.computeCustomOpts;
3996
4182
  const { storage, restoreStore } = customOpts;
3997
4183
  const isAllCustom = storage === true;
3998
4184
  const storageOpts = isAllCustom ? {} : Object.assign({}, storage || {});
@@ -4011,17 +4197,28 @@ const Methods = {
4011
4197
  if (!storeData) {
4012
4198
  return;
4013
4199
  }
4014
- return this.handleCustomRestore(storeData);
4200
+ return handleCustomRestore($xeTable, storeData);
4015
4201
  }).catch(e => e);
4016
4202
  }
4017
4203
  else {
4018
- return this.handleCustomRestore(storeData);
4204
+ return handleCustomRestore($xeTable, storeData);
4019
4205
  }
4020
4206
  }
4021
4207
  },
4022
4208
  getCustomStoreData() {
4023
- const { id, customOpts, collectColumn } = this;
4024
- const { checkMethod } = customOpts;
4209
+ const $xeTable = this;
4210
+ const props = $xeTable;
4211
+ const internalData = $xeTable;
4212
+ const { id } = props;
4213
+ const customOpts = $xeTable.computeCustomOpts;
4214
+ const { collectColumn } = internalData;
4215
+ const { storage, checkMethod } = customOpts;
4216
+ const isAllCustom = storage === true;
4217
+ const storageOpts = isAllCustom ? {} : Object.assign({}, storage || {});
4218
+ const isCustomResizable = isAllCustom || storageOpts.resizable;
4219
+ const isCustomVisible = isAllCustom || storageOpts.visible;
4220
+ const isCustomFixed = isAllCustom || storageOpts.fixed;
4221
+ const isCustomSort = isAllCustom || storageOpts.sort;
4025
4222
  const resizableData = {};
4026
4223
  const sortData = {};
4027
4224
  const visibleData = {};
@@ -4038,47 +4235,37 @@ const Methods = {
4038
4235
  }
4039
4236
  let hasResizable = 0;
4040
4237
  let hasSort = 0;
4041
- let hasFixedt = 0;
4238
+ let hasFixed = 0;
4042
4239
  let hasVisible = 0;
4043
4240
  XEUtils.eachTree(collectColumn, (column, index, items, path, parentColumn) => {
4241
+ const colKey = column.getKey();
4242
+ if (!colKey) {
4243
+ errLog('vxe.error.reqProp', [`${column.getTitle() || column.type || ''} -> column.field=?`]);
4244
+ return;
4245
+ }
4044
4246
  // 只支持一级
4045
4247
  if (!parentColumn) {
4046
- collectColumn.forEach((column) => {
4047
- const colKey = column.getKey();
4048
- if (colKey) {
4049
- hasSort = 1;
4050
- sortData[colKey] = column.renderSortNumber;
4051
- }
4052
- });
4053
- if (column.fixed !== column.defaultFixed) {
4054
- const colKey = column.getKey();
4055
- if (colKey) {
4056
- hasFixedt = 1;
4057
- fixedData[colKey] = column.fixed;
4058
- }
4248
+ if (isCustomSort) {
4249
+ hasSort = 1;
4250
+ sortData[colKey] = column.renderSortNumber;
4059
4251
  }
4060
- }
4061
- if (column.resizeWidth) {
4062
- const colKey = column.getKey();
4063
- if (colKey) {
4064
- hasResizable = 1;
4065
- resizableData[colKey] = column.renderWidth;
4252
+ if (isCustomFixed && column.fixed !== column.defaultFixed) {
4253
+ hasFixed = 1;
4254
+ fixedData[colKey] = column.fixed;
4066
4255
  }
4067
4256
  }
4068
- if (!checkMethod || checkMethod({ column })) {
4257
+ if (isCustomResizable && column.resizeWidth) {
4258
+ hasResizable = 1;
4259
+ resizableData[colKey] = column.renderWidth;
4260
+ }
4261
+ if (isCustomVisible && (!checkMethod || checkMethod({ column }))) {
4069
4262
  if (!column.visible && column.defaultVisible) {
4070
- const colKey = column.getKey();
4071
- if (colKey) {
4072
- hasVisible = 1;
4073
- visibleData[colKey] = false;
4074
- }
4263
+ hasVisible = 1;
4264
+ visibleData[colKey] = false;
4075
4265
  }
4076
4266
  else if (column.visible && !column.defaultVisible) {
4077
- const colKey = column.getKey();
4078
- if (colKey) {
4079
- hasVisible = 1;
4080
- visibleData[colKey] = true;
4081
- }
4267
+ hasVisible = 1;
4268
+ visibleData[colKey] = true;
4082
4269
  }
4083
4270
  }
4084
4271
  });
@@ -4088,7 +4275,7 @@ const Methods = {
4088
4275
  if (hasSort) {
4089
4276
  storeData.sortData = sortData;
4090
4277
  }
4091
- if (hasFixedt) {
4278
+ if (hasFixed) {
4092
4279
  storeData.fixedData = fixedData;
4093
4280
  }
4094
4281
  if (hasVisible) {
@@ -4576,12 +4763,13 @@ const Methods = {
4576
4763
  const $xeTable = this;
4577
4764
  const internalData = $xeTable;
4578
4765
  const { fullAllDataRowIdData, afterFullData } = internalData;
4766
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
4579
4767
  const rowOpts = $xeTable.computeRowOpts;
4580
4768
  const cellOpts = $xeTable.computeCellOpts;
4581
4769
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
4582
4770
  const rest = {};
4583
4771
  afterFullData.forEach(row => {
4584
- const rowid = getRowid($xeTable, row);
4772
+ const rowid = handleGetRowId(row);
4585
4773
  const rowRest = fullAllDataRowIdData[rowid];
4586
4774
  if (rowRest) {
4587
4775
  const resizeHeight = rowRest.resizeHeight;
@@ -4608,8 +4796,9 @@ const Methods = {
4608
4796
  rHeight = Math.floor(rHeight * bodyHeight);
4609
4797
  }
4610
4798
  if (rHeight) {
4799
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
4611
4800
  rows.forEach(row => {
4612
- const rowid = XEUtils.isString(row) || XEUtils.isNumber(row) ? row : getRowid($xeTable, row);
4801
+ const rowid = XEUtils.isString(row) || XEUtils.isNumber(row) ? row : handleGetRowId(row);
4613
4802
  const rowRest = fullAllDataRowIdData[rowid];
4614
4803
  if (rowRest) {
4615
4804
  rowRest.resizeHeight = rHeight;
@@ -4750,6 +4939,8 @@ const Methods = {
4750
4939
  }
4751
4940
  },
4752
4941
  preventEvent(evnt, type, args, next, end) {
4942
+ const $xeTable = this;
4943
+ const $xeGrid = $xeTable.$xeGrid;
4753
4944
  let evntList = interceptor.get(type);
4754
4945
  // 兼容老版本
4755
4946
  if (!evntList.length && type === 'event.clearEdit') {
@@ -4761,8 +4952,22 @@ const Methods = {
4761
4952
  }
4762
4953
  }
4763
4954
  // 兼容老版本
4764
- let rest;
4765
- if (!evntList.some(func => func(Object.assign({ $grid: this.$xegrid, $table: this, $event: evnt }, args)) === false)) {
4955
+ let rest = null;
4956
+ let isStop = false;
4957
+ for (let i = 0; i < evntList.length; i++) {
4958
+ const func = evntList[i];
4959
+ const fnRest = func(Object.assign({ $grid: $xeGrid, $table: $xeTable, $event: evnt }, args));
4960
+ if (fnRest === false) {
4961
+ isStop = true;
4962
+ break;
4963
+ }
4964
+ else if (fnRest && fnRest.status === false) {
4965
+ rest = fnRest.result;
4966
+ isStop = true;
4967
+ break;
4968
+ }
4969
+ }
4970
+ if (!isStop) {
4766
4971
  if (next) {
4767
4972
  rest = next();
4768
4973
  }
@@ -4776,7 +4981,9 @@ const Methods = {
4776
4981
  * 全局按下事件处理
4777
4982
  */
4778
4983
  handleGlobalMousedownEvent(evnt) {
4779
- const { $el, $refs, $xegrid, $toolbar, mouseConfig, editStore, ctxMenuStore, editRules, editOpts, validOpts, areaOpts, filterStore, customStore, getRowNode } = this;
4984
+ const $xeTable = this;
4985
+ const $xeGrid = $xeTable.$xeGrid;
4986
+ const { $el, $refs, $toolbar, mouseConfig, editStore, ctxMenuStore, editRules, editOpts, validOpts, areaOpts, filterStore, customStore, getRowNode } = this;
4780
4987
  const { actived } = editStore;
4781
4988
  const { customWrapper, refValidTooltip } = $refs;
4782
4989
  const tableFilter = $refs.refTableFilter;
@@ -4866,7 +5073,7 @@ const Methods = {
4866
5073
  }
4867
5074
  }
4868
5075
  else if (mouseConfig) {
4869
- if (!getEventTargetNode(evnt, $el).flag && !($xegrid && getEventTargetNode(evnt, $xegrid.$el).flag) && !(tableMenu && getEventTargetNode(evnt, tableMenu.$el).flag) && !($toolbar && getEventTargetNode(evnt, $toolbar.$el).flag)) {
5076
+ if (!getEventTargetNode(evnt, $el).flag && !($xeGrid && getEventTargetNode(evnt, $xeGrid.$el).flag) && !(tableMenu && getEventTargetNode(evnt, tableMenu.$el).flag) && !($toolbar && getEventTargetNode(evnt, $toolbar.$el).flag)) {
4870
5077
  if (this.clearSelected) {
4871
5078
  this.clearSelected();
4872
5079
  }
@@ -4888,7 +5095,7 @@ const Methods = {
4888
5095
  if (ctxMenuStore.visible && tableMenu && !getEventTargetNode(evnt, tableMenu.$el).flag) {
4889
5096
  this.closeMenu();
4890
5097
  }
4891
- const isActivated = getEventTargetNode(evnt, ($xegrid || this).$el).flag;
5098
+ const isActivated = getEventTargetNode(evnt, ($xeGrid || this).$el).flag;
4892
5099
  // 如果存在校验,点击了表格之外则清除
4893
5100
  if (!isActivated && editRules && validOpts.autoClear) {
4894
5101
  this.validErrorMaps = {};
@@ -4952,6 +5159,7 @@ const Methods = {
4952
5159
  handleGlobalKeydownEvent(evnt) {
4953
5160
  const $xeTable = this;
4954
5161
  const internalData = $xeTable;
5162
+ const $xeGrid = $xeTable.$xeGrid;
4955
5163
  // 该行为只对当前激活的表格有效
4956
5164
  if (this.isActivated) {
4957
5165
  this.preventEvent(evnt, 'event.keydown', null, () => {
@@ -5050,7 +5258,7 @@ const Methods = {
5050
5258
  this.moveTabSelected(activeParams, hasShiftKey, evnt);
5051
5259
  }
5052
5260
  else {
5053
- this.moveSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt);
5261
+ this.moveEnterSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt);
5054
5262
  }
5055
5263
  }
5056
5264
  else {
@@ -5084,7 +5292,7 @@ const Methods = {
5084
5292
  return;
5085
5293
  }
5086
5294
  }
5087
- this.moveSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt);
5295
+ this.moveEnterSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt);
5088
5296
  if (enterMethod) {
5089
5297
  enterMethod(etrParams);
5090
5298
  }
@@ -5110,11 +5318,7 @@ const Methods = {
5110
5318
  if (!isEditStatus) {
5111
5319
  // 如果按下了方向键
5112
5320
  if (selected.row && selected.column) {
5113
- this.moveSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt);
5114
- }
5115
- else if ((isUpArrow || isDwArrow) && (rowOpts.isCurrent || highlightCurrentRow)) {
5116
- // 当前行按键上下移动
5117
- this.moveCurrentRow(isUpArrow, isDwArrow, evnt);
5321
+ $xeTable.moveArrowSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt);
5118
5322
  }
5119
5323
  }
5120
5324
  }
@@ -5137,7 +5341,7 @@ const Methods = {
5137
5341
  column: selected.column,
5138
5342
  columnIndex: this.getColumnIndex(selected.column),
5139
5343
  $table: this,
5140
- $grid: this.$xegrid
5344
+ $grid: $xeGrid
5141
5345
  };
5142
5346
  // 是否被禁用
5143
5347
  if (!beforeEditMethod || beforeEditMethod(params)) {
@@ -5164,7 +5368,7 @@ const Methods = {
5164
5368
  column: selected.column,
5165
5369
  columnIndex: this.getColumnIndex(selected.column),
5166
5370
  $table: this,
5167
- $grid: this.$xegrid
5371
+ $grid: $xeGrid
5168
5372
  };
5169
5373
  // 是否被禁用
5170
5374
  if (!beforeEditMethod || beforeEditMethod(params)) {
@@ -5193,7 +5397,7 @@ const Methods = {
5193
5397
  rowIndex: this.getRowIndex(parentRow),
5194
5398
  $rowIndex: this.getVMRowIndex(parentRow),
5195
5399
  $table: this,
5196
- $grid: this.$xegrid
5400
+ $grid: $xeGrid
5197
5401
  };
5198
5402
  this.setTreeExpand(parentRow, false)
5199
5403
  .then(() => this.scrollToRow(parentRow))
@@ -5215,7 +5419,7 @@ const Methods = {
5215
5419
  column: selected.column,
5216
5420
  columnIndex: this.getColumnIndex(selected.column),
5217
5421
  $table: this,
5218
- $grid: this.$xegrid
5422
+ $grid: $xeGrid
5219
5423
  };
5220
5424
  if (!beforeEditMethod || beforeEditMethod(params)) {
5221
5425
  if (editMethod) {
@@ -5336,7 +5540,7 @@ const Methods = {
5336
5540
  return;
5337
5541
  }
5338
5542
  if (tooltipStore.column !== column || !tooltipStore.visible) {
5339
- handleTooltip($xeTable, evnt, thEl, cellEl, null, params);
5543
+ handleTooltip($xeTable, evnt, thEl, thEl.querySelector('.vxe-cell--title') || cellEl, params);
5340
5544
  }
5341
5545
  },
5342
5546
  /**
@@ -5366,7 +5570,7 @@ const Methods = {
5366
5570
  }
5367
5571
  }
5368
5572
  if (tooltipStore.column !== column || tooltipStore.row !== row || !tooltipStore.visible) {
5369
- handleTooltip($xeTable, evnt, tdEl, tdEl.querySelector('.vxe-cell--wrapper'), null, params);
5573
+ handleTooltip($xeTable, evnt, tdEl, tdEl.querySelector('.vxe-cell--label') || tdEl.querySelector('.vxe-cell--wrapper'), params);
5370
5574
  }
5371
5575
  },
5372
5576
  /**
@@ -5377,10 +5581,10 @@ const Methods = {
5377
5581
  const reactData = $xeTable;
5378
5582
  const { column } = params;
5379
5583
  const { tooltipStore } = reactData;
5380
- const cell = evnt.currentTarget;
5584
+ const tdEl = evnt.currentTarget;
5381
5585
  handleTargetEnterEvent($xeTable, tooltipStore.column !== column || !!tooltipStore.row);
5382
5586
  if (tooltipStore.column !== column || !tooltipStore.visible) {
5383
- handleTooltip($xeTable, evnt, cell, cell.querySelector('.vxe-cell--wrapper') || cell.children[0], null, params);
5587
+ handleTooltip($xeTable, evnt, tdEl, tdEl.querySelector('.vxe-cell--label') || tdEl.querySelector('.vxe-cell--wrapper'), params);
5384
5588
  }
5385
5589
  },
5386
5590
  openTooltip(target, content) {
@@ -5437,11 +5641,15 @@ const Methods = {
5437
5641
  * 获取复选框半选状态的行数据
5438
5642
  */
5439
5643
  getCheckboxIndeterminateRecords(isFull) {
5440
- const { treeConfig, treeIndeterminateMaps, fullDataRowIdData } = this;
5644
+ const $xeTable = this;
5645
+ const props = $xeTable;
5646
+ const internalData = $xeTable;
5647
+ const { treeConfig } = props;
5648
+ const { fullDataRowIdData, treeIndeterminateRowMaps } = internalData;
5441
5649
  if (treeConfig) {
5442
5650
  const fullRest = [];
5443
5651
  const defRest = [];
5444
- XEUtils.each(treeIndeterminateMaps, (item, rowid) => {
5652
+ XEUtils.each(treeIndeterminateRowMaps, (item, rowid) => {
5445
5653
  if (item) {
5446
5654
  fullRest.push(item);
5447
5655
  if (fullDataRowIdData[rowid]) {
@@ -5456,26 +5664,6 @@ const Methods = {
5456
5664
  }
5457
5665
  return [];
5458
5666
  },
5459
- /**
5460
- * 处理默认勾选
5461
- */
5462
- handleDefaultSelectionChecked() {
5463
- const $xeTable = this;
5464
- const { fullDataRowIdData, checkboxOpts } = this;
5465
- const { checkAll, checkRowKeys } = checkboxOpts;
5466
- if (checkAll) {
5467
- handleCheckedAllCheckboxRow($xeTable, true, true);
5468
- }
5469
- else if (checkRowKeys) {
5470
- const defSelection = [];
5471
- checkRowKeys.forEach((rowid) => {
5472
- if (fullDataRowIdData[rowid]) {
5473
- defSelection.push(fullDataRowIdData[rowid].row);
5474
- }
5475
- });
5476
- handleCheckedCheckboxRow($xeTable, defSelection, true, true);
5477
- }
5478
- },
5479
5667
  handleCheckedCheckboxRow(rows, value, isForce) {
5480
5668
  const $xeTable = this;
5481
5669
  return handleCheckedCheckboxRow($xeTable, rows, value, isForce);
@@ -5511,20 +5699,22 @@ const Methods = {
5511
5699
  isCheckedByCheckboxRow(row) {
5512
5700
  const $xeTable = this;
5513
5701
  const reactData = $xeTable;
5514
- const { selectCheckboxMaps } = reactData;
5702
+ const internalData = $xeTable;
5703
+ const { updateCheckboxFlag } = reactData;
5704
+ const { selectCheckboxMaps } = internalData;
5515
5705
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5516
5706
  const { checkField } = checkboxOpts;
5517
5707
  if (checkField) {
5518
5708
  return XEUtils.get(row, checkField);
5519
5709
  }
5520
- return !!selectCheckboxMaps[getRowid($xeTable, row)];
5710
+ return !!updateCheckboxFlag && !!selectCheckboxMaps[getRowid($xeTable, row)];
5521
5711
  },
5522
5712
  isCheckedByCheckboxRowKey(rowid) {
5523
5713
  const $xeTable = this;
5524
5714
  const reactData = $xeTable;
5525
5715
  const internalData = $xeTable;
5526
- const { selectCheckboxMaps } = reactData;
5527
- const { fullAllDataRowIdData } = internalData;
5716
+ const { updateCheckboxFlag } = reactData;
5717
+ const { fullAllDataRowIdData, selectCheckboxMaps } = internalData;
5528
5718
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5529
5719
  const { checkField } = checkboxOpts;
5530
5720
  if (checkField) {
@@ -5534,19 +5724,19 @@ const Methods = {
5534
5724
  }
5535
5725
  return false;
5536
5726
  }
5537
- return !!selectCheckboxMaps[rowid];
5727
+ return !!updateCheckboxFlag && !!selectCheckboxMaps[rowid];
5538
5728
  },
5539
5729
  isIndeterminateByCheckboxRow(row) {
5540
5730
  const $xeTable = this;
5541
- const reactData = $xeTable;
5542
- const { treeIndeterminateMaps } = reactData;
5543
- return !!treeIndeterminateMaps[getRowid($xeTable, row)] && !$xeTable.isCheckedByCheckboxRow(row);
5731
+ const internalData = $xeTable;
5732
+ const { treeIndeterminateRowMaps } = internalData;
5733
+ return !!treeIndeterminateRowMaps[getRowid($xeTable, row)] && !$xeTable.isCheckedByCheckboxRow(row);
5544
5734
  },
5545
5735
  isIndeterminateByCheckboxRowKey(rowid) {
5546
5736
  const $xeTable = this;
5547
- const reactData = $xeTable;
5548
- const { treeIndeterminateMaps } = reactData;
5549
- return !!treeIndeterminateMaps[rowid] && !$xeTable.isCheckedByCheckboxRowKey(rowid);
5737
+ const internalData = $xeTable;
5738
+ const { treeIndeterminateRowMaps } = internalData;
5739
+ return !!treeIndeterminateRowMaps[rowid] && !$xeTable.isCheckedByCheckboxRowKey(rowid);
5550
5740
  },
5551
5741
  /**
5552
5742
  * 切换选中
@@ -5556,14 +5746,15 @@ const Methods = {
5556
5746
  const $xeTable = this;
5557
5747
  const props = $xeTable;
5558
5748
  const reactData = $xeTable;
5749
+ const internalData = $xeTable;
5559
5750
  const { treeConfig } = props;
5560
- const { selectCheckboxMaps } = reactData;
5561
- const selectRowMaps = Object.assign({}, selectCheckboxMaps);
5751
+ const { selectCheckboxMaps } = internalData;
5562
5752
  const treeOpts = $xeTable.computeTreeOpts;
5563
5753
  const { transform, mapChildrenField } = treeOpts;
5564
5754
  const childrenField = treeOpts.children || treeOpts.childrenField;
5565
5755
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5566
5756
  const { checkField, checkStrictly, checkMethod } = checkboxOpts;
5757
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5567
5758
  // indeterminateField 仅支持读取
5568
5759
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
5569
5760
  if (checkField) {
@@ -5578,60 +5769,58 @@ const Methods = {
5578
5769
  }
5579
5770
  handleCheckboxReserveRow($xeTable, row, checked);
5580
5771
  }
5581
- }, { children: transform ? mapChildrenField : childrenField });
5582
- reactData.selectCheckboxMaps = selectRowMaps;
5583
- return;
5584
- }
5585
- else {
5586
- // 列表
5587
- rows.forEach(row => {
5588
- if (isForce || (!checkMethod || checkMethod({ row }))) {
5589
- XEUtils.set(row, checkField, checked);
5590
- handleCheckboxReserveRow($xeTable, row, checked);
5591
- }
5592
- });
5772
+ }, { children: transform ? mapChildrenField : childrenField });
5773
+ reactData.updateCheckboxFlag++;
5774
+ return;
5593
5775
  }
5594
- reactData.selectCheckboxMaps = selectRowMaps;
5776
+ // 列表
5777
+ rows.forEach(row => {
5778
+ if (isForce || (!checkMethod || checkMethod({ row }))) {
5779
+ XEUtils.set(row, checkField, checked);
5780
+ handleCheckboxReserveRow($xeTable, row, checked);
5781
+ }
5782
+ });
5783
+ reactData.updateCheckboxFlag++;
5595
5784
  return;
5596
5785
  }
5597
5786
  // 树结构
5598
5787
  if (treeConfig && !checkStrictly) {
5599
5788
  // 更新子节点状态
5600
5789
  XEUtils.eachTree(rows, (row) => {
5601
- const rowid = getRowid($xeTable, row);
5790
+ const rowid = handleGetRowId(row);
5602
5791
  if (isForce || (!checkMethod || checkMethod({ row }))) {
5603
5792
  if (checked) {
5604
- selectRowMaps[rowid] = row;
5793
+ selectCheckboxMaps[rowid] = row;
5605
5794
  }
5606
5795
  else {
5607
- if (selectRowMaps[rowid]) {
5608
- delete selectRowMaps[rowid];
5796
+ if (selectCheckboxMaps[rowid]) {
5797
+ delete selectCheckboxMaps[rowid];
5609
5798
  }
5610
5799
  }
5611
5800
  handleCheckboxReserveRow($xeTable, row, checked);
5612
5801
  }
5613
5802
  }, { children: transform ? mapChildrenField : childrenField });
5614
- reactData.selectCheckboxMaps = selectRowMaps;
5803
+ reactData.updateCheckboxFlag++;
5615
5804
  return;
5616
5805
  }
5617
5806
  // 列表
5618
5807
  rows.forEach(row => {
5619
- const rowid = getRowid($xeTable, row);
5808
+ const rowid = handleGetRowId(row);
5620
5809
  if (isForce || (!checkMethod || checkMethod({ row }))) {
5621
5810
  if (checked) {
5622
- if (!selectRowMaps[rowid]) {
5623
- selectRowMaps[rowid] = row;
5811
+ if (!selectCheckboxMaps[rowid]) {
5812
+ selectCheckboxMaps[rowid] = row;
5624
5813
  }
5625
5814
  }
5626
5815
  else {
5627
- if (selectRowMaps[rowid]) {
5628
- delete selectRowMaps[rowid];
5816
+ if (selectCheckboxMaps[rowid]) {
5817
+ delete selectCheckboxMaps[rowid];
5629
5818
  }
5630
5819
  }
5631
5820
  handleCheckboxReserveRow($xeTable, row, checked);
5821
+ reactData.updateCheckboxFlag++;
5632
5822
  }
5633
5823
  });
5634
- reactData.selectCheckboxMaps = selectRowMaps;
5635
5824
  },
5636
5825
  /**
5637
5826
  * 即将移除
@@ -5642,7 +5831,10 @@ const Methods = {
5642
5831
  $xeTable.handleBatchSelectRows([row], checked, isForce);
5643
5832
  },
5644
5833
  handleToggleCheckRowEvent(evnt, params) {
5645
- const { selectCheckboxMaps, checkboxOpts } = this;
5834
+ const $xeTable = this;
5835
+ const internalData = $xeTable;
5836
+ const { selectCheckboxMaps } = internalData;
5837
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
5646
5838
  const { checkField, trigger } = checkboxOpts;
5647
5839
  const { row } = params;
5648
5840
  if (trigger === 'manual') {
@@ -5653,47 +5845,52 @@ const Methods = {
5653
5845
  checked = !XEUtils.get(row, checkField);
5654
5846
  }
5655
5847
  else {
5656
- checked = !selectCheckboxMaps[getRowid(this, row)];
5848
+ checked = !selectCheckboxMaps[getRowid($xeTable, row)];
5657
5849
  }
5658
5850
  if (evnt) {
5659
- this.triggerCheckRowEvent(evnt, params, checked);
5851
+ $xeTable.triggerCheckRowEvent(evnt, params, checked);
5660
5852
  }
5661
5853
  else {
5662
- this.handleSelectRow(params, checked);
5663
- this.checkSelectionStatus();
5854
+ $xeTable.handleBatchSelectRows([row], checked);
5855
+ $xeTable.checkSelectionStatus();
5664
5856
  }
5665
5857
  },
5666
5858
  triggerCheckRowEvent(evnt, params, checked) {
5667
5859
  const $xeTable = this;
5668
- const { checkboxOpts, afterFullData } = this;
5669
- const { checkMethod, trigger } = checkboxOpts;
5860
+ const props = $xeTable;
5861
+ const internalData = $xeTable;
5670
5862
  const { row } = params;
5863
+ const { afterFullData } = internalData;
5864
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
5865
+ const { checkMethod, trigger } = checkboxOpts;
5671
5866
  if (trigger === 'manual') {
5672
5867
  return;
5673
5868
  }
5674
5869
  evnt.stopPropagation();
5675
- if (checkboxOpts.isShiftKey && evnt.shiftKey && !this.treeConfig) {
5676
- const checkboxRecords = this.getCheckboxRecords();
5870
+ if (checkboxOpts.isShiftKey && evnt.shiftKey && !props.treeConfig) {
5871
+ const checkboxRecords = $xeTable.getCheckboxRecords();
5677
5872
  if (checkboxRecords.length) {
5678
5873
  const firstRow = checkboxRecords[0];
5679
- const _rowIndex = this.getVTRowIndex(row);
5680
- const _firstRowIndex = this.getVTRowIndex(firstRow);
5874
+ const _rowIndex = $xeTable.getVTRowIndex(row);
5875
+ const _firstRowIndex = $xeTable.getVTRowIndex(firstRow);
5681
5876
  if (_rowIndex !== _firstRowIndex) {
5682
- this.setAllCheckboxRow(false);
5877
+ $xeTable.setAllCheckboxRow(false);
5683
5878
  const rangeRows = _rowIndex < _firstRowIndex ? afterFullData.slice(_rowIndex, _firstRowIndex + 1) : afterFullData.slice(_firstRowIndex, _rowIndex + 1);
5684
- handleCheckedCheckboxRow($xeTable, rangeRows, true, false);
5685
- this.emitEvent('checkbox-range-select', Object.assign({ rangeRecords: rangeRows }, params), evnt);
5879
+ $xeTable.$nextTick(() => {
5880
+ handleCheckedCheckboxRow($xeTable, rangeRows, true, false);
5881
+ });
5882
+ $xeTable.dispatchEvent('checkbox-range-select', Object.assign({ rangeRecords: rangeRows }, params), evnt);
5686
5883
  return;
5687
5884
  }
5688
5885
  }
5689
5886
  }
5690
5887
  if (!checkMethod || checkMethod({ row })) {
5691
- this.handleSelectRow(params, checked);
5692
- this.checkSelectionStatus();
5693
- this.emitEvent('checkbox-change', Object.assign({
5694
- records: this.getCheckboxRecords(),
5695
- reserves: this.getCheckboxReserveRecords(),
5696
- indeterminates: this.getCheckboxIndeterminateRecords(),
5888
+ $xeTable.handleBatchSelectRows([row], checked);
5889
+ $xeTable.checkSelectionStatus();
5890
+ $xeTable.dispatchEvent('checkbox-change', Object.assign({
5891
+ records: () => $xeTable.getCheckboxRecords(),
5892
+ reserves: () => $xeTable.getCheckboxReserveRecords(),
5893
+ indeterminates: () => $xeTable.getCheckboxIndeterminateRecords(),
5697
5894
  checked
5698
5895
  }, params), evnt);
5699
5896
  }
@@ -5703,7 +5900,9 @@ const Methods = {
5703
5900
  */
5704
5901
  toggleCheckboxRow(row) {
5705
5902
  const $xeTable = this;
5706
- const { selectCheckboxMaps, checkboxOpts } = this;
5903
+ const internalData = $xeTable;
5904
+ const { selectCheckboxMaps } = internalData;
5905
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
5707
5906
  const { checkField } = checkboxOpts;
5708
5907
  const checked = checkField ? !XEUtils.get(row, checkField) : !selectCheckboxMaps[getRowid($xeTable, row)];
5709
5908
  $xeTable.handleBatchSelectRows([row], checked, true);
@@ -5724,9 +5923,7 @@ const Methods = {
5724
5923
  const reactData = $xeTable;
5725
5924
  const internalData = $xeTable;
5726
5925
  const { treeConfig } = props;
5727
- const { selectCheckboxMaps, treeIndeterminateMaps } = reactData;
5728
- const selectRowMaps = Object.assign({}, selectCheckboxMaps);
5729
- const halfRowMaps = Object.assign({}, treeIndeterminateMaps);
5926
+ const { selectCheckboxMaps, treeIndeterminateRowMaps } = internalData;
5730
5927
  const treeOpts = $xeTable.computeTreeOpts;
5731
5928
  const { transform, mapChildrenField } = treeOpts;
5732
5929
  const childrenField = treeOpts.children || treeOpts.childrenField;
@@ -5738,10 +5935,11 @@ const Methods = {
5738
5935
  }
5739
5936
  // 树结构
5740
5937
  if (treeConfig) {
5938
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5741
5939
  const childRowMaps = {};
5742
5940
  const childRowList = [];
5743
5941
  XEUtils.eachTree(afterTreeFullData, (row) => {
5744
- const rowid = getRowid($xeTable, row);
5942
+ const rowid = handleGetRowId(row);
5745
5943
  const childList = row[transform ? mapChildrenField : childrenField];
5746
5944
  if (childList && childList.length && !childRowMaps[rowid]) {
5747
5945
  childRowMaps[rowid] = 1;
@@ -5757,13 +5955,13 @@ const Methods = {
5757
5955
  let vLen = 0; // 有效行
5758
5956
  childList.forEach(checkMethod
5759
5957
  ? (item) => {
5760
- const childRowid = getRowid($xeTable, item);
5761
- const isSelect = checkField ? XEUtils.get(item, checkField) : selectRowMaps[childRowid];
5958
+ const childRowid = handleGetRowId(item);
5959
+ const isSelect = checkField ? XEUtils.get(item, checkField) : selectCheckboxMaps[childRowid];
5762
5960
  if (checkMethod({ row: item })) {
5763
5961
  if (isSelect) {
5764
5962
  sLen++;
5765
5963
  }
5766
- else if (halfRowMaps[childRowid]) {
5964
+ else if (treeIndeterminateRowMaps[childRowid]) {
5767
5965
  hLen++;
5768
5966
  }
5769
5967
  vLen++;
@@ -5772,18 +5970,18 @@ const Methods = {
5772
5970
  if (isSelect) {
5773
5971
  sLen++;
5774
5972
  }
5775
- else if (halfRowMaps[childRowid]) {
5973
+ else if (treeIndeterminateRowMaps[childRowid]) {
5776
5974
  hLen++;
5777
5975
  }
5778
5976
  }
5779
5977
  }
5780
5978
  : item => {
5781
- const childRowid = getRowid($xeTable, item);
5782
- const isSelect = checkField ? XEUtils.get(item, checkField) : selectRowMaps[childRowid];
5979
+ const childRowid = handleGetRowId(item);
5980
+ const isSelect = checkField ? XEUtils.get(item, checkField) : selectCheckboxMaps[childRowid];
5783
5981
  if (isSelect) {
5784
5982
  sLen++;
5785
5983
  }
5786
- else if (halfRowMaps[childRowid]) {
5984
+ else if (treeIndeterminateRowMaps[childRowid]) {
5787
5985
  hLen++;
5788
5986
  }
5789
5987
  vLen++;
@@ -5795,31 +5993,30 @@ const Methods = {
5795
5993
  }
5796
5994
  if (isSelected) {
5797
5995
  if (!checkField) {
5798
- selectRowMaps[rowid] = row;
5996
+ selectCheckboxMaps[rowid] = row;
5799
5997
  }
5800
- if (halfRowMaps[rowid]) {
5801
- delete halfRowMaps[rowid];
5998
+ if (treeIndeterminateRowMaps[rowid]) {
5999
+ delete treeIndeterminateRowMaps[rowid];
5802
6000
  }
5803
6001
  }
5804
6002
  else {
5805
6003
  if (!checkField) {
5806
- if (selectRowMaps[rowid]) {
5807
- delete selectRowMaps[rowid];
6004
+ if (selectCheckboxMaps[rowid]) {
6005
+ delete selectCheckboxMaps[rowid];
5808
6006
  }
5809
6007
  }
5810
6008
  if (halfSelect) {
5811
- halfRowMaps[rowid] = row;
6009
+ treeIndeterminateRowMaps[rowid] = row;
5812
6010
  }
5813
6011
  else {
5814
- if (halfRowMaps[rowid]) {
5815
- delete halfRowMaps[rowid];
6012
+ if (treeIndeterminateRowMaps[rowid]) {
6013
+ delete treeIndeterminateRowMaps[rowid];
5816
6014
  }
5817
6015
  }
5818
6016
  }
5819
6017
  });
5820
6018
  }
5821
- reactData.selectCheckboxMaps = selectRowMaps;
5822
- reactData.treeIndeterminateMaps = halfRowMaps;
6019
+ reactData.updateCheckboxFlag++;
5823
6020
  },
5824
6021
  updateAllCheckboxStatus() {
5825
6022
  const $xeTable = this;
@@ -5827,23 +6024,23 @@ const Methods = {
5827
6024
  const reactData = $xeTable;
5828
6025
  const internalData = $xeTable;
5829
6026
  const { treeConfig } = props;
5830
- const { selectCheckboxMaps, treeIndeterminateMaps } = reactData;
6027
+ const { afterFullData, afterTreeFullData, checkboxReserveRowMap, selectCheckboxMaps, treeIndeterminateRowMaps } = internalData;
5831
6028
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5832
6029
  const { checkField, checkMethod, showReserveStatus } = checkboxOpts;
5833
- const { afterFullData, afterTreeFullData, checkboxReserveRowMap } = internalData;
6030
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5834
6031
  let sLen = 0; // 已选
5835
6032
  let hLen = 0; // 半选
5836
6033
  let vLen = 0; // 有效行
5837
6034
  const rootList = (treeConfig ? afterTreeFullData : afterFullData);
5838
6035
  rootList.forEach(checkMethod
5839
6036
  ? row => {
5840
- const childRowid = getRowid($xeTable, row);
6037
+ const childRowid = handleGetRowId(row);
5841
6038
  const selected = checkField ? XEUtils.get(row, checkField) : selectCheckboxMaps[childRowid];
5842
6039
  if (checkMethod({ row })) {
5843
6040
  if (selected) {
5844
6041
  sLen++;
5845
6042
  }
5846
- else if (treeIndeterminateMaps[childRowid]) {
6043
+ else if (treeIndeterminateRowMaps[childRowid]) {
5847
6044
  hLen++;
5848
6045
  }
5849
6046
  vLen++;
@@ -5852,18 +6049,18 @@ const Methods = {
5852
6049
  if (selected) {
5853
6050
  sLen++;
5854
6051
  }
5855
- else if (treeIndeterminateMaps[childRowid]) {
6052
+ else if (treeIndeterminateRowMaps[childRowid]) {
5856
6053
  hLen++;
5857
6054
  }
5858
6055
  }
5859
6056
  }
5860
6057
  : row => {
5861
- const childRowid = getRowid($xeTable, row);
6058
+ const childRowid = handleGetRowId(row);
5862
6059
  const selected = checkField ? XEUtils.get(row, checkField) : selectCheckboxMaps[childRowid];
5863
6060
  if (selected) {
5864
6061
  sLen++;
5865
6062
  }
5866
- else if (treeIndeterminateMaps[childRowid]) {
6063
+ else if (treeIndeterminateRowMaps[childRowid]) {
5867
6064
  hLen++;
5868
6065
  }
5869
6066
  vLen++;
@@ -5920,19 +6117,26 @@ const Methods = {
5920
6117
  * 获取复选框保留选中的行
5921
6118
  */
5922
6119
  getCheckboxReserveRecords(isFull) {
5923
- const { fullDataRowIdData, afterFullData, checkboxReserveRowMap, checkboxOpts, treeConfig, treeOpts } = this;
6120
+ const $xeTable = this;
6121
+ const props = $xeTable;
6122
+ const internalData = $xeTable;
6123
+ const { treeConfig } = props;
6124
+ const { afterFullData, fullDataRowIdData, checkboxReserveRowMap } = internalData;
6125
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
6126
+ const treeOpts = $xeTable.computeTreeOpts;
5924
6127
  const childrenField = treeOpts.children || treeOpts.childrenField;
5925
6128
  const reserveSelection = [];
5926
6129
  if (checkboxOpts.reserve) {
6130
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5927
6131
  const afterFullIdMaps = {};
5928
6132
  if (treeConfig) {
5929
6133
  XEUtils.eachTree(afterFullData, row => {
5930
- afterFullIdMaps[getRowid(this, row)] = 1;
6134
+ afterFullIdMaps[handleGetRowId(row)] = 1;
5931
6135
  }, { children: childrenField });
5932
6136
  }
5933
6137
  else {
5934
6138
  afterFullData.forEach((row) => {
5935
- afterFullIdMaps[getRowid(this, row)] = 1;
6139
+ afterFullIdMaps[handleGetRowId(row)] = 1;
5936
6140
  });
5937
6141
  }
5938
6142
  XEUtils.each(checkboxReserveRowMap, (oldRow, oldRowid) => {
@@ -5973,9 +6177,9 @@ const Methods = {
5973
6177
  handleCheckedAllCheckboxRow($xeTable, value);
5974
6178
  if (evnt) {
5975
6179
  $xeTable.dispatchEvent('checkbox-all', {
5976
- records: $xeTable.getCheckboxRecords(),
5977
- reserves: $xeTable.getCheckboxReserveRecords(),
5978
- indeterminates: $xeTable.getCheckboxIndeterminateRecords(),
6180
+ records: () => $xeTable.getCheckboxRecords(),
6181
+ reserves: () => $xeTable.getCheckboxReserveRecords(),
6182
+ indeterminates: () => $xeTable.getCheckboxIndeterminateRecords(),
5979
6183
  checked: value
5980
6184
  }, evnt);
5981
6185
  }
@@ -6007,9 +6211,16 @@ const Methods = {
6007
6211
  * 清空行为不管是否被禁用还是保留记录,都将彻底清空选中状态
6008
6212
  */
6009
6213
  clearCheckboxRow() {
6010
- const { tableFullData, treeConfig, treeOpts, checkboxOpts } = this;
6011
- const { checkField, reserve } = checkboxOpts;
6214
+ const $xeTable = this;
6215
+ const props = $xeTable;
6216
+ const reactData = $xeTable;
6217
+ const internalData = $xeTable;
6218
+ const { treeConfig } = props;
6219
+ const { tableFullData } = internalData;
6220
+ const treeOpts = $xeTable.computeTreeOpts;
6012
6221
  const childrenField = treeOpts.children || treeOpts.childrenField;
6222
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
6223
+ const { checkField, reserve } = checkboxOpts;
6013
6224
  // indeterminateField 仅支持读取
6014
6225
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
6015
6226
  if (checkField) {
@@ -6029,29 +6240,13 @@ const Methods = {
6029
6240
  if (reserve) {
6030
6241
  tableFullData.forEach((row) => this.handleCheckboxReserveRow(row, false));
6031
6242
  }
6032
- this.isAllSelected = false;
6033
- this.isIndeterminate = false;
6034
- this.selectCheckboxMaps = {};
6035
- this.treeIndeterminateMaps = {};
6243
+ reactData.isAllSelected = false;
6244
+ reactData.isIndeterminate = false;
6245
+ internalData.selectCheckboxMaps = {};
6246
+ internalData.treeIndeterminateRowMaps = {};
6247
+ reactData.updateCheckboxFlag++;
6036
6248
  return this.$nextTick();
6037
6249
  },
6038
- /**
6039
- * 处理单选框默认勾选
6040
- */
6041
- handleDefaultRadioChecked() {
6042
- const $xeTable = this;
6043
- const { radioOpts, fullDataRowIdData } = this;
6044
- const { checkRowKey: rowid, reserve } = radioOpts;
6045
- if (rowid) {
6046
- if (fullDataRowIdData[rowid]) {
6047
- handleCheckedRadioRow($xeTable, fullDataRowIdData[rowid].row, true);
6048
- }
6049
- if (reserve) {
6050
- const rowkey = getRowkey(this);
6051
- this.radioReserveRow = { [rowkey]: rowid };
6052
- }
6053
- }
6054
- },
6055
6250
  /**
6056
6251
  * 单选,行选中事件
6057
6252
  */
@@ -6229,10 +6424,12 @@ const Methods = {
6229
6424
  },
6230
6425
  triggerHeaderCellClickEvent(evnt, params) {
6231
6426
  const $xeTable = this;
6427
+ const props = $xeTable;
6232
6428
  const internalData = $xeTable;
6233
6429
  const { _lastResizeTime } = internalData;
6234
6430
  const sortOpts = $xeTable.computeSortOpts;
6235
6431
  const columnOpts = $xeTable.computeColumnOpts;
6432
+ const currentColumnOpts = $xeTable.computeCurrentColumnOpts;
6236
6433
  const { column } = params;
6237
6434
  const cell = evnt.currentTarget;
6238
6435
  const triggerResizable = _lastResizeTime && _lastResizeTime > Date.now() - 300;
@@ -6242,7 +6439,7 @@ const Methods = {
6242
6439
  $xeTable.triggerSortEvent(evnt, column, getNextSortOrder($xeTable, column));
6243
6440
  }
6244
6441
  $xeTable.dispatchEvent('header-cell-click', Object.assign({ triggerResizable, triggerSort, triggerFilter, cell }, params), evnt);
6245
- if (columnOpts.isCurrent || $xeTable.highlightCurrentColumn) {
6442
+ if ((columnOpts.isCurrent || props.highlightCurrentColumn) && (!currentColumnOpts.trigger || ['header', 'default'].includes(currentColumnOpts.trigger))) {
6246
6443
  $xeTable.triggerCurrentColumnEvent(evnt, params);
6247
6444
  }
6248
6445
  return $xeTable.$nextTick();
@@ -6258,13 +6455,23 @@ const Methods = {
6258
6455
  * @param {ColumnInfo} fieldOrColumn 列配置
6259
6456
  */
6260
6457
  setCurrentColumn(fieldOrColumn) {
6261
- const column = handleFieldOrColumn(this, fieldOrColumn);
6458
+ const $xeTable = this;
6459
+ const props = $xeTable;
6460
+ const reactData = $xeTable;
6461
+ const { mouseConfig } = props;
6462
+ const mouseOpts = $xeTable.computeMouseOpts;
6463
+ const isMouseSelected = mouseConfig && mouseOpts.selected;
6464
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn);
6262
6465
  if (column) {
6263
- // this.clearCurrentRow()
6264
- this.clearCurrentColumn();
6265
- this.currentColumn = column;
6466
+ $xeTable.clearCurrentColumn();
6467
+ reactData.currentColumn = column;
6266
6468
  }
6267
- return this.$nextTick();
6469
+ return $xeTable.$nextTick().then(() => {
6470
+ // 更新状选中态
6471
+ if (isMouseSelected) {
6472
+ $xeTable.addCellSelectedClass();
6473
+ }
6474
+ });
6268
6475
  },
6269
6476
  /**
6270
6477
  * 用于当前列,手动清空当前高亮的状态
@@ -6273,25 +6480,6 @@ const Methods = {
6273
6480
  this.currentColumn = null;
6274
6481
  return this.$nextTick();
6275
6482
  },
6276
- checkValidate(type) {
6277
- if (this.triggerValidate) {
6278
- return this.triggerValidate(type);
6279
- }
6280
- return this.$nextTick();
6281
- },
6282
- /**
6283
- * 当单元格发生改变时
6284
- * 如果存在规则,则校验
6285
- */
6286
- handleChangeCell(evnt, params) {
6287
- this.checkValidate('blur')
6288
- .catch((e) => e)
6289
- .then(() => {
6290
- this.handleEdit(params, evnt)
6291
- .then(() => this.checkValidate('change'))
6292
- .catch((e) => e);
6293
- });
6294
- },
6295
6483
  /**
6296
6484
  * 列点击事件
6297
6485
  * 如果是单击模式,则激活为编辑状态
@@ -6301,7 +6489,7 @@ const Methods = {
6301
6489
  const $xeTable = this;
6302
6490
  const props = $xeTable;
6303
6491
  const reactData = $xeTable;
6304
- const { highlightCurrentRow, editConfig } = props;
6492
+ const { highlightCurrentRow, highlightCurrentColumn, editConfig } = props;
6305
6493
  const { editStore, isDragResize } = reactData;
6306
6494
  if (isDragResize) {
6307
6495
  return;
@@ -6313,6 +6501,8 @@ const Methods = {
6313
6501
  const checkboxOpts = $xeTable.computeCheckboxOpts;
6314
6502
  const keyboardOpts = $xeTable.computeKeyboardOpts;
6315
6503
  const rowOpts = $xeTable.computeRowOpts;
6504
+ const columnOpts = $xeTable.computeColumnOpts;
6505
+ const currentColumnOpts = $xeTable.computeCurrentColumnOpts;
6316
6506
  const { actived, focused } = editStore;
6317
6507
  const { row, column } = params;
6318
6508
  const { type, treeNode } = column;
@@ -6328,11 +6518,11 @@ const Methods = {
6328
6518
  if (!triggerCheckbox && !triggerRadio) {
6329
6519
  // 如果是展开行
6330
6520
  if (!triggerExpandNode && (expandOpts.trigger === 'row' || (isExpandType && expandOpts.trigger === 'cell'))) {
6331
- this.triggerRowExpandEvent(evnt, params);
6521
+ $xeTable.triggerRowExpandEvent(evnt, params);
6332
6522
  }
6333
6523
  // 如果是树形表格
6334
6524
  if ((treeOpts.trigger === 'row' || (treeNode && treeOpts.trigger === 'cell'))) {
6335
- this.triggerTreeExpandEvent(evnt, params);
6525
+ $xeTable.triggerTreeExpandEvent(evnt, params);
6336
6526
  }
6337
6527
  }
6338
6528
  // 如果点击了树节点
@@ -6341,16 +6531,22 @@ const Methods = {
6341
6531
  // 如果是高亮行
6342
6532
  if (rowOpts.isCurrent || highlightCurrentRow) {
6343
6533
  if (!triggerCheckbox && !triggerRadio) {
6344
- this.triggerCurrentRowEvent(evnt, params);
6534
+ $xeTable.triggerCurrentRowEvent(evnt, params);
6535
+ }
6536
+ }
6537
+ // 如果是当前列
6538
+ if ((columnOpts.isCurrent || highlightCurrentColumn) && (!currentColumnOpts.trigger || ['cell', 'default'].includes(currentColumnOpts.trigger))) {
6539
+ if (!triggerCheckbox && !triggerRadio) {
6540
+ $xeTable.triggerCurrentColumnEvent(evnt, params);
6345
6541
  }
6346
6542
  }
6347
6543
  // 如果是单选框
6348
6544
  if (!triggerRadio && (radioOpts.trigger === 'row' || (isRadioType && radioOpts.trigger === 'cell'))) {
6349
- this.triggerRadioRowEvent(evnt, params);
6545
+ $xeTable.triggerRadioRowEvent(evnt, params);
6350
6546
  }
6351
6547
  // 如果是复选框
6352
6548
  if (!triggerCheckbox && (checkboxOpts.trigger === 'row' || (isCheckboxType && checkboxOpts.trigger === 'cell'))) {
6353
- this.handleToggleCheckRowEvent(evnt, params);
6549
+ $xeTable.handleToggleCheckRowEvent(evnt, params);
6354
6550
  }
6355
6551
  }
6356
6552
  // 如果设置了单元格选中功能,则不会使用点击事件去处理(只能支持双击模式)
@@ -6362,16 +6558,16 @@ const Methods = {
6362
6558
  }
6363
6559
  if (editOpts.trigger === 'manual') {
6364
6560
  if (actived.args && actived.row === row && column !== actived.column) {
6365
- this.handleChangeCell(evnt, params);
6561
+ handleChangeCell($xeTable, evnt, params);
6366
6562
  }
6367
6563
  }
6368
6564
  else if (!actived.args || row !== actived.row || column !== actived.column) {
6369
6565
  if (editOpts.trigger === 'click') {
6370
- this.handleChangeCell(evnt, params);
6566
+ handleChangeCell($xeTable, evnt, params);
6371
6567
  }
6372
6568
  else if (editOpts.trigger === 'dblclick') {
6373
6569
  if (editOpts.mode === 'row' && actived.row === row) {
6374
- this.handleChangeCell(evnt, params);
6570
+ handleChangeCell($xeTable, evnt, params);
6375
6571
  }
6376
6572
  }
6377
6573
  }
@@ -6392,7 +6588,7 @@ const Methods = {
6392
6588
  }
6393
6589
  }
6394
6590
  }
6395
- this.emitEvent('cell-click', params, evnt);
6591
+ $xeTable.dispatchEvent('cell-click', params, evnt);
6396
6592
  },
6397
6593
  /**
6398
6594
  * 列双击点击事件
@@ -6414,48 +6610,23 @@ const Methods = {
6414
6610
  if (isEnableConf(editConfig) && editOpts.trigger === 'dblclick') {
6415
6611
  if (!actived.args || evnt.currentTarget !== actived.args.cell) {
6416
6612
  if (editOpts.mode === 'row') {
6417
- this.checkValidate('blur')
6613
+ checkValidate($xeTable, 'blur')
6418
6614
  .catch((e) => e)
6419
6615
  .then(() => {
6420
6616
  this.handleEdit(params, evnt)
6421
- .then(() => this.checkValidate('change'))
6617
+ .then(() => checkValidate($xeTable, 'change'))
6422
6618
  .catch((e) => e);
6423
6619
  });
6424
6620
  }
6425
6621
  else if (editOpts.mode === 'cell') {
6426
6622
  this.handleEdit(params, evnt)
6427
- .then(() => this.checkValidate('change'))
6623
+ .then(() => checkValidate($xeTable, 'change'))
6428
6624
  .catch((e) => e);
6429
6625
  }
6430
6626
  }
6431
6627
  }
6432
6628
  this.emitEvent('cell-dblclick', params, evnt);
6433
6629
  },
6434
- handleDefaultSort() {
6435
- const $xeTable = this;
6436
- const { sortConfig, sortOpts } = this;
6437
- let { defaultSort } = sortOpts;
6438
- if (defaultSort) {
6439
- if (!XEUtils.isArray(defaultSort)) {
6440
- defaultSort = [defaultSort];
6441
- }
6442
- if (defaultSort.length) {
6443
- (sortConfig.multiple ? defaultSort : defaultSort.slice(0, 1)).forEach((item, index) => {
6444
- const { field, order } = item;
6445
- if (field && order) {
6446
- const column = this.getColumnByField(field);
6447
- if (column && column.sortable) {
6448
- column.order = order;
6449
- column.sortTime = Date.now() + index;
6450
- }
6451
- }
6452
- });
6453
- if (!sortOpts.remote) {
6454
- this.handleTableData(true).then(() => updateStyle($xeTable));
6455
- }
6456
- }
6457
- }
6458
- },
6459
6630
  handleColumnSortEvent(evnt, column) {
6460
6631
  const $xeTable = this;
6461
6632
  const props = $xeTable;
@@ -6610,12 +6781,11 @@ const Methods = {
6610
6781
  const internalData = $xeTable;
6611
6782
  const { treeConfig, dragConfig } = props;
6612
6783
  const rowDragOpts = $xeTable.computeRowDragOpts;
6613
- const { fullAllDataRowIdData } = internalData;
6784
+ const { afterFullData, tableFullData, fullAllDataRowIdData } = internalData;
6614
6785
  const { isPeerDrag, isCrossDrag, isSelfToChildDrag, dragEndMethod, dragToChildMethod } = rowDragOpts;
6615
6786
  const treeOpts = $xeTable.computeTreeOpts;
6616
6787
  const { transform, rowField, mapChildrenField, parentField } = treeOpts;
6617
6788
  const childrenField = treeOpts.children || treeOpts.childrenField;
6618
- const { afterFullData, tableFullData } = internalData;
6619
6789
  const dEndMethod = dragEndMethod || (dragConfig ? dragConfig.dragEndMethod : null);
6620
6790
  const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
6621
6791
  const errRest = {
@@ -7219,48 +7389,52 @@ const Methods = {
7219
7389
  setPendingRow(rows, status) {
7220
7390
  const $xeTable = this;
7221
7391
  const reactData = $xeTable;
7222
- const pendingMaps = Object.assign({}, reactData.pendingRowMaps);
7392
+ const internalData = $xeTable;
7393
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
7394
+ const { pendingRowMaps } = internalData;
7223
7395
  if (rows && !XEUtils.isArray(rows)) {
7224
7396
  rows = [rows];
7225
7397
  }
7226
7398
  if (status) {
7227
7399
  rows.forEach((row) => {
7228
- const rowid = getRowid($xeTable, row);
7229
- if (rowid && !pendingMaps[rowid]) {
7230
- pendingMaps[rowid] = row;
7400
+ const rowid = handleGetRowId(row);
7401
+ if (rowid && !pendingRowMaps[rowid]) {
7402
+ pendingRowMaps[rowid] = row;
7231
7403
  }
7232
7404
  });
7233
7405
  }
7234
7406
  else {
7235
7407
  rows.forEach((row) => {
7236
- const rowid = getRowid($xeTable, row);
7237
- if (rowid && pendingMaps[rowid]) {
7238
- delete pendingMaps[rowid];
7408
+ const rowid = handleGetRowId(row);
7409
+ if (rowid && pendingRowMaps[rowid]) {
7410
+ delete pendingRowMaps[rowid];
7239
7411
  }
7240
7412
  });
7241
7413
  }
7242
- reactData.pendingRowMaps = pendingMaps;
7414
+ reactData.pendingRowFlag++;
7243
7415
  return $xeTable.$nextTick();
7244
7416
  },
7245
7417
  togglePendingRow(rows) {
7246
7418
  const $xeTable = this;
7247
7419
  const reactData = $xeTable;
7248
- const pendingMaps = Object.assign({}, reactData.pendingRowMaps);
7420
+ const internalData = $xeTable;
7421
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
7422
+ const { pendingRowMaps } = internalData;
7249
7423
  if (rows && !XEUtils.isArray(rows)) {
7250
7424
  rows = [rows];
7251
7425
  }
7252
7426
  rows.forEach((row) => {
7253
- const rowid = getRowid($xeTable, row);
7427
+ const rowid = handleGetRowId(row);
7254
7428
  if (rowid) {
7255
- if (pendingMaps[rowid]) {
7256
- delete pendingMaps[rowid];
7429
+ if (pendingRowMaps[rowid]) {
7430
+ delete pendingRowMaps[rowid];
7257
7431
  }
7258
7432
  else {
7259
- pendingMaps[rowid] = row;
7433
+ pendingRowMaps[rowid] = row;
7260
7434
  }
7261
7435
  }
7262
7436
  });
7263
- reactData.pendingRowMaps = pendingMaps;
7437
+ reactData.pendingRowFlag++;
7264
7438
  return $xeTable.$nextTick();
7265
7439
  },
7266
7440
  hasPendingByRow(row) {
@@ -7276,10 +7450,8 @@ const Methods = {
7276
7450
  },
7277
7451
  getPendingRecords() {
7278
7452
  const $xeTable = this;
7279
- const reactData = $xeTable;
7280
7453
  const internalData = $xeTable;
7281
- const { pendingRowMaps } = reactData;
7282
- const { fullAllDataRowIdData } = internalData;
7454
+ const { fullAllDataRowIdData, pendingRowMaps } = internalData;
7283
7455
  const insertRecords = [];
7284
7456
  XEUtils.each(pendingRowMaps, (row, rowid) => {
7285
7457
  if (fullAllDataRowIdData[rowid]) {
@@ -7289,8 +7461,12 @@ const Methods = {
7289
7461
  return insertRecords;
7290
7462
  },
7291
7463
  clearPendingRow() {
7292
- this.pendingRowMaps = {};
7293
- return this.$nextTick();
7464
+ const $xeTable = this;
7465
+ const reactData = $xeTable;
7466
+ const internalData = $xeTable;
7467
+ internalData.pendingRowMaps = {};
7468
+ reactData.pendingRowFlag++;
7469
+ return $xeTable.$nextTick();
7294
7470
  },
7295
7471
  sort(sortConfs, sortOrder) {
7296
7472
  const $xeTable = this;
@@ -7441,7 +7617,9 @@ const Methods = {
7441
7617
  * @param {Event} evnt 事件
7442
7618
  */
7443
7619
  closeFilter() {
7444
- const { filterStore } = this;
7620
+ const $xeTable = this;
7621
+ const reactData = $xeTable;
7622
+ const { filterStore } = reactData;
7445
7623
  const { column, visible } = filterStore;
7446
7624
  Object.assign(filterStore, {
7447
7625
  isAllSelected: false,
@@ -7450,9 +7628,15 @@ const Methods = {
7450
7628
  visible: false
7451
7629
  });
7452
7630
  if (visible) {
7453
- this.emitEvent('filter-visible', { column, field: column.field, property: column.field, filterList: this.getCheckedFilters(), visible: false }, null);
7631
+ $xeTable.dispatchEvent('filter-visible', {
7632
+ column,
7633
+ field: column.field,
7634
+ property: column.field,
7635
+ filterList: () => $xeTable.getCheckedFilters(),
7636
+ visible: false
7637
+ }, null);
7454
7638
  }
7455
- return this.$nextTick();
7639
+ return $xeTable.$nextTick();
7456
7640
  },
7457
7641
  /**
7458
7642
  * 判断指定列是否为筛选状态,如果为空则判断所有列
@@ -7483,17 +7667,16 @@ const Methods = {
7483
7667
  const $xeTable = this;
7484
7668
  const reactData = $xeTable;
7485
7669
  const internalData = $xeTable;
7486
- const rExpandLazyLoadedMaps = Object.assign({}, reactData.rowExpandLazyLoadedMaps);
7487
- const { fullAllDataRowIdData } = internalData;
7670
+ const { fullAllDataRowIdData, rowExpandLazyLoadedMaps } = internalData;
7488
7671
  const expandOpts = $xeTable.computeExpandOpts;
7489
7672
  const { lazy } = expandOpts;
7490
7673
  const rowid = getRowid($xeTable, row);
7491
7674
  const rowRest = fullAllDataRowIdData[rowid];
7492
7675
  if (lazy && rowRest) {
7493
7676
  rowRest.expandLoaded = false;
7494
- delete rExpandLazyLoadedMaps[rowid];
7677
+ delete rowExpandLazyLoadedMaps[rowid];
7495
7678
  }
7496
- reactData.rowExpandLazyLoadedMaps = rExpandLazyLoadedMaps;
7679
+ reactData.rowExpandedFlag++;
7497
7680
  return $xeTable.$nextTick();
7498
7681
  },
7499
7682
  /**
@@ -7501,14 +7684,17 @@ const Methods = {
7501
7684
  * @param {Row} row 行对象
7502
7685
  */
7503
7686
  reloadRowExpand(row) {
7504
- const { expandOpts, rowExpandLazyLoadedMaps } = this;
7687
+ const $xeTable = this;
7688
+ const internalData = $xeTable;
7689
+ const { rowExpandLazyLoadedMaps } = internalData;
7690
+ const expandOpts = $xeTable.computeExpandOpts;
7505
7691
  const { lazy } = expandOpts;
7506
7692
  const rowid = getRowid(this, row);
7507
7693
  if (lazy && !rowExpandLazyLoadedMaps[rowid]) {
7508
- this.clearRowExpandLoaded(row)
7509
- .then(() => this.handleAsyncRowExpand(row));
7694
+ $xeTable.clearRowExpandLoaded(row)
7695
+ .then(() => handleAsyncRowExpand($xeTable, row));
7510
7696
  }
7511
- return this.$nextTick();
7697
+ return $xeTable.$nextTick();
7512
7698
  },
7513
7699
  reloadExpandContent(row) {
7514
7700
  if (process.env.NODE_ENV === 'development') {
@@ -7521,20 +7707,33 @@ const Methods = {
7521
7707
  * 展开行事件
7522
7708
  */
7523
7709
  triggerRowExpandEvent(evnt, params) {
7524
- const { expandOpts, rowExpandLazyLoadedMaps, expandColumn: column } = this;
7710
+ const $xeTable = this;
7711
+ const reactData = $xeTable;
7712
+ const internalData = $xeTable;
7713
+ const { expandColumn: column } = reactData;
7714
+ const { rowExpandLazyLoadedMaps } = internalData;
7715
+ const expandOpts = $xeTable.computeExpandOpts;
7525
7716
  const { row } = params;
7526
7717
  const { lazy, trigger } = expandOpts;
7527
7718
  if (trigger === 'manual') {
7528
7719
  return;
7529
7720
  }
7530
7721
  evnt.stopPropagation();
7531
- const rowid = getRowid(this, row);
7722
+ const rowid = getRowid($xeTable, row);
7532
7723
  if (!lazy || !rowExpandLazyLoadedMaps[rowid]) {
7533
- const expanded = !this.isRowExpandByRow(row);
7534
- const columnIndex = this.getColumnIndex(column);
7535
- const $columnIndex = this.getVMColumnIndex(column);
7536
- this.setRowExpand(row, expanded);
7537
- this.emitEvent('toggle-row-expand', { expanded, column, columnIndex, $columnIndex, row, rowIndex: this.getRowIndex(row), $rowIndex: this.getVMRowIndex(row) }, evnt);
7724
+ const expanded = !$xeTable.isRowExpandByRow(row);
7725
+ const columnIndex = $xeTable.getColumnIndex(column);
7726
+ const $columnIndex = $xeTable.getVMColumnIndex(column);
7727
+ $xeTable.setRowExpand(row, expanded);
7728
+ $xeTable.dispatchEvent('toggle-row-expand', {
7729
+ expanded,
7730
+ column,
7731
+ columnIndex,
7732
+ $columnIndex,
7733
+ row,
7734
+ rowIndex: $xeTable.getRowIndex(row),
7735
+ $rowIndex: $xeTable.getVMRowIndex(row)
7736
+ }, evnt);
7538
7737
  }
7539
7738
  },
7540
7739
  /**
@@ -7543,25 +7742,6 @@ const Methods = {
7543
7742
  toggleRowExpand(row) {
7544
7743
  return this.setRowExpand(row, !this.isRowExpandByRow(row));
7545
7744
  },
7546
- /**
7547
- * 处理默认展开行
7548
- */
7549
- handleDefaultRowExpand() {
7550
- const { expandOpts, fullDataRowIdData } = this;
7551
- const { expandAll, expandRowKeys } = expandOpts;
7552
- if (expandAll) {
7553
- this.setAllRowExpand(true);
7554
- }
7555
- else if (expandRowKeys) {
7556
- const defExpandeds = [];
7557
- expandRowKeys.forEach((rowid) => {
7558
- if (fullDataRowIdData[rowid]) {
7559
- defExpandeds.push(fullDataRowIdData[rowid].row);
7560
- }
7561
- });
7562
- this.setRowExpand(defExpandeds, true);
7563
- }
7564
- },
7565
7745
  /**
7566
7746
  * 设置所有行的展开与否
7567
7747
  * @param {Boolean} expanded 是否展开
@@ -7580,48 +7760,6 @@ const Methods = {
7580
7760
  }
7581
7761
  return this.setRowExpand(expandedRows, expanded);
7582
7762
  },
7583
- handleAsyncRowExpand(row) {
7584
- const $xeTable = this;
7585
- const reactData = $xeTable;
7586
- const internalData = $xeTable;
7587
- return new Promise(resolve => {
7588
- const { expandOpts } = this;
7589
- const { loadMethod } = expandOpts;
7590
- if (loadMethod) {
7591
- const { fullAllDataRowIdData } = internalData;
7592
- const rExpandLazyLoadedMaps = Object.assign({}, reactData.rowExpandLazyLoadedMaps);
7593
- const rowid = getRowid($xeTable, row);
7594
- const rowRest = fullAllDataRowIdData[rowid];
7595
- rExpandLazyLoadedMaps[rowid] = row;
7596
- reactData.rowExpandLazyLoadedMaps = rExpandLazyLoadedMaps;
7597
- loadMethod({ $table: $xeTable, row, rowIndex: $xeTable.getRowIndex(row), $rowIndex: $xeTable.getVMRowIndex(row) }).then(() => {
7598
- const rExpandedMaps = Object.assign({}, reactData.rowExpandedMaps);
7599
- if (rowRest) {
7600
- rowRest.expandLoaded = true;
7601
- }
7602
- rExpandedMaps[rowid] = row;
7603
- reactData.rowExpandedMaps = rExpandedMaps;
7604
- }).catch(() => {
7605
- if (rowRest) {
7606
- rowRest.expandLoaded = false;
7607
- }
7608
- }).finally(() => {
7609
- const rExpandLazyLoadedMaps = Object.assign({}, reactData.rowExpandLazyLoadedMaps);
7610
- if (rExpandLazyLoadedMaps[rowid]) {
7611
- delete rExpandLazyLoadedMaps[rowid];
7612
- }
7613
- reactData.rowExpandLazyLoadedMaps = rExpandLazyLoadedMaps;
7614
- $xeTable.$nextTick()
7615
- .then(() => $xeTable.recalculate())
7616
- .then(() => $xeTable.updateCellAreas())
7617
- .then(() => resolve());
7618
- });
7619
- }
7620
- else {
7621
- resolve();
7622
- }
7623
- });
7624
- },
7625
7763
  /**
7626
7764
  * 设置展开行,二个参数设置这一行展开与否
7627
7765
  * 支持单行
@@ -7631,8 +7769,12 @@ const Methods = {
7631
7769
  */
7632
7770
  setRowExpand(rows, expanded) {
7633
7771
  const $xeTable = this;
7634
- const { rowExpandedMaps, fullAllDataRowIdData, rowExpandLazyLoadedMaps, expandOpts, expandColumn } = this;
7635
- let rExpandedMaps = Object.assign({}, rowExpandedMaps);
7772
+ const reactData = $xeTable;
7773
+ const internalData = $xeTable;
7774
+ const { expandColumn } = reactData;
7775
+ let { fullAllDataRowIdData, rowExpandedMaps, rowExpandLazyLoadedMaps } = internalData;
7776
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
7777
+ const expandOpts = $xeTable.computeExpandOpts;
7636
7778
  const { reserve, lazy, accordion, toggleMethod } = expandOpts;
7637
7779
  const lazyRests = [];
7638
7780
  const columnIndex = $xeTable.getColumnIndex(expandColumn);
@@ -7643,30 +7785,31 @@ const Methods = {
7643
7785
  }
7644
7786
  if (accordion) {
7645
7787
  // 只能同时展开一个
7646
- rExpandedMaps = {};
7788
+ rowExpandedMaps = {};
7789
+ internalData.rowExpandedMaps = rowExpandedMaps;
7647
7790
  rows = rows.slice(rows.length - 1, rows.length);
7648
7791
  }
7649
- const validRows = toggleMethod ? rows.filter((row) => toggleMethod({ expanded, column: expandColumn, columnIndex, $columnIndex, row, rowIndex: this.getRowIndex(row), $rowIndex: this.getVMRowIndex(row) })) : rows;
7792
+ const validRows = toggleMethod ? rows.filter((row) => toggleMethod({ $table: $xeTable, expanded, column: expandColumn, columnIndex, $columnIndex, row, rowIndex: this.getRowIndex(row), $rowIndex: this.getVMRowIndex(row) })) : rows;
7650
7793
  if (expanded) {
7651
7794
  validRows.forEach((row) => {
7652
- const rowid = getRowid(this, row);
7653
- if (!rExpandedMaps[rowid]) {
7795
+ const rowid = handleGetRowId(row);
7796
+ if (!rowExpandedMaps[rowid]) {
7654
7797
  const rowRest = fullAllDataRowIdData[rowid];
7655
7798
  const isLoad = lazy && !rowRest.expandLoaded && !rowExpandLazyLoadedMaps[rowid];
7656
7799
  if (isLoad) {
7657
- lazyRests.push(this.handleAsyncRowExpand(row));
7800
+ lazyRests.push(handleAsyncRowExpand($xeTable, row));
7658
7801
  }
7659
7802
  else {
7660
- rExpandedMaps[rowid] = row;
7803
+ rowExpandedMaps[rowid] = row;
7661
7804
  }
7662
7805
  }
7663
7806
  });
7664
7807
  }
7665
7808
  else {
7666
7809
  validRows.forEach((item) => {
7667
- const rowid = getRowid(this, item);
7668
- if (rExpandedMaps[rowid]) {
7669
- delete rExpandedMaps[rowid];
7810
+ const rowid = handleGetRowId(item);
7811
+ if (rowExpandedMaps[rowid]) {
7812
+ delete rowExpandedMaps[rowid];
7670
7813
  }
7671
7814
  });
7672
7815
  }
@@ -7674,7 +7817,7 @@ const Methods = {
7674
7817
  validRows.forEach((row) => handleRowExpandReserve($xeTable, row, expanded));
7675
7818
  }
7676
7819
  }
7677
- this.rowExpandedMaps = rExpandedMaps;
7820
+ reactData.rowExpandedFlag++;
7678
7821
  return Promise.all(lazyRests)
7679
7822
  .then(() => $xeTable.$nextTick())
7680
7823
  .then(() => $xeTable.recalculate(true))
@@ -7690,9 +7833,13 @@ const Methods = {
7690
7833
  * @param {Row} row 行对象
7691
7834
  */
7692
7835
  isRowExpandByRow(row) {
7693
- const { rowExpandedMaps } = this;
7836
+ const $xeTable = this;
7837
+ const reactData = $xeTable;
7838
+ const internalData = $xeTable;
7839
+ const { rowExpandedFlag } = reactData;
7840
+ const { rowExpandedMaps } = internalData;
7694
7841
  const rowid = getRowid(this, row);
7695
- return !!rowExpandedMaps[rowid];
7842
+ return !!rowExpandedFlag && !!rowExpandedMaps[rowid];
7696
7843
  },
7697
7844
  isExpandByRow(row) {
7698
7845
  if (process.env.NODE_ENV === 'development') {
@@ -7712,7 +7859,8 @@ const Methods = {
7712
7859
  const expandOpts = $xeTable.computeExpandOpts;
7713
7860
  const { reserve } = expandOpts;
7714
7861
  const expList = $xeTable.getRowExpandRecords();
7715
- reactData.rowExpandedMaps = {};
7862
+ internalData.rowExpandedMaps = {};
7863
+ reactData.rowExpandedFlag++;
7716
7864
  if (reserve) {
7717
7865
  tableFullData.forEach((row) => handleRowExpandReserve($xeTable, row, false));
7718
7866
  }
@@ -7732,8 +7880,10 @@ const Methods = {
7732
7880
  return this.$nextTick();
7733
7881
  },
7734
7882
  getRowExpandRecords() {
7883
+ const $xeTable = this;
7884
+ const internalData = $xeTable;
7735
7885
  const rest = [];
7736
- XEUtils.each(this.rowExpandedMaps, item => {
7886
+ XEUtils.each(internalData.rowExpandedMaps, item => {
7737
7887
  if (item) {
7738
7888
  rest.push(item);
7739
7889
  }
@@ -7741,8 +7891,10 @@ const Methods = {
7741
7891
  return rest;
7742
7892
  },
7743
7893
  getTreeExpandRecords() {
7894
+ const $xeTable = this;
7895
+ const internalData = $xeTable;
7744
7896
  const rest = [];
7745
- XEUtils.each(this.treeExpandedMaps, item => {
7897
+ XEUtils.each(internalData.treeExpandedMaps, item => {
7746
7898
  if (item) {
7747
7899
  rest.push(item);
7748
7900
  }
@@ -7775,12 +7927,10 @@ const Methods = {
7775
7927
  const $xeTable = this;
7776
7928
  const reactData = $xeTable;
7777
7929
  const internalData = $xeTable;
7778
- const { fullAllDataRowIdData } = internalData;
7930
+ const { fullAllDataRowIdData, treeExpandedMaps } = internalData;
7779
7931
  const treeOpts = $xeTable.computeTreeOpts;
7780
7932
  const { transform } = treeOpts;
7781
- let tExpandedMaps = {};
7782
7933
  if (rows) {
7783
- tExpandedMaps = Object.assign({}, reactData.treeExpandedMaps);
7784
7934
  if (!XEUtils.isArray(rows)) {
7785
7935
  rows = [rows];
7786
7936
  }
@@ -7789,8 +7939,8 @@ const Methods = {
7789
7939
  const rowRest = fullAllDataRowIdData[rowid];
7790
7940
  if (rowRest) {
7791
7941
  rowRest.treeLoaded = false;
7792
- if (tExpandedMaps[rowid]) {
7793
- delete tExpandedMaps[rowid];
7942
+ if (treeExpandedMaps[rowid]) {
7943
+ delete treeExpandedMaps[rowid];
7794
7944
  }
7795
7945
  }
7796
7946
  });
@@ -7800,7 +7950,8 @@ const Methods = {
7800
7950
  rowRest.treeLoaded = false;
7801
7951
  });
7802
7952
  }
7803
- reactData.treeExpandedMaps = {};
7953
+ internalData.treeExpandedMaps = {};
7954
+ reactData.treeExpandedFlag++;
7804
7955
  if (transform) {
7805
7956
  handleVirtualTreeToList($xeTable);
7806
7957
  return $xeTable.handleTableData();
@@ -7813,36 +7964,42 @@ const Methods = {
7813
7964
  */
7814
7965
  reloadTreeExpand(row) {
7815
7966
  const $xeTable = this;
7816
- const { treeOpts, treeExpandLazyLoadedMaps } = this;
7967
+ const internalData = $xeTable;
7968
+ const { treeExpandLazyLoadedMaps } = internalData;
7969
+ const treeOpts = $xeTable.computeTreeOpts;
7817
7970
  const { transform, lazy } = treeOpts;
7818
7971
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
7819
- const rowid = getRowid(this, row);
7972
+ const rowid = getRowid($xeTable, row);
7820
7973
  if (lazy && row[hasChildField] && !treeExpandLazyLoadedMaps[rowid]) {
7821
- return this.clearTreeExpandLoaded(row).then(() => {
7822
- return this.handleAsyncTreeExpandChilds(row);
7974
+ return $xeTable.clearTreeExpandLoaded(row).then(() => {
7975
+ return handleAsyncTreeExpandChilds($xeTable, row);
7823
7976
  }).then(() => {
7824
7977
  if (transform) {
7825
7978
  handleVirtualTreeToList($xeTable);
7826
- return this.handleTableData();
7979
+ return $xeTable.handleTableData();
7827
7980
  }
7828
7981
  }).then(() => {
7829
- return this.recalculate();
7982
+ return $xeTable.recalculate();
7830
7983
  });
7831
7984
  }
7832
- return this.$nextTick();
7985
+ return $xeTable.$nextTick();
7833
7986
  },
7834
7987
  reloadTreeChilds(row) {
7988
+ const $xeTable = this;
7835
7989
  if (process.env.NODE_ENV === 'development') {
7836
7990
  warnLog('vxe.error.delFunc', ['reloadTreeChilds', 'reloadTreeExpand']);
7837
7991
  }
7838
7992
  // 即将废弃
7839
- return this.reloadTreeExpand(row);
7993
+ return $xeTable.reloadTreeExpand(row);
7840
7994
  },
7841
7995
  /**
7842
7996
  * 展开树节点事件
7843
7997
  */
7844
7998
  triggerTreeExpandEvent(evnt, params) {
7845
- const { treeOpts, treeExpandLazyLoadedMaps } = this;
7999
+ const $xeTable = this;
8000
+ const internalData = $xeTable;
8001
+ const { treeExpandLazyLoadedMaps } = internalData;
8002
+ const treeOpts = $xeTable.computeTreeOpts;
7846
8003
  const { row, column } = params;
7847
8004
  const { lazy, trigger } = treeOpts;
7848
8005
  if (trigger === 'manual') {
@@ -7851,11 +8008,11 @@ const Methods = {
7851
8008
  evnt.stopPropagation();
7852
8009
  const rowid = getRowid(this, row);
7853
8010
  if (!lazy || !treeExpandLazyLoadedMaps[rowid]) {
7854
- const expanded = !this.isTreeExpandByRow(row);
7855
- const columnIndex = this.getColumnIndex(column);
7856
- const $columnIndex = this.getVMColumnIndex(column);
7857
- this.setTreeExpand(row, expanded);
7858
- this.emitEvent('toggle-tree-expand', { expanded, column, columnIndex, $columnIndex, row }, evnt);
8011
+ const expanded = !$xeTable.isTreeExpandByRow(row);
8012
+ const columnIndex = $xeTable.getColumnIndex(column);
8013
+ const $columnIndex = $xeTable.getVMColumnIndex(column);
8014
+ $xeTable.setTreeExpand(row, expanded);
8015
+ $xeTable.dispatchEvent('toggle-tree-expand', { expanded, column, columnIndex, $columnIndex, row }, evnt);
7859
8016
  }
7860
8017
  },
7861
8018
  /**
@@ -7864,87 +8021,6 @@ const Methods = {
7864
8021
  toggleTreeExpand(row) {
7865
8022
  return this.setTreeExpand(row, !this.isTreeExpandByRow(row));
7866
8023
  },
7867
- /**
7868
- * 处理默认展开树节点
7869
- */
7870
- handleDefaultTreeExpand() {
7871
- const { treeConfig, treeOpts, tableFullData } = this;
7872
- if (treeConfig) {
7873
- const { expandAll, expandRowKeys } = treeOpts;
7874
- const childrenField = treeOpts.children || treeOpts.childrenField;
7875
- if (expandAll) {
7876
- this.setAllTreeExpand(true);
7877
- }
7878
- else if (expandRowKeys) {
7879
- const defExpandeds = [];
7880
- const rowkey = getRowkey(this);
7881
- expandRowKeys.forEach((rowid) => {
7882
- const matchObj = XEUtils.findTree(tableFullData, item => rowid === XEUtils.get(item, rowkey), { children: childrenField });
7883
- if (matchObj) {
7884
- defExpandeds.push(matchObj.item);
7885
- }
7886
- });
7887
- this.setTreeExpand(defExpandeds, true);
7888
- }
7889
- }
7890
- },
7891
- handleAsyncTreeExpandChilds(row) {
7892
- const $xeTable = this;
7893
- const { treeOpts, checkboxOpts } = this;
7894
- const { transform, loadMethod } = treeOpts;
7895
- const { checkStrictly } = checkboxOpts;
7896
- return new Promise(resolve => {
7897
- if (loadMethod) {
7898
- const { treeExpandLazyLoadedMaps, fullAllDataRowIdData } = this;
7899
- const rowid = getRowid($xeTable, row);
7900
- const rowRest = fullAllDataRowIdData[rowid];
7901
- treeExpandLazyLoadedMaps[rowid] = row;
7902
- Promise.resolve(loadMethod({ $table: $xeTable, row })).then((childRecords) => {
7903
- if (rowRest) {
7904
- rowRest.treeLoaded = true;
7905
- }
7906
- if (treeExpandLazyLoadedMaps[rowid]) {
7907
- delete treeExpandLazyLoadedMaps[rowid];
7908
- }
7909
- if (!XEUtils.isArray(childRecords)) {
7910
- childRecords = [];
7911
- }
7912
- if (childRecords) {
7913
- return this.loadTreeChildren(row, childRecords).then((childRows) => {
7914
- const { treeExpandedMaps } = this;
7915
- if (childRows.length && !treeExpandedMaps[rowid]) {
7916
- treeExpandedMaps[rowid] = row;
7917
- }
7918
- // 如果当前节点已选中,则展开后子节点也被选中
7919
- if (!checkStrictly && this.isCheckedByCheckboxRow(row)) {
7920
- handleCheckedCheckboxRow($xeTable, childRows, true);
7921
- }
7922
- return this.$nextTick().then(() => {
7923
- if (transform) {
7924
- this.handleTableData();
7925
- updateAfterDataIndex($xeTable);
7926
- return this.$nextTick();
7927
- }
7928
- });
7929
- });
7930
- }
7931
- }).catch(() => {
7932
- const { treeExpandLazyLoadedMaps } = this;
7933
- if (rowRest) {
7934
- rowRest.treeLoaded = false;
7935
- }
7936
- if (treeExpandLazyLoadedMaps[rowid]) {
7937
- delete treeExpandLazyLoadedMaps[rowid];
7938
- }
7939
- }).finally(() => {
7940
- this.$nextTick().then(() => this.recalculate()).then(() => resolve());
7941
- });
7942
- }
7943
- else {
7944
- resolve();
7945
- }
7946
- });
7947
- },
7948
8024
  /**
7949
8025
  * 设置所有树节点的展开与否
7950
8026
  * @param {Boolean} expanded 是否展开
@@ -7969,42 +8045,47 @@ const Methods = {
7969
8045
  * @returns
7970
8046
  */
7971
8047
  handleBaseTreeExpand(rows, expanded) {
7972
- const { fullAllDataRowIdData, tableFullData, treeExpandedMaps, treeOpts, treeExpandLazyLoadedMaps, treeNodeColumn } = this;
8048
+ const $xeTable = this;
8049
+ const reactData = $xeTable;
8050
+ const internalData = $xeTable;
8051
+ const { treeNodeColumn } = reactData;
8052
+ const { fullAllDataRowIdData, tableFullData, treeExpandedMaps, treeExpandLazyLoadedMaps } = internalData;
8053
+ const treeOpts = $xeTable.computeTreeOpts;
7973
8054
  const { reserve, lazy, accordion, toggleMethod } = treeOpts;
7974
- const treeTempExpandedMaps = Object.assign({}, treeExpandedMaps);
7975
8055
  const childrenField = treeOpts.children || treeOpts.childrenField;
7976
8056
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
7977
8057
  const result = [];
7978
- const columnIndex = this.getColumnIndex(treeNodeColumn);
7979
- const $columnIndex = this.getVMColumnIndex(treeNodeColumn);
7980
- let validRows = toggleMethod ? rows.filter((row) => toggleMethod({ expanded, column: treeNodeColumn, columnIndex, $columnIndex, row })) : rows;
8058
+ const columnIndex = $xeTable.getColumnIndex(treeNodeColumn);
8059
+ const $columnIndex = $xeTable.getVMColumnIndex(treeNodeColumn);
8060
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
8061
+ let validRows = toggleMethod ? rows.filter((row) => toggleMethod({ $table: $xeTable, expanded, column: treeNodeColumn, columnIndex, $columnIndex, row })) : rows;
7981
8062
  if (accordion) {
7982
8063
  validRows = validRows.length ? [validRows[validRows.length - 1]] : [];
7983
8064
  // 同一级只能展开一个
7984
8065
  const matchObj = XEUtils.findTree(tableFullData, item => item === validRows[0], { children: childrenField });
7985
8066
  if (matchObj) {
7986
8067
  matchObj.items.forEach(item => {
7987
- const rowid = getRowid(this, item);
7988
- if (treeTempExpandedMaps[rowid]) {
7989
- delete treeTempExpandedMaps[rowid];
8068
+ const rowid = handleGetRowId(item);
8069
+ if (treeExpandedMaps[rowid]) {
8070
+ delete treeExpandedMaps[rowid];
7990
8071
  }
7991
8072
  });
7992
8073
  }
7993
8074
  }
7994
8075
  if (expanded) {
7995
8076
  validRows.forEach((row) => {
7996
- const rowid = getRowid(this, row);
7997
- if (!treeTempExpandedMaps[rowid]) {
8077
+ const rowid = handleGetRowId(row);
8078
+ if (!treeExpandedMaps[rowid]) {
7998
8079
  const rowRest = fullAllDataRowIdData[rowid];
7999
8080
  if (rowRest) {
8000
8081
  const isLoad = lazy && row[hasChildField] && !rowRest.treeLoaded && !treeExpandLazyLoadedMaps[rowid];
8001
8082
  // 是否使用懒加载
8002
8083
  if (isLoad) {
8003
- result.push(this.handleAsyncTreeExpandChilds(row));
8084
+ result.push(handleAsyncTreeExpandChilds($xeTable, row));
8004
8085
  }
8005
8086
  else {
8006
8087
  if (row[childrenField] && row[childrenField].length) {
8007
- treeTempExpandedMaps[rowid] = row;
8088
+ treeExpandedMaps[rowid] = row;
8008
8089
  }
8009
8090
  }
8010
8091
  }
@@ -8013,18 +8094,18 @@ const Methods = {
8013
8094
  }
8014
8095
  else {
8015
8096
  validRows.forEach((item) => {
8016
- const rowid = getRowid(this, item);
8017
- if (treeTempExpandedMaps[rowid]) {
8018
- delete treeTempExpandedMaps[rowid];
8097
+ const rowid = handleGetRowId(item);
8098
+ if (treeExpandedMaps[rowid]) {
8099
+ delete treeExpandedMaps[rowid];
8019
8100
  }
8020
8101
  });
8021
8102
  }
8022
8103
  if (reserve) {
8023
- validRows.forEach((row) => this.handleTreeExpandReserve(row, expanded));
8104
+ validRows.forEach((row) => handleTreeExpandReserve($xeTable, row, expanded));
8024
8105
  }
8025
- this.treeExpandedMaps = treeTempExpandedMaps;
8106
+ reactData.treeExpandedFlag++;
8026
8107
  return Promise.all(result).then(() => {
8027
- return this.recalculate();
8108
+ return $xeTable.recalculate();
8028
8109
  });
8029
8110
  },
8030
8111
  /**
@@ -8078,30 +8159,38 @@ const Methods = {
8078
8159
  * @param {Row} row 行对象
8079
8160
  */
8080
8161
  isTreeExpandByRow(row) {
8081
- const { treeExpandedMaps } = this;
8082
- return !!treeExpandedMaps[getRowid(this, row)];
8162
+ const $xeTable = this;
8163
+ const reactData = $xeTable;
8164
+ const internalData = $xeTable;
8165
+ const { treeExpandedFlag } = reactData;
8166
+ const { treeExpandedMaps } = internalData;
8167
+ return !!treeExpandedFlag && !!treeExpandedMaps[getRowid($xeTable, row)];
8083
8168
  },
8084
8169
  /**
8085
8170
  * 手动清空树形节点的展开状态,数据会恢复成未展开的状态
8086
8171
  */
8087
8172
  clearTreeExpand() {
8088
8173
  const $xeTable = this;
8089
- const { treeOpts, tableFullData } = this;
8090
- const { transform, reserve } = treeOpts;
8174
+ const reactData = $xeTable;
8175
+ const internalData = $xeTable;
8176
+ const { tableFullTreeData } = internalData;
8177
+ const treeOpts = $xeTable.computeTreeOpts;
8091
8178
  const childrenField = treeOpts.children || treeOpts.childrenField;
8092
- const expList = this.getTreeExpandRecords();
8093
- this.treeExpandedMaps = {};
8179
+ const { transform, reserve } = treeOpts;
8180
+ const expList = $xeTable.getTreeExpandRecords();
8181
+ internalData.treeExpandedMaps = {};
8182
+ reactData.treeExpandedFlag++;
8094
8183
  if (reserve) {
8095
- XEUtils.eachTree(tableFullData, row => this.handleTreeExpandReserve(row, false), { children: childrenField });
8184
+ XEUtils.eachTree(tableFullTreeData, row => handleTreeExpandReserve($xeTable, row, false), { children: childrenField });
8096
8185
  }
8097
- return this.handleTableData().then(() => {
8186
+ return $xeTable.handleTableData().then(() => {
8098
8187
  if (transform) {
8099
8188
  handleVirtualTreeToList($xeTable);
8100
- return this.handleTableData();
8189
+ return $xeTable.handleTableData();
8101
8190
  }
8102
8191
  }).then(() => {
8103
8192
  if (expList.length) {
8104
- this.recalculate();
8193
+ $xeTable.recalculate();
8105
8194
  }
8106
8195
  });
8107
8196
  },
@@ -8109,18 +8198,6 @@ const Methods = {
8109
8198
  this.treeExpandedReserveRowMap = {};
8110
8199
  return this.$nextTick();
8111
8200
  },
8112
- handleTreeExpandReserve(row, expanded) {
8113
- const { treeExpandedReserveRowMap, treeOpts } = this;
8114
- if (treeOpts.reserve) {
8115
- const rowid = getRowid(this, row);
8116
- if (expanded) {
8117
- treeExpandedReserveRowMap[rowid] = row;
8118
- }
8119
- else if (treeExpandedReserveRowMap[rowid]) {
8120
- delete treeExpandedReserveRowMap[rowid];
8121
- }
8122
- }
8123
- },
8124
8201
  /**
8125
8202
  * 获取表格的滚动状态
8126
8203
  */
@@ -8241,8 +8318,8 @@ const Methods = {
8241
8318
  */
8242
8319
  triggerScrollXEvent() {
8243
8320
  const $xeTable = this;
8244
- const sXOpts = $xeTable.computeSXOpts;
8245
- if (sXOpts.immediate) {
8321
+ const virtualXOpts = $xeTable.computeVirtualXOpts;
8322
+ if (virtualXOpts.immediate) {
8246
8323
  loadScrollXData($xeTable);
8247
8324
  }
8248
8325
  else {
@@ -8254,8 +8331,8 @@ const Methods = {
8254
8331
  */
8255
8332
  triggerScrollYEvent() {
8256
8333
  const $xeTable = this;
8257
- const sYOpts = $xeTable.computeSYOpts;
8258
- if (sYOpts.immediate) {
8334
+ const virtualYOpts = $xeTable.computeVirtualYOpts;
8335
+ if (virtualYOpts.immediate) {
8259
8336
  loadScrollYData($xeTable);
8260
8337
  }
8261
8338
  else {
@@ -8438,10 +8515,10 @@ const Methods = {
8438
8515
  return;
8439
8516
  }
8440
8517
  const { highlightHoverRow } = tableProps;
8441
- const { scrollXLoad, scrollYLoad } = reactData;
8518
+ const { scrollXLoad, scrollYLoad, expandColumn } = reactData;
8442
8519
  const leftFixedWidth = $xeTable.computeLeftFixedWidth;
8443
8520
  const rightFixedWidth = $xeTable.computeRightFixedWidth;
8444
- if (!(scrollYLoad || leftFixedWidth || rightFixedWidth)) {
8521
+ if (!(leftFixedWidth || rightFixedWidth || expandColumn)) {
8445
8522
  return;
8446
8523
  }
8447
8524
  const { elemStore, lastScrollTop, lastScrollLeft } = internalData;
@@ -8464,8 +8541,8 @@ const Methods = {
8464
8541
  return;
8465
8542
  }
8466
8543
  const wheelSpeed = getWheelSpeed(reactData.lastScrollTime);
8467
- const deltaTop = Math.ceil((shiftKey ? deltaX : deltaY) * wheelSpeed);
8468
- const deltaLeft = Math.ceil((shiftKey ? deltaY : deltaX) * wheelSpeed);
8544
+ const deltaTop = shiftKey ? 0 : Math.ceil(deltaY * wheelSpeed);
8545
+ const deltaLeft = Math.ceil((shiftKey ? (deltaY || deltaX) : deltaX) * wheelSpeed);
8469
8546
  const isTopWheel = deltaTop < 0;
8470
8547
  const currScrollTop = bodyScrollElem.scrollTop;
8471
8548
  // 如果滚动位置已经是顶部或底部,则不需要触发
@@ -8693,8 +8770,8 @@ const Methods = {
8693
8770
  const $xeTable = this;
8694
8771
  const reactData = $xeTable;
8695
8772
  const internalData = $xeTable;
8696
- const { isAllOverflow, scrollYLoad, expandColumn, rowExpandedMaps } = reactData;
8697
- const { scrollYStore, elemStore, isResizeCellHeight, afterFullData, fullAllDataRowIdData } = internalData;
8773
+ const { isAllOverflow, scrollYLoad, expandColumn } = reactData;
8774
+ const { scrollYStore, elemStore, isResizeCellHeight, afterFullData, fullAllDataRowIdData, rowExpandedMaps } = internalData;
8698
8775
  const { startIndex } = scrollYStore;
8699
8776
  const expandOpts = $xeTable.computeExpandOpts;
8700
8777
  const rowOpts = $xeTable.computeRowOpts;
@@ -8937,13 +9014,15 @@ const Methods = {
8937
9014
  * 更新表尾合计
8938
9015
  */
8939
9016
  updateFooter() {
9017
+ const $xeTable = this;
9018
+ const $xeGrid = $xeTable.$xeGrid;
8940
9019
  const { showFooter, visibleColumn, footerData, footerMethod } = this;
8941
9020
  let footData = [];
8942
9021
  if (showFooter && footerData && footerData.length) {
8943
9022
  footData = footerData.slice(0);
8944
9023
  }
8945
9024
  else if (showFooter && footerMethod) {
8946
- footData = visibleColumn.length ? footerMethod({ columns: visibleColumn, data: this.afterFullData, $table: this, $grid: this.$xegrid }) : [];
9025
+ footData = visibleColumn.length ? footerMethod({ columns: visibleColumn, data: this.afterFullData, $table: $xeTable, $grid: $xeGrid }) : [];
8947
9026
  }
8948
9027
  this.footerTableData = footData;
8949
9028
  return this.$nextTick();
@@ -8963,9 +9042,6 @@ const Methods = {
8963
9042
  }
8964
9043
  });
8965
9044
  },
8966
- handleDefaultMergeCells() {
8967
- this.setMergeCells(this.mergeCells);
8968
- },
8969
9045
  /**
8970
9046
  * 设置合并单元格
8971
9047
  * @param {TableMergeConfig[]} merges { row: Row|number, column: ColumnInfo|number, rowspan: number, colspan: number }
@@ -9013,15 +9089,12 @@ const Methods = {
9013
9089
  return updateStyle($xeTable);
9014
9090
  });
9015
9091
  },
9016
- handleDefaultMergeFooterItems() {
9017
- this.setMergeFooterItems(this.mergeFooterItems);
9018
- },
9019
9092
  setMergeFooterItems(merges) {
9020
9093
  const $xeTable = this;
9021
9094
  if (this.footerSpanMethod) {
9022
9095
  errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
9023
9096
  }
9024
- setMerges(this, merges, this.mergeFooterList, null);
9097
+ setMerges(this, merges, this.mergeFooterList);
9025
9098
  return this.$nextTick().then(() => {
9026
9099
  this.updateCellAreas();
9027
9100
  return updateStyle($xeTable);
@@ -9075,11 +9148,14 @@ const Methods = {
9075
9148
  },
9076
9149
  dispatchEvent(type, params, evnt) {
9077
9150
  const $xeTable = this;
9078
- $xeTable.$emit(type, createEvent(evnt, { $table: $xeTable, $grid: $xeTable.$xegrid }, params));
9151
+ const $xeGrid = $xeTable.$xeGrid;
9152
+ $xeTable.$emit(type, createEvent(evnt, { $table: $xeTable, $grid: $xeGrid }, params));
9079
9153
  },
9080
9154
  // 已废弃,使用 dispatchEvent
9081
9155
  emitEvent(type, params, evnt) {
9082
- this.$emit(type, Object.assign({ $table: this, $grid: this.$xegrid, $event: evnt }, params));
9156
+ const $xeTable = this;
9157
+ const $xeGrid = $xeTable.$xeGrid;
9158
+ this.$emit(type, Object.assign({ $table: $xeTable, $grid: $xeGrid, $event: evnt }, params));
9083
9159
  },
9084
9160
  focus() {
9085
9161
  this.isActivated = true;