vxe-table 3.14.0-beta.3 → 3.14.0-beta.30

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 +79 -50
  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 +17 -11
  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 -2
  34. package/es/table/render/index.js +14 -5
  35. package/es/table/src/body.js +50 -26
  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 +19 -9
  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 +1008 -789
  43. package/es/table/src/props.js +4 -0
  44. package/es/table/src/table.js +85 -49
  45. package/es/table/src/util.js +84 -19
  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 +86 -67
  52. package/lib/grid/src/grid.min.js +1 -1
  53. package/lib/index.umd.js +1907 -1344
  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 +19 -13
  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 +3 -3
  127. package/lib/table/module/validator/mixin.min.js +1 -1
  128. package/lib/table/render/index.js +18 -5
  129. package/lib/table/render/index.min.js +1 -1
  130. package/lib/table/src/body.js +57 -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 +19 -7
  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 +1166 -919
  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 +93 -52
  149. package/lib/table/src/table.min.js +1 -1
  150. package/lib/table/src/util.js +96 -20
  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 +93 -59
  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 +20 -14
  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 +2 -2
  190. package/packages/table/render/index.ts +14 -5
  191. package/packages/table/src/body.ts +49 -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 +19 -9
  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 +1110 -830
  199. package/packages/table/src/props.ts +16 -12
  200. package/packages/table/src/table.ts +99 -52
  201. package/packages/table/src/util.ts +95 -19
  202. package/packages/toolbar/src/toolbar.ts +3 -3
  203. package/packages/ui/index.ts +1 -0
  204. /package/es/{iconfont.1741160631070.ttf → iconfont.1742890796110.ttf} +0 -0
  205. /package/es/{iconfont.1741160631070.woff → iconfont.1742890796110.woff} +0 -0
  206. /package/es/{iconfont.1741160631070.woff2 → iconfont.1742890796110.woff2} +0 -0
  207. /package/lib/{iconfont.1741160631070.ttf → iconfont.1742890796110.ttf} +0 -0
  208. /package/lib/{iconfont.1741160631070.woff → iconfont.1742890796110.woff} +0 -0
  209. /package/lib/{iconfont.1741160631070.woff2 → iconfont.1742890796110.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, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getColReMinWidth, 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) {
@@ -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) {
@@ -413,7 +415,7 @@ function updateStyle($xeTable) {
413
415
  const internalData = $xeTable;
414
416
  const { border, 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']);
@@ -690,56 +691,6 @@ function updateStyle($xeTable) {
690
691
  tableElem.style.width = tWidth ? `${tWidth}px` : '';
691
692
  }
692
693
  }
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
694
  });
744
695
  });
745
696
  if (currentRow) {
@@ -750,6 +701,25 @@ function updateStyle($xeTable) {
750
701
  }
751
702
  return $xeTable.$nextTick();
752
703
  }
704
+ function checkValidate($xeTable, type) {
705
+ if ($xeTable.triggerValidate) {
706
+ return $xeTable.triggerValidate(type);
707
+ }
708
+ return $xeTable.$nextTick();
709
+ }
710
+ /**
711
+ * 当单元格发生改变时
712
+ * 如果存在规则,则校验
713
+ */
714
+ function handleChangeCell($xeTable, evnt, params) {
715
+ checkValidate($xeTable, 'blur')
716
+ .catch((e) => e)
717
+ .then(() => {
718
+ $xeTable.handleEdit(params, evnt)
719
+ .then(() => checkValidate($xeTable, 'change'))
720
+ .catch((e) => e);
721
+ });
722
+ }
753
723
  function handleRadioReserveRow($xeTable, row) {
754
724
  const internalData = $xeTable;
755
725
  const radioOpts = $xeTable.computeRadioOpts;
@@ -794,12 +764,13 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
794
764
  const reactData = $xeTable;
795
765
  const internalData = $xeTable;
796
766
  const { treeConfig } = props;
797
- const { selectCheckboxMaps } = reactData;
798
- const { afterFullData, checkboxReserveRowMap } = internalData;
767
+ const { afterFullData, checkboxReserveRowMap, selectCheckboxMaps } = internalData;
799
768
  const treeOpts = $xeTable.computeTreeOpts;
800
769
  const childrenField = treeOpts.children || treeOpts.childrenField;
801
770
  const checkboxOpts = $xeTable.computeCheckboxOpts;
802
771
  const { checkField, reserve, checkMethod } = checkboxOpts;
772
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
773
+ // indeterminateField 仅支持读取
803
774
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
804
775
  const selectRowMaps = {};
805
776
  /**
@@ -810,7 +781,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
810
781
  const checkValFn = (row) => {
811
782
  if (isForce || (!checkMethod || checkMethod({ row }))) {
812
783
  if (checked) {
813
- selectRowMaps[getRowid($xeTable, row)] = row;
784
+ selectRowMaps[handleGetRowId(row)] = row;
814
785
  }
815
786
  XEUtils.set(row, checkField, checked);
816
787
  }
@@ -840,7 +811,8 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
840
811
  */
841
812
  XEUtils.eachTree(afterFullData, (row) => {
842
813
  if (isForce || (!checkMethod || checkMethod({ row }))) {
843
- selectRowMaps[getRowid($xeTable, row)] = row;
814
+ const rowid = handleGetRowId(row);
815
+ selectRowMaps[rowid] = row;
844
816
  }
845
817
  }, { children: childrenField });
846
818
  }
@@ -851,7 +823,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
851
823
  */
852
824
  if (!isForce && checkMethod) {
853
825
  XEUtils.eachTree(afterFullData, (row) => {
854
- const rowid = getRowid($xeTable, row);
826
+ const rowid = handleGetRowId(row);
855
827
  if (checkMethod({ row }) ? 0 : selectCheckboxMaps[rowid]) {
856
828
  selectRowMaps[rowid] = row;
857
829
  }
@@ -868,7 +840,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
868
840
  */
869
841
  if (!isForce && checkMethod) {
870
842
  afterFullData.forEach((row) => {
871
- const rowid = getRowid($xeTable, row);
843
+ const rowid = handleGetRowId(row);
872
844
  if (selectCheckboxMaps[rowid] || checkMethod({ row })) {
873
845
  selectRowMaps[rowid] = row;
874
846
  }
@@ -876,7 +848,8 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
876
848
  }
877
849
  else {
878
850
  afterFullData.forEach(row => {
879
- selectRowMaps[getRowid($xeTable, row)] = row;
851
+ const rowid = handleGetRowId(row);
852
+ selectRowMaps[rowid] = row;
880
853
  });
881
854
  }
882
855
  }
@@ -888,7 +861,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
888
861
  */
889
862
  if (!isForce && checkMethod) {
890
863
  afterFullData.forEach((row) => {
891
- const rowid = getRowid($xeTable, row);
864
+ const rowid = handleGetRowId(row);
892
865
  if (checkMethod({ row }) ? 0 : selectCheckboxMaps[rowid]) {
893
866
  selectRowMaps[rowid] = row;
894
867
  }
@@ -907,10 +880,10 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
907
880
  afterFullData.forEach((row) => handleCheckboxReserveRow($xeTable, row, false));
908
881
  }
909
882
  }
910
- reactData.selectCheckboxMaps = checkField ? {} : selectRowMaps;
883
+ reactData.updateCheckboxFlag++;
884
+ internalData.selectCheckboxMaps = checkField ? {} : selectRowMaps;
911
885
  reactData.isAllSelected = checked;
912
886
  reactData.isIndeterminate = false;
913
- reactData.treeIndeterminateMaps = {};
914
887
  internalData.treeIndeterminateRowMaps = {};
915
888
  $xeTable.checkSelectionStatus();
916
889
  return $xeTable.$nextTick();
@@ -921,8 +894,8 @@ function handleReserveStatus($xeTable) {
921
894
  const reactData = $xeTable;
922
895
  const internalData = $xeTable;
923
896
  const { treeConfig } = props;
924
- const { expandColumn, currentRow, selectCheckboxMaps, selectRadioRow, rowExpandedMaps, treeExpandedMaps } = reactData;
925
- const { fullDataRowIdData, fullAllDataRowIdData, radioReserveRow } = internalData;
897
+ const { expandColumn, currentRow, selectRadioRow } = reactData;
898
+ const { fullDataRowIdData, fullAllDataRowIdData, radioReserveRow, selectCheckboxMaps, treeExpandedMaps, rowExpandedMaps } = internalData;
926
899
  const expandOpts = $xeTable.computeExpandOpts;
927
900
  const treeOpts = $xeTable.computeTreeOpts;
928
901
  const radioOpts = $xeTable.computeRadioOpts;
@@ -939,7 +912,8 @@ function handleReserveStatus($xeTable) {
939
912
  }
940
913
  }
941
914
  // 复选框
942
- reactData.selectCheckboxMaps = getRecoverRowMaps($xeTable, selectCheckboxMaps); // 刷新多选行状态
915
+ internalData.selectCheckboxMaps = getRecoverRowMaps($xeTable, selectCheckboxMaps); // 刷新多选行状态
916
+ reactData.updateCheckboxFlag++;
943
917
  // 还原保留选中状态
944
918
  if (checkboxOpts.reserve) {
945
919
  handleCheckedCheckboxRow($xeTable, handleReserveRow($xeTable, internalData.checkboxReserveRowMap), true, true);
@@ -948,17 +922,161 @@ function handleReserveStatus($xeTable) {
948
922
  reactData.currentRow = null; // 刷新当前行状态
949
923
  }
950
924
  // 行展开
951
- reactData.rowExpandedMaps = expandColumn ? getRecoverRowMaps($xeTable, rowExpandedMaps) : {}; // 刷新行展开状态
925
+ internalData.rowExpandedMaps = expandColumn ? getRecoverRowMaps($xeTable, rowExpandedMaps) : {}; // 刷新行展开状态
926
+ reactData.rowExpandedFlag++;
952
927
  // 还原保留状态
953
928
  if (expandColumn && expandOpts.reserve) {
954
929
  $xeTable.setRowExpand(handleReserveRow($xeTable, internalData.rowExpandedReserveRowMap), true);
955
930
  }
956
931
  // 树展开
957
- reactData.treeExpandedMaps = treeConfig ? getRecoverRowMaps($xeTable, treeExpandedMaps) : {}; // 刷新树展开状态
932
+ internalData.treeExpandedMaps = treeConfig ? getRecoverRowMaps($xeTable, treeExpandedMaps) : {}; // 刷新树展开状态
933
+ reactData.treeExpandedFlag++;
958
934
  if (treeConfig && treeOpts.reserve) {
959
935
  $xeTable.setTreeExpand(handleReserveRow($xeTable, internalData.treeExpandedReserveRowMap), true);
960
936
  }
961
937
  }
938
+ /**
939
+ * 处理默认展开树节点
940
+ */
941
+ const handleDefaultTreeExpand = ($xeTable) => {
942
+ const props = $xeTable;
943
+ const internalData = $xeTable;
944
+ const { treeConfig } = props;
945
+ if (treeConfig) {
946
+ const { tableFullData } = internalData;
947
+ const treeOpts = $xeTable.computeTreeOpts;
948
+ const { expandAll, expandRowKeys } = treeOpts;
949
+ const childrenField = treeOpts.children || treeOpts.childrenField;
950
+ if (expandAll) {
951
+ $xeTable.setAllTreeExpand(true);
952
+ }
953
+ else if (expandRowKeys) {
954
+ const defExpandeds = [];
955
+ const rowkey = getRowkey($xeTable);
956
+ expandRowKeys.forEach((rowid) => {
957
+ const matchObj = XEUtils.findTree(tableFullData, item => rowid === XEUtils.get(item, rowkey), { children: childrenField });
958
+ if (matchObj) {
959
+ defExpandeds.push(matchObj.item);
960
+ }
961
+ });
962
+ $xeTable.setTreeExpand(defExpandeds, true);
963
+ }
964
+ }
965
+ };
966
+ const handleAsyncTreeExpandChilds = ($xeTable, row) => {
967
+ const reactData = $xeTable;
968
+ const internalData = $xeTable;
969
+ const treeOpts = $xeTable.computeTreeOpts;
970
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
971
+ const { transform, loadMethod } = treeOpts;
972
+ const { checkStrictly } = checkboxOpts;
973
+ return new Promise(resolve => {
974
+ if (loadMethod) {
975
+ const { fullAllDataRowIdData, treeExpandLazyLoadedMaps } = internalData;
976
+ const rowid = getRowid($xeTable, row);
977
+ const rowRest = fullAllDataRowIdData[rowid];
978
+ treeExpandLazyLoadedMaps[rowid] = row;
979
+ Promise.resolve(loadMethod({ $table: $xeTable, row })).then((childRecords) => {
980
+ if (rowRest) {
981
+ rowRest.treeLoaded = true;
982
+ }
983
+ if (treeExpandLazyLoadedMaps[rowid]) {
984
+ delete treeExpandLazyLoadedMaps[rowid];
985
+ }
986
+ if (!XEUtils.isArray(childRecords)) {
987
+ childRecords = [];
988
+ }
989
+ if (childRecords) {
990
+ return $xeTable.loadTreeChildren(row, childRecords).then(childRows => {
991
+ const { treeExpandedMaps } = internalData;
992
+ if (childRows.length && !treeExpandedMaps[rowid]) {
993
+ treeExpandedMaps[rowid] = row;
994
+ }
995
+ reactData.treeExpandedFlag++;
996
+ // 如果当前节点已选中,则展开后子节点也被选中
997
+ if (!checkStrictly && $xeTable.isCheckedByCheckboxRow(row)) {
998
+ handleCheckedCheckboxRow($xeTable, childRows, true);
999
+ }
1000
+ return $xeTable.$nextTick().then(() => {
1001
+ if (transform) {
1002
+ $xeTable.handleTableData();
1003
+ updateAfterDataIndex($xeTable);
1004
+ return $xeTable.$nextTick();
1005
+ }
1006
+ });
1007
+ });
1008
+ }
1009
+ }).catch(() => {
1010
+ const { treeExpandLazyLoadedMaps } = internalData;
1011
+ if (rowRest) {
1012
+ rowRest.treeLoaded = false;
1013
+ }
1014
+ if (treeExpandLazyLoadedMaps[rowid]) {
1015
+ delete treeExpandLazyLoadedMaps[rowid];
1016
+ }
1017
+ }).finally(() => {
1018
+ reactData.treeExpandedFlag++;
1019
+ $xeTable.$nextTick().then(() => $xeTable.recalculate()).then(() => resolve());
1020
+ });
1021
+ }
1022
+ else {
1023
+ resolve();
1024
+ }
1025
+ });
1026
+ };
1027
+ const handleTreeExpandReserve = ($xeTable, row, expanded) => {
1028
+ const internalData = $xeTable;
1029
+ const { treeExpandedReserveRowMap } = internalData;
1030
+ const treeOpts = $xeTable.computeTreeOpts;
1031
+ if (treeOpts.reserve) {
1032
+ const rowid = getRowid($xeTable, row);
1033
+ if (expanded) {
1034
+ treeExpandedReserveRowMap[rowid] = row;
1035
+ }
1036
+ else if (treeExpandedReserveRowMap[rowid]) {
1037
+ delete treeExpandedReserveRowMap[rowid];
1038
+ }
1039
+ }
1040
+ };
1041
+ const handleAsyncRowExpand = ($xeTable, row) => {
1042
+ const reactData = $xeTable;
1043
+ const internalData = $xeTable;
1044
+ return new Promise(resolve => {
1045
+ const expandOpts = $xeTable.computeExpandOpts;
1046
+ const { loadMethod } = expandOpts;
1047
+ if (loadMethod) {
1048
+ const { fullAllDataRowIdData, rowExpandLazyLoadedMaps } = internalData;
1049
+ const rowid = getRowid($xeTable, row);
1050
+ const rowRest = fullAllDataRowIdData[rowid];
1051
+ rowExpandLazyLoadedMaps[rowid] = row;
1052
+ loadMethod({ $table: $xeTable, row, rowIndex: $xeTable.getRowIndex(row), $rowIndex: $xeTable.getVMRowIndex(row) }).then(() => {
1053
+ const { rowExpandedMaps } = internalData;
1054
+ if (rowRest) {
1055
+ rowRest.expandLoaded = true;
1056
+ }
1057
+ rowExpandedMaps[rowid] = row;
1058
+ reactData.rowExpandedFlag++;
1059
+ }).catch(() => {
1060
+ if (rowRest) {
1061
+ rowRest.expandLoaded = false;
1062
+ }
1063
+ }).finally(() => {
1064
+ const { rowExpandLazyLoadedMaps } = internalData;
1065
+ if (rowExpandLazyLoadedMaps[rowid]) {
1066
+ delete rowExpandLazyLoadedMaps[rowid];
1067
+ }
1068
+ reactData.rowExpandedFlag++;
1069
+ $xeTable.$nextTick()
1070
+ .then(() => $xeTable.recalculate())
1071
+ .then(() => $xeTable.updateCellAreas())
1072
+ .then(() => resolve());
1073
+ });
1074
+ }
1075
+ else {
1076
+ resolve();
1077
+ }
1078
+ });
1079
+ };
962
1080
  function calcVarRowHeightConfig($xeTable, sizeKey, sizeEl) {
963
1081
  const reactData = $xeTable;
964
1082
  const { rowHeightStore } = reactData;
@@ -1021,12 +1139,13 @@ function handleVirtualYVisible($xeTable) {
1021
1139
  visibleSize = Math.ceil(clientHeight / defaultRowHeight) + 1;
1022
1140
  }
1023
1141
  else {
1142
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
1024
1143
  let leftIndex = 0;
1025
1144
  let rightIndex = afterFullData.length;
1026
1145
  while (leftIndex < rightIndex) {
1027
1146
  const rIndex = Math.floor((leftIndex + rightIndex) / 2);
1028
1147
  const row = afterFullData[rIndex];
1029
- const rowid = getRowid($xeTable, row);
1148
+ const rowid = handleGetRowId(row);
1030
1149
  const rowRest = fullAllDataRowIdData[rowid] || {};
1031
1150
  if (rowRest.oTop <= startTop) {
1032
1151
  leftIndex = rIndex + 1;
@@ -1038,7 +1157,7 @@ function handleVirtualYVisible($xeTable) {
1038
1157
  toVisibleIndex = Math.max(0, leftIndex < afterFullData.length ? leftIndex - 2 : 0);
1039
1158
  for (let rIndex = toVisibleIndex, rLen = afterFullData.length; rIndex < rLen; rIndex++) {
1040
1159
  const row = afterFullData[rIndex];
1041
- const rowid = getRowid($xeTable, row);
1160
+ const rowid = handleGetRowId(row);
1042
1161
  const rowRest = fullAllDataRowIdData[rowid] || {};
1043
1162
  visibleSize++;
1044
1163
  if (rowRest.oTop > endTop || visibleSize >= 100) {
@@ -1068,9 +1187,12 @@ function calculateMergerOffsetIndex(list, offsetItem, type) {
1068
1187
  }
1069
1188
  }
1070
1189
  }
1071
- function setMerges(_vm, merges, mList, rowList) {
1190
+ function setMerges($xeTable, merges, mList, rowList) {
1191
+ const props = $xeTable;
1192
+ const internalData = $xeTable;
1072
1193
  if (merges) {
1073
- const { treeConfig, visibleColumn } = _vm;
1194
+ const { treeConfig } = props;
1195
+ const { visibleColumn } = internalData;
1074
1196
  if (!XEUtils.isArray(merges)) {
1075
1197
  merges = [merges];
1076
1198
  }
@@ -1116,10 +1238,13 @@ function setMerges(_vm, merges, mList, rowList) {
1116
1238
  });
1117
1239
  }
1118
1240
  }
1119
- function removeMerges(_vm, merges, mList, rowList) {
1241
+ function removeMerges($xeTable, merges, mList, rowList) {
1242
+ const props = $xeTable;
1243
+ const internalData = $xeTable;
1120
1244
  const rest = [];
1121
1245
  if (merges) {
1122
- const { treeConfig, visibleColumn } = _vm;
1246
+ const { treeConfig } = props;
1247
+ const { visibleColumn } = internalData;
1123
1248
  if (!XEUtils.isArray(merges)) {
1124
1249
  merges = [merges];
1125
1250
  }
@@ -1299,6 +1424,7 @@ function autoCellWidth($xeTable) {
1299
1424
  internalData.headerHeight = headerHeight;
1300
1425
  internalData.footerHeight = footerHeight;
1301
1426
  reactData.overflowX = overflowX;
1427
+ reactData.resizeWidthFlag++;
1302
1428
  updateColumnOffsetLeft($xeTable);
1303
1429
  updateHeight($xeTable);
1304
1430
  reactData.parentHeight = Math.max(internalData.headerHeight + footerHeight + 20, $xeTable.getParentHeight());
@@ -1326,8 +1452,9 @@ const calcCellHeight = ($xeTable) => {
1326
1452
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
1327
1453
  const el = $xeTable.$refs.refElem;
1328
1454
  if (!isAllOverflow && scrollYLoad && el) {
1455
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
1329
1456
  tableData.forEach(row => {
1330
- const rowid = getRowid($xeTable, row);
1457
+ const rowid = handleGetRowId(row);
1331
1458
  const rowRest = fullAllDataRowIdData[rowid];
1332
1459
  if (rowRest) {
1333
1460
  const height = calcCellAutoHeight(rowRest, el);
@@ -1568,9 +1695,10 @@ function hideDropTip($xeTable) {
1568
1695
  * @param {Event} evnt 事件
1569
1696
  * @param {Row} row 行对象
1570
1697
  */
1571
- function handleTooltip($xeTable, evnt, tdEl, overflowElem, tipElem, params) {
1698
+ function handleTooltip($xeTable, evnt, tdEl, overflowElem, params) {
1572
1699
  const reactData = $xeTable;
1573
- if (!overflowElem) {
1700
+ const tipOverEl = overflowElem || tdEl;
1701
+ if (!tipOverEl) {
1574
1702
  return $xeTable.$nextTick();
1575
1703
  }
1576
1704
  params.cell = tdEl;
@@ -1580,9 +1708,8 @@ function handleTooltip($xeTable, evnt, tdEl, overflowElem, tipElem, params) {
1580
1708
  const { showAll, contentMethod } = tooltipOpts;
1581
1709
  const customContent = contentMethod ? contentMethod(params) : null;
1582
1710
  const useCustom = contentMethod && !XEUtils.eqNull(customContent);
1583
- const content = useCustom ? customContent : XEUtils.toString(column.type === 'html' ? overflowElem.innerText : overflowElem.textContent).trim();
1584
- const isCellOverflow = overflowElem.scrollWidth > overflowElem.clientWidth;
1585
- if (content && (showAll || useCustom || isCellOverflow)) {
1711
+ const content = useCustom ? customContent : XEUtils.toString(column.type === 'html' ? tipOverEl.innerText : tipOverEl.textContent).trim();
1712
+ if (content && (showAll || useCustom || (tipOverEl.scrollWidth > tipOverEl.clientWidth))) {
1586
1713
  Object.assign(tooltipStore, {
1587
1714
  row,
1588
1715
  column,
@@ -1592,7 +1719,7 @@ function handleTooltip($xeTable, evnt, tdEl, overflowElem, tipElem, params) {
1592
1719
  $xeTable.$nextTick(() => {
1593
1720
  const $tooltip = $xeTable.$refs.refTooltip;
1594
1721
  if ($tooltip && $tooltip.open) {
1595
- $tooltip.open(isCellOverflow ? overflowElem : (tipElem || overflowElem), formatText(content));
1722
+ $tooltip.open(tipOverEl, formatText(content));
1596
1723
  }
1597
1724
  });
1598
1725
  }
@@ -1767,8 +1894,8 @@ function parseColumns($xeTable, isReset) {
1767
1894
  const props = $xeTable;
1768
1895
  const reactData = $xeTable;
1769
1896
  const internalData = $xeTable;
1770
- const { showOverflow } = props;
1771
- const rowOpts = $xeTable.computeRowOpts;
1897
+ // const { showOverflow } = props
1898
+ // const rowOpts = $xeTable.computeRowOpts
1772
1899
  const leftList = [];
1773
1900
  const centerList = [];
1774
1901
  const rightList = [];
@@ -1841,28 +1968,28 @@ function parseColumns($xeTable, isReset) {
1841
1968
  reactData.hasFixedColumn = leftList.length > 0 || rightList.length > 0;
1842
1969
  Object.assign(columnStore, { leftList, centerList, rightList });
1843
1970
  if (scrollXLoad) {
1844
- if (showOverflow) {
1845
- if (!rowOpts.height) {
1846
- const errColumn = internalData.tableFullColumn.find(column => column.showOverflow === false);
1847
- if (errColumn) {
1848
- errLog('vxe.error.errProp', [`column[field="${errColumn.field}"].show-overflow=false`, 'show-overflow=true']);
1849
- }
1850
- }
1851
- }
1852
- if (process.env.NODE_ENV === 'development') {
1853
- // if (props.showHeader && !props.showHeaderOverflow) {
1854
- // warnLog('vxe.error.reqProp', ['show-header-overflow'])
1855
- // }
1856
- // if (props.showFooter && !props.showFooterOverflow) {
1857
- // warnLog('vxe.error.reqProp', ['show-footer-overflow'])
1858
- // }
1859
- if (props.spanMethod) {
1860
- warnLog('vxe.error.scrollErrProp', ['span-method']);
1861
- }
1862
- if (props.footerSpanMethod) {
1863
- warnLog('vxe.error.scrollErrProp', ['footer-span-method']);
1864
- }
1865
- }
1971
+ // if (showOverflow) {
1972
+ // if (!rowOpts.height) {
1973
+ // const errColumn = internalData.tableFullColumn.find(column => column.showOverflow === false)
1974
+ // if (errColumn) {
1975
+ // errLog('vxe.error.errProp', [`column[field="${errColumn.field}"].show-overflow=false`, 'show-overflow=true'])
1976
+ // }
1977
+ // }
1978
+ // }
1979
+ // if (process.env.NODE_ENV === 'development') {
1980
+ // if (props.showHeader && !props.showHeaderOverflow) {
1981
+ // warnLog('vxe.error.reqProp', ['show-header-overflow'])
1982
+ // }
1983
+ // if (props.showFooter && !props.showFooterOverflow) {
1984
+ // warnLog('vxe.error.reqProp', ['show-footer-overflow'])
1985
+ // }
1986
+ if (props.spanMethod) {
1987
+ warnLog('vxe.error.scrollErrProp', ['span-method']);
1988
+ }
1989
+ if (props.footerSpanMethod) {
1990
+ warnLog('vxe.error.scrollErrProp', ['footer-span-method']);
1991
+ }
1992
+ // }
1866
1993
  if (isReset) {
1867
1994
  const { visibleSize } = handleVirtualXVisible($xeTable);
1868
1995
  scrollXStore.startIndex = 0;
@@ -1974,6 +2101,35 @@ function loadScrollYData($xeTable) {
1974
2101
  }
1975
2102
  }
1976
2103
  }
2104
+ const createGetRowCacheProp = (prop) => {
2105
+ return function (row) {
2106
+ const $xeTable = this;
2107
+ const internalData = $xeTable;
2108
+ const { fullAllDataRowIdData } = internalData;
2109
+ if (row) {
2110
+ const rowid = getRowid($xeTable, row);
2111
+ const rowRest = fullAllDataRowIdData[rowid];
2112
+ if (rowRest) {
2113
+ return rowRest[prop];
2114
+ }
2115
+ }
2116
+ return -1;
2117
+ };
2118
+ };
2119
+ const createGetColumnCacheProp = (prop) => {
2120
+ return function (column) {
2121
+ const $xeTable = this;
2122
+ const internalData = $xeTable;
2123
+ const { fullColumnIdData } = internalData;
2124
+ if (column) {
2125
+ const colRest = fullColumnIdData[column.id];
2126
+ if (colRest) {
2127
+ return colRest[prop];
2128
+ }
2129
+ }
2130
+ return -1;
2131
+ };
2132
+ };
1977
2133
  function lazyScrollXData($xeTable) {
1978
2134
  const internalData = $xeTable;
1979
2135
  const { lxTimeout, lxRunTime, scrollXStore } = internalData;
@@ -2131,7 +2287,7 @@ function calcCellWidth($xeTable) {
2131
2287
  }
2132
2288
  function handleUpdateColResize($xeTable, evnt, params) {
2133
2289
  $xeTable.analyColumnWidth();
2134
- $xeTable.recalculate(true).then(() => {
2290
+ $xeTable.recalculate().then(() => {
2135
2291
  $xeTable.saveCustomStore('update:width');
2136
2292
  $xeTable.updateCellAreas();
2137
2293
  $xeTable.dispatchEvent('column-resizable-change', params, evnt);
@@ -2143,7 +2299,7 @@ function handleUpdateColResize($xeTable, evnt, params) {
2143
2299
  function handleUpdateRowResize($xeTable, evnt, params) {
2144
2300
  const reactData = $xeTable;
2145
2301
  reactData.resizeHeightFlag++;
2146
- $xeTable.recalculate(true).then(() => {
2302
+ $xeTable.recalculate().then(() => {
2147
2303
  $xeTable.updateCellAreas();
2148
2304
  $xeTable.dispatchEvent('row-resizable-change', params, evnt);
2149
2305
  setTimeout(() => $xeTable.recalculate(true), 300);
@@ -2164,16 +2320,17 @@ function updateColumnOffsetLeft($xeTable) {
2164
2320
  function updateRowOffsetTop($xeTable) {
2165
2321
  const reactData = $xeTable;
2166
2322
  const internalData = $xeTable;
2167
- const { expandColumn, rowExpandedMaps } = reactData;
2168
- const { afterFullData, fullAllDataRowIdData } = internalData;
2323
+ const { expandColumn } = reactData;
2324
+ const { afterFullData, fullAllDataRowIdData, rowExpandedMaps } = internalData;
2169
2325
  const expandOpts = $xeTable.computeExpandOpts;
2170
2326
  const rowOpts = $xeTable.computeRowOpts;
2171
2327
  const cellOpts = $xeTable.computeCellOpts;
2172
2328
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
2329
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
2173
2330
  let offsetTop = 0;
2174
2331
  for (let rIndex = 0, rLen = afterFullData.length; rIndex < rLen; rIndex++) {
2175
2332
  const row = afterFullData[rIndex];
2176
- const rowid = getRowid($xeTable, row);
2333
+ const rowid = handleGetRowId(row);
2177
2334
  const rowRest = fullAllDataRowIdData[rowid] || {};
2178
2335
  rowRest.oTop = offsetTop;
2179
2336
  offsetTop += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight;
@@ -2186,47 +2343,43 @@ function updateRowOffsetTop($xeTable) {
2186
2343
  function updateRowExpandStyle($xeTable) {
2187
2344
  const reactData = $xeTable;
2188
2345
  const internalData = $xeTable;
2189
- const { expandColumn, scrollYLoad, rowExpandedMaps } = reactData;
2346
+ const { expandColumn, scrollYLoad, scrollYTop, isScrollYBig } = reactData;
2190
2347
  const expandOpts = $xeTable.computeExpandOpts;
2191
2348
  const rowOpts = $xeTable.computeRowOpts;
2192
2349
  const cellOpts = $xeTable.computeCellOpts;
2193
2350
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
2194
2351
  const { mode } = expandOpts;
2195
2352
  if (expandColumn && mode === 'fixed') {
2196
- const { elemStore, afterFullData, fullAllDataRowIdData } = internalData;
2353
+ const { elemStore, fullAllDataRowIdData } = internalData;
2197
2354
  const rowExpandEl = $xeTable.$refs.refRowExpandElem;
2198
2355
  const bodyScrollElem = getRefElem(elemStore['main-body-scroll']);
2199
2356
  if (rowExpandEl && bodyScrollElem) {
2200
2357
  let isUpdateHeight = false;
2201
- if (scrollYLoad) {
2202
- let offsetTop = 0;
2203
- for (let rIndex = 0, rLen = afterFullData.length; rIndex < rLen; rIndex++) {
2204
- const row = afterFullData[rIndex];
2205
- const rowid = getRowid($xeTable, row);
2206
- const rowRest = fullAllDataRowIdData[rowid] || {};
2207
- rowRest.oTop = offsetTop;
2208
- offsetTop += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight;
2209
- // 是否展开行
2210
- if (expandColumn && rowExpandedMaps[rowid]) {
2211
- offsetTop += rowRest.expandHeight || expandOpts.height || 0;
2212
- }
2213
- }
2214
- }
2215
2358
  XEUtils.arrayEach(rowExpandEl.children, reEl => {
2216
2359
  const expandEl = reEl;
2217
2360
  const rowid = expandEl.getAttribute('rowid') || '';
2218
2361
  const rowRest = fullAllDataRowIdData[rowid];
2219
2362
  if (rowRest) {
2220
2363
  const expandHeight = expandEl.offsetHeight + 1;
2364
+ const trEl = bodyScrollElem.querySelector(`.vxe-body--row[rowid="${rowid}"]`);
2365
+ let offsetTop = 0;
2221
2366
  if (scrollYLoad) {
2222
- expandEl.style.top = toCssUnit(rowRest.oTop + (rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight));
2367
+ if (isScrollYBig && trEl) {
2368
+ offsetTop = trEl.offsetTop + trEl.offsetHeight;
2369
+ }
2370
+ else {
2371
+ offsetTop = rowRest.oTop + (rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight);
2372
+ }
2223
2373
  }
2224
2374
  else {
2225
- const trEl = bodyScrollElem.querySelector(`.vxe-body--row[rowid="${rowid}"]`);
2226
2375
  if (trEl) {
2227
- expandEl.style.top = toCssUnit(trEl.offsetTop + trEl.offsetHeight);
2376
+ offsetTop = trEl.offsetTop + trEl.offsetHeight;
2228
2377
  }
2229
2378
  }
2379
+ if (isScrollYBig) {
2380
+ offsetTop += scrollYTop;
2381
+ }
2382
+ expandEl.style.top = toCssUnit(offsetTop);
2230
2383
  if (!isUpdateHeight) {
2231
2384
  if (rowRest.expandHeight !== expandHeight) {
2232
2385
  isUpdateHeight = true;
@@ -2237,6 +2390,9 @@ function updateRowExpandStyle($xeTable) {
2237
2390
  });
2238
2391
  if (isUpdateHeight) {
2239
2392
  reactData.rowExpandHeightFlag++;
2393
+ $xeTable.$nextTick(() => {
2394
+ updateRowOffsetTop($xeTable);
2395
+ });
2240
2396
  }
2241
2397
  }
2242
2398
  }
@@ -2252,10 +2408,11 @@ function handleRowExpandScroll($xeTable) {
2252
2408
  }
2253
2409
  const Methods = {
2254
2410
  callSlot(slotFunc, params, h, vNodes) {
2411
+ const $xeTable = this;
2412
+ const $xeGrid = $xeTable.$xeGrid;
2255
2413
  if (slotFunc) {
2256
- const { $xegrid } = this;
2257
- if ($xegrid) {
2258
- return $xegrid.callSlot(slotFunc, params, h, vNodes);
2414
+ if ($xeGrid) {
2415
+ return $xeGrid.callSlot(slotFunc, params, h, vNodes);
2259
2416
  }
2260
2417
  if (XEUtils.isFunction(slotFunc)) {
2261
2418
  return getSlotVNs(slotFunc.call(this, params, h, vNodes));
@@ -2263,21 +2420,43 @@ const Methods = {
2263
2420
  }
2264
2421
  return [];
2265
2422
  },
2423
+ getEl() {
2424
+ const $xeTable = this;
2425
+ return $xeTable.$refs.refElem;
2426
+ },
2266
2427
  /**
2267
2428
  * 获取父容器元素
2268
2429
  */
2269
2430
  getParentElem() {
2270
- const { $el, $xegrid } = this;
2271
- return $xegrid ? $xegrid.$el.parentNode : $el.parentNode;
2431
+ const $xeTable = this;
2432
+ const $xeGrid = $xeTable.$xeGrid;
2433
+ const { $el } = this;
2434
+ return $xeGrid ? $xeGrid.$el.parentNode : $el.parentNode;
2272
2435
  },
2273
2436
  /**
2274
2437
  * 获取父容器的高度
2275
2438
  */
2276
2439
  getParentHeight() {
2277
- const { $el, $xegrid, height } = this;
2278
- const parentElem = $el.parentNode;
2279
- const parentPaddingSize = height === '100%' || height === 'auto' ? getPaddingTopBottomSize(parentElem) : 0;
2280
- return Math.floor($xegrid ? $xegrid.getParentHeight() : XEUtils.toNumber(getComputedStyle(parentElem).height) - parentPaddingSize);
2440
+ const $xeTable = this;
2441
+ const $xeGrid = $xeTable.$xeGrid;
2442
+ const props = $xeTable;
2443
+ const { height } = props;
2444
+ const el = $xeTable.$refs.refElem;
2445
+ if (el) {
2446
+ const parentElem = el.parentNode;
2447
+ const parentPaddingSize = height === '100%' || height === 'auto' ? getPaddingTopBottomSize(parentElem) : 0;
2448
+ let parentWrapperHeight = 0;
2449
+ if (parentElem) {
2450
+ if ($xeGrid && hasClass(parentElem, 'vxe-grid--table-wrapper')) {
2451
+ parentWrapperHeight = $xeGrid.getParentHeight();
2452
+ }
2453
+ else {
2454
+ parentWrapperHeight = parentElem.clientHeight;
2455
+ }
2456
+ }
2457
+ return Math.floor(parentWrapperHeight - parentPaddingSize);
2458
+ }
2459
+ return 0;
2281
2460
  },
2282
2461
  /**
2283
2462
  * 获取需要排除的高度
@@ -2285,8 +2464,9 @@ const Methods = {
2285
2464
  * 如果存在表尾合计滚动条,则需要排除滚动条高度
2286
2465
  */
2287
2466
  getExcludeHeight() {
2288
- const { $xegrid } = this;
2289
- return $xegrid ? $xegrid.getExcludeHeight() : 0;
2467
+ const $xeTable = this;
2468
+ const $xeGrid = $xeTable.$xeGrid;
2469
+ return $xeGrid ? $xeGrid.getExcludeHeight() : 0;
2290
2470
  },
2291
2471
  /**
2292
2472
  * 重置表格的一切数据状态
@@ -2365,6 +2545,9 @@ const Methods = {
2365
2545
  const childrenField = treeOpts.children || treeOpts.childrenField;
2366
2546
  let treeData = [];
2367
2547
  let fullData = datas ? datas.slice(0) : [];
2548
+ if (fullData.length > supportMaxRow) {
2549
+ errLog('vxe.error.errMaxRow', [supportMaxRow]);
2550
+ }
2368
2551
  if (treeConfig) {
2369
2552
  // 树结构自动转换
2370
2553
  if (treeOpts.transform) {
@@ -2607,35 +2790,16 @@ const Methods = {
2607
2790
  const reactData = $xeTable;
2608
2791
  const internalData = $xeTable;
2609
2792
  const { treeConfig } = props;
2610
- const { treeExpandedMaps } = reactData;
2611
- const { fullAllDataRowIdData, tableFullData, tableFullTreeData } = internalData;
2793
+ const { fullAllDataRowIdData, tableFullData, tableFullTreeData, treeExpandedMaps } = internalData;
2612
2794
  const treeOpts = $xeTable.computeTreeOpts;
2613
2795
  const childrenField = treeOpts.children || treeOpts.childrenField;
2614
2796
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
2615
- const rowkey = getRowkey($xeTable);
2797
+ const { lazy } = treeOpts;
2616
2798
  const fullAllDataRowIdMaps = Object.assign({}, fullAllDataRowIdData); // 存在已删除数据
2617
2799
  const fullDataRowIdMaps = {};
2618
- const treeTempExpandedMaps = Object.assign({}, treeExpandedMaps);
2619
- const handleRow = (row, index, items, path, parentRow, nodes) => {
2620
- let rowid = getRowid($xeTable, row);
2621
- const seq = treeConfig && path ? toTreePathSeq(path) : index + 1;
2622
- const level = nodes ? nodes.length - 1 : 0;
2623
- if (eqEmptyValue(rowid)) {
2624
- rowid = getRowUniqueId();
2625
- XEUtils.set(row, rowkey, rowid);
2626
- }
2627
- if (treeConfig && treeOpts.lazy) {
2628
- const treeExpRest = treeExpandedMaps[rowid];
2629
- if (row[hasChildField] && XEUtils.isUndefined(row[childrenField])) {
2630
- row[childrenField] = null;
2631
- }
2632
- if (treeExpRest) {
2633
- if (!row[childrenField] || !row[childrenField].length) {
2634
- delete treeTempExpandedMaps[rowid];
2635
- }
2636
- }
2637
- }
2638
- let rowRest = fullAllDataRowIdData[rowid];
2800
+ const { handleUpdateRowId } = createHandleUpdateRowId($xeTable);
2801
+ const handleRowCache = (row, index, items, currIndex, parentRow, rowid, level, seq) => {
2802
+ let rowRest = fullAllDataRowIdMaps[rowid];
2639
2803
  if (!rowRest) {
2640
2804
  rowRest = { row, rowid, seq, index: -1, _index: -1, $index: -1, treeIndex: index, items, parent: parentRow, level, height: 0, resizeHeight: 0, oTop: 0, expandHeight: 0 };
2641
2805
  }
@@ -2645,35 +2809,48 @@ const Methods = {
2645
2809
  rowRest.items = items;
2646
2810
  rowRest.parent = parentRow;
2647
2811
  rowRest.level = level;
2648
- rowRest.index = treeConfig && parentRow ? -1 : index;
2812
+ rowRest.index = currIndex;
2813
+ rowRest.treeIndex = index;
2649
2814
  fullDataRowIdMaps[rowid] = rowRest;
2650
2815
  fullAllDataRowIdMaps[rowid] = rowRest;
2651
2816
  };
2652
2817
  if (treeConfig) {
2653
- XEUtils.eachTree(tableFullTreeData, handleRow, { children: childrenField });
2818
+ XEUtils.eachTree(tableFullTreeData, (row, index, items, path, parentRow, nodes) => {
2819
+ const rowid = handleUpdateRowId(row);
2820
+ if (treeConfig && lazy) {
2821
+ if (row[hasChildField] && row[childrenField] === undefined) {
2822
+ row[childrenField] = null;
2823
+ }
2824
+ if (treeExpandedMaps[rowid]) {
2825
+ if (!row[childrenField] || !row[childrenField].length) {
2826
+ delete treeExpandedMaps[rowid];
2827
+ }
2828
+ }
2829
+ }
2830
+ handleRowCache(row, index, items, parentRow ? -1 : index, parentRow, rowid, nodes.length - 1, toTreePathSeq(path));
2831
+ }, { children: childrenField });
2654
2832
  }
2655
2833
  else {
2656
- tableFullData.forEach(handleRow);
2834
+ tableFullData.forEach((row, index, items) => {
2835
+ handleRowCache(row, index, items, index, null, handleUpdateRowId(row), 0, index + 1);
2836
+ });
2657
2837
  }
2658
2838
  internalData.fullDataRowIdData = fullDataRowIdMaps;
2659
2839
  internalData.fullAllDataRowIdData = fullAllDataRowIdMaps;
2660
- reactData.treeExpandedMaps = treeTempExpandedMaps;
2840
+ reactData.treeExpandedFlag++;
2661
2841
  },
2662
2842
  cacheSourceMap(fullData) {
2663
- let { treeConfig, treeOpts, sourceDataRowIdData } = this;
2843
+ const $xeTable = this;
2844
+ const props = $xeTable;
2845
+ const internalData = $xeTable;
2846
+ const { treeConfig } = props;
2847
+ const treeOpts = $xeTable.computeTreeOpts;
2664
2848
  const sourceData = XEUtils.clone(fullData, true);
2665
- const rowkey = getRowkey(this);
2666
- sourceDataRowIdData = this.sourceDataRowIdData = {};
2849
+ const { handleUpdateRowId } = createHandleUpdateRowId($xeTable);
2850
+ const sourceRowIdData = {};
2667
2851
  const handleSourceRow = (row) => {
2668
- let rowid = getRowid(this, row);
2669
- if (eqEmptyValue(rowid)) {
2670
- rowid = getRowUniqueId();
2671
- XEUtils.set(row, rowkey, rowid);
2672
- }
2673
- sourceDataRowIdData[rowid] = {
2674
- row,
2675
- rowid
2676
- };
2852
+ const rowid = handleUpdateRowId(row);
2853
+ sourceRowIdData[rowid] = row;
2677
2854
  };
2678
2855
  // 源数据缓存
2679
2856
  if (treeConfig) {
@@ -2683,7 +2860,8 @@ const Methods = {
2683
2860
  else {
2684
2861
  sourceData.forEach(handleSourceRow);
2685
2862
  }
2686
- this.tableSourceData = sourceData;
2863
+ internalData.sourceDataRowIdData = sourceRowIdData;
2864
+ internalData.tableSourceData = sourceData;
2687
2865
  },
2688
2866
  getParams() {
2689
2867
  return this.params;
@@ -2770,47 +2948,22 @@ const Methods = {
2770
2948
  * 根据 row 获取序号
2771
2949
  * @param {Row} row 行对象
2772
2950
  */
2773
- getRowSeq(row) {
2774
- const { fullAllDataRowIdData } = this;
2775
- if (row) {
2776
- const rowid = getRowid(this, row);
2777
- const rest = fullAllDataRowIdData[rowid];
2778
- if (rest) {
2779
- return rest.seq;
2780
- }
2781
- }
2782
- return -1;
2783
- },
2951
+ getRowSeq: createGetRowCacheProp('seq'),
2784
2952
  /**
2785
2953
  * 根据 row 获取相对于 data 中的索引
2786
2954
  * @param {Row} row 行对象
2787
2955
  */
2788
- getRowIndex(row) {
2789
- const { fullAllDataRowIdData } = this;
2790
- if (row) {
2791
- const rowid = getRowid(this, row);
2792
- const rest = fullAllDataRowIdData[rowid];
2793
- if (rest) {
2794
- return rest.index;
2795
- }
2796
- }
2797
- return -1;
2798
- },
2956
+ getRowIndex: createGetRowCacheProp('index'),
2799
2957
  /**
2800
2958
  * 根据 row 获取相对于当前数据中的索引
2801
2959
  * @param {Row} row 行对象
2802
2960
  */
2803
- getVTRowIndex(row) {
2804
- const { fullAllDataRowIdData } = this;
2805
- if (row) {
2806
- const rowid = getRowid(this, row);
2807
- const rest = fullAllDataRowIdData[rowid];
2808
- if (rest) {
2809
- return rest._index;
2810
- }
2811
- }
2812
- return -1;
2813
- },
2961
+ getVTRowIndex: createGetRowCacheProp('_index'),
2962
+ /**
2963
+ * 根据 row 获取渲染中的虚拟索引
2964
+ * @param {Row} row 行对象
2965
+ */
2966
+ getVMRowIndex: createGetRowCacheProp('$index'),
2814
2967
  // 在 v3 中废弃
2815
2968
  _getRowIndex(row) {
2816
2969
  if (process.env.NODE_ENV === 'development') {
@@ -2818,21 +2971,6 @@ const Methods = {
2818
2971
  }
2819
2972
  return this.getVTRowIndex(row);
2820
2973
  },
2821
- /**
2822
- * 根据 row 获取渲染中的虚拟索引
2823
- * @param {Row} row 行对象
2824
- */
2825
- getVMRowIndex(row) {
2826
- const { fullAllDataRowIdData } = this;
2827
- if (row) {
2828
- const rowid = getRowid(this, row);
2829
- const rest = fullAllDataRowIdData[rowid];
2830
- if (rest) {
2831
- return rest.$index;
2832
- }
2833
- }
2834
- return -1;
2835
- },
2836
2974
  // 在 v3 中废弃
2837
2975
  $getRowIndex(row) {
2838
2976
  if (process.env.NODE_ENV === 'development') {
@@ -2844,30 +2982,17 @@ const Methods = {
2844
2982
  * 根据 column 获取相对于 columns 中的索引
2845
2983
  * @param {ColumnInfo} column 列配置
2846
2984
  */
2847
- getColumnIndex(column) {
2848
- const { fullColumnIdData } = this;
2849
- if (column) {
2850
- const rest = fullColumnIdData[column.id];
2851
- if (rest) {
2852
- return rest.index;
2853
- }
2854
- }
2855
- return -1;
2856
- },
2985
+ getColumnIndex: createGetColumnCacheProp('index'),
2857
2986
  /**
2858
2987
  * 根据 column 获取相对于当前表格列中的索引
2859
2988
  * @param {ColumnInfo} column 列配置
2860
2989
  */
2861
- getVTColumnIndex(column) {
2862
- const { fullColumnIdData } = this;
2863
- if (column) {
2864
- const rest = fullColumnIdData[column.id];
2865
- if (rest) {
2866
- return rest._index;
2867
- }
2868
- }
2869
- return -1;
2870
- },
2990
+ getVTColumnIndex: createGetColumnCacheProp('_index'),
2991
+ /**
2992
+ * 根据 column 获取渲染中的虚拟索引
2993
+ * @param {ColumnInfo} column 列配置
2994
+ */
2995
+ getVMColumnIndex: createGetColumnCacheProp('$index'),
2871
2996
  // 在 v3 中废弃
2872
2997
  _getColumnIndex(column) {
2873
2998
  if (process.env.NODE_ENV === 'development') {
@@ -2875,20 +3000,6 @@ const Methods = {
2875
3000
  }
2876
3001
  return this.getVTColumnIndex(column);
2877
3002
  },
2878
- /**
2879
- * 根据 column 获取渲染中的虚拟索引
2880
- * @param {ColumnInfo} column 列配置
2881
- */
2882
- getVMColumnIndex(column) {
2883
- const { fullColumnIdData } = this;
2884
- if (column) {
2885
- const rest = fullColumnIdData[column.id];
2886
- if (rest) {
2887
- return rest.$index;
2888
- }
2889
- }
2890
- return -1;
2891
- },
2892
3003
  // 在 v3 中废弃
2893
3004
  $getColumnIndex(column) {
2894
3005
  if (process.env.NODE_ENV === 'development') {
@@ -2982,12 +3093,15 @@ const Methods = {
2982
3093
  const reactData = $xeTable;
2983
3094
  const internalData = $xeTable;
2984
3095
  const { keepSource, treeConfig } = props;
2985
- const { fullAllDataRowIdData, tableSourceData, sourceDataRowIdData, tableFullData, afterFullData } = internalData;
3096
+ const { editStore } = reactData;
3097
+ const { fullAllDataRowIdData, fullDataRowIdData, tableSourceData, sourceDataRowIdData, tableFullData, afterFullData } = internalData;
3098
+ const removeTempMaps = Object.assign({}, editStore.removeMaps);
2986
3099
  const treeOpts = $xeTable.computeTreeOpts;
2987
3100
  const { transform } = treeOpts;
3101
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
2988
3102
  if (!keepSource) {
2989
3103
  if (process.env.NODE_ENV === 'development') {
2990
- warnLog('vxe.error.reqProp', ['keep-source']);
3104
+ errLog('vxe.error.reqProp', ['keep-source']);
2991
3105
  }
2992
3106
  return $xeTable.$nextTick();
2993
3107
  }
@@ -3002,23 +3116,24 @@ const Methods = {
3002
3116
  }
3003
3117
  let reDelFlag = false;
3004
3118
  if (targetRows.length) {
3005
- targetRows.forEach((row) => {
3006
- if (!$xeTable.isInsertByRow(row)) {
3007
- const rowid = getRowid($xeTable, row);
3008
- const oRow = sourceDataRowIdData[rowid];
3009
- if (oRow && row) {
3010
- if (field) {
3011
- XEUtils.set(row, field, XEUtils.clone(XEUtils.get(oRow, field), true));
3012
- }
3013
- else {
3014
- XEUtils.destructuring(row, XEUtils.clone(oRow, true));
3015
- }
3016
- if ($xeTable.isRemoveByRow(row)) {
3017
- const rowRest = fullAllDataRowIdData[rowid];
3018
- if (rowRest) {
3019
- const reRow = rowRest.row;
3020
- tableFullData.unshift(reRow);
3021
- afterFullData.unshift(reRow);
3119
+ targetRows.forEach((item) => {
3120
+ const rowid = handleGetRowId(item);
3121
+ const rowRest = fullAllDataRowIdData[rowid];
3122
+ if (rowRest) {
3123
+ const row = rowRest.row;
3124
+ if (!$xeTable.isInsertByRow(row)) {
3125
+ const oRow = sourceDataRowIdData[rowid];
3126
+ if (oRow && row) {
3127
+ if (field) {
3128
+ XEUtils.set(row, field, XEUtils.clone(XEUtils.get(oRow, field), true));
3129
+ }
3130
+ else {
3131
+ XEUtils.destructuring(row, XEUtils.clone(oRow, true));
3132
+ }
3133
+ if (!fullDataRowIdData[rowid] && $xeTable.isRemoveByRow(row)) {
3134
+ delete removeTempMaps[rowid];
3135
+ tableFullData.unshift(row);
3136
+ afterFullData.unshift(row);
3022
3137
  reDelFlag = true;
3023
3138
  }
3024
3139
  }
@@ -3028,6 +3143,7 @@ const Methods = {
3028
3143
  }
3029
3144
  if (rows) {
3030
3145
  if (reDelFlag) {
3146
+ editStore.removeMaps = removeTempMaps;
3031
3147
  $xeTable.updateFooter();
3032
3148
  $xeTable.cacheRowMap(false);
3033
3149
  $xeTable.handleTableData(treeConfig && transform);
@@ -3190,20 +3306,25 @@ const Methods = {
3190
3306
  },
3191
3307
  /**
3192
3308
  * 检查行或列数据是否发生改变
3193
- * @param {Row} row 行对象
3309
+ * @param {Row} rowOrId 行对象
3194
3310
  * @param {String} field 字段名
3195
3311
  */
3196
- isUpdateByRow(row, field) {
3197
- const { tableFullColumn, keepSource, sourceDataRowIdData, fullDataRowIdData } = this;
3312
+ isUpdateByRow(rowOrId, field) {
3313
+ const $xeTable = this;
3314
+ const props = $xeTable;
3315
+ const internalData = $xeTable;
3316
+ const { keepSource } = props;
3317
+ const { tableFullColumn, fullDataRowIdData, sourceDataRowIdData } = internalData;
3198
3318
  if (keepSource) {
3199
- const rowid = getRowid(this, row);
3319
+ const rowid = XEUtils.isString(rowOrId) || XEUtils.isNumber(rowOrId) ? rowOrId : getRowid($xeTable, rowOrId);
3320
+ const rowRest = fullDataRowIdData[rowid];
3200
3321
  // 新增的数据不需要检测
3201
- if (!fullDataRowIdData[rowid]) {
3322
+ if (!rowRest) {
3202
3323
  return false;
3203
3324
  }
3204
- const oldRest = sourceDataRowIdData[rowid];
3205
- if (oldRest) {
3206
- const oRow = oldRest.row;
3325
+ const row = rowRest.row;
3326
+ const oRow = sourceDataRowIdData[rowid];
3327
+ if (oRow) {
3207
3328
  if (arguments.length > 1) {
3208
3329
  return !eqCellValue(oRow, row, field);
3209
3330
  }
@@ -3265,6 +3386,99 @@ const Methods = {
3265
3386
  tableColumn: this.tableColumn.slice(0)
3266
3387
  };
3267
3388
  },
3389
+ /**
3390
+ * 移动列到指定列的位置
3391
+ * @param fieldOrColumn
3392
+ * @param targetFieldOrColumn
3393
+ * @param options
3394
+ */
3395
+ moveColumnTo(fieldOrColumn, targetFieldOrColumn, options) {
3396
+ const $xeTable = this;
3397
+ const internalData = $xeTable;
3398
+ const { fullColumnIdData, visibleColumn } = internalData;
3399
+ const { dragToChild, dragPos, isCrossDrag } = Object.assign({}, options);
3400
+ const dragCol = handleFieldOrColumn($xeTable, fieldOrColumn);
3401
+ let prevDragCol = null;
3402
+ const colRest = dragCol ? fullColumnIdData[dragCol.id] : null;
3403
+ let defPos = 'left';
3404
+ if (XEUtils.isNumber(targetFieldOrColumn)) {
3405
+ if (colRest && targetFieldOrColumn) {
3406
+ let currList = colRest.items;
3407
+ let offsetIndex = colRest._index + targetFieldOrColumn;
3408
+ if (isCrossDrag) {
3409
+ currList = visibleColumn;
3410
+ offsetIndex = colRest._index + targetFieldOrColumn;
3411
+ }
3412
+ if (offsetIndex > 0 && offsetIndex < currList.length - 1) {
3413
+ prevDragCol = currList[offsetIndex];
3414
+ }
3415
+ if (targetFieldOrColumn > 0) {
3416
+ defPos = 'right';
3417
+ }
3418
+ }
3419
+ }
3420
+ else {
3421
+ prevDragCol = handleFieldOrColumn($xeTable, targetFieldOrColumn);
3422
+ const targetColRest = prevDragCol ? fullColumnIdData[prevDragCol.id] : null;
3423
+ if (colRest && targetColRest) {
3424
+ if (targetColRest._index > colRest._index) {
3425
+ defPos = 'right';
3426
+ }
3427
+ }
3428
+ }
3429
+ return $xeTable.handleColDragSwapEvent(null, true, dragCol, prevDragCol, dragPos || defPos, dragToChild === true);
3430
+ },
3431
+ /**
3432
+ * 移动行到指定行的位置
3433
+ * @param rowidOrRow
3434
+ * @param targetRowidOrRow
3435
+ * @param options
3436
+ */
3437
+ moveRowTo(rowidOrRow, targetRowidOrRow, options) {
3438
+ const $xeTable = this;
3439
+ const props = $xeTable;
3440
+ const internalData = $xeTable;
3441
+ const { treeConfig } = props;
3442
+ const { fullAllDataRowIdData, afterFullData } = internalData;
3443
+ const { dragToChild, dragPos, isCrossDrag } = Object.assign({}, options);
3444
+ const treeOpts = $xeTable.computeTreeOpts;
3445
+ const dragRow = handleRowidOrRow($xeTable, rowidOrRow);
3446
+ let prevDragRow = null;
3447
+ let defPos = 'top';
3448
+ const rowRest = dragRow ? fullAllDataRowIdData[getRowid($xeTable, dragRow)] : null;
3449
+ if (XEUtils.isNumber(targetRowidOrRow)) {
3450
+ if (rowRest && targetRowidOrRow) {
3451
+ let currList = afterFullData;
3452
+ let offsetIndex = rowRest._index + targetRowidOrRow;
3453
+ if (treeConfig) {
3454
+ currList = rowRest.items;
3455
+ if (treeOpts.transform) {
3456
+ offsetIndex = rowRest.treeIndex + targetRowidOrRow;
3457
+ if (isCrossDrag) {
3458
+ currList = afterFullData;
3459
+ offsetIndex = rowRest._index + targetRowidOrRow;
3460
+ }
3461
+ }
3462
+ }
3463
+ if (offsetIndex >= 0 && offsetIndex <= currList.length - 1) {
3464
+ prevDragRow = currList[offsetIndex];
3465
+ }
3466
+ if (targetRowidOrRow > 0) {
3467
+ defPos = 'bottom';
3468
+ }
3469
+ }
3470
+ }
3471
+ else {
3472
+ prevDragRow = handleRowidOrRow($xeTable, targetRowidOrRow);
3473
+ const targetRowRest = prevDragRow ? fullAllDataRowIdData[getRowid($xeTable, prevDragRow)] : null;
3474
+ if (rowRest && targetRowRest) {
3475
+ if (targetRowRest._index > rowRest._index) {
3476
+ defPos = 'bottom';
3477
+ }
3478
+ }
3479
+ }
3480
+ return $xeTable.handleRowDragSwapEvent(null, true, dragRow, prevDragRow, dragPos || defPos, dragToChild === true);
3481
+ },
3268
3482
  /**
3269
3483
  * 获取表格的全量列
3270
3484
  */
@@ -3285,22 +3499,28 @@ const Methods = {
3285
3499
  * 用于多选行,获取已选中的数据
3286
3500
  */
3287
3501
  getCheckboxRecords(isFull) {
3288
- const { tableFullData, afterFullData, treeConfig, treeOpts, checkboxOpts, tableFullTreeData, afterTreeFullData, afterFullRowMaps } = this;
3502
+ const $xeTable = this;
3503
+ const props = $xeTable;
3504
+ const internalData = $xeTable;
3505
+ const { treeConfig } = props;
3506
+ const { tableFullData, afterFullData, afterTreeFullData, tableFullTreeData, fullDataRowIdData, afterFullRowMaps, selectCheckboxMaps } = internalData;
3507
+ const treeOpts = $xeTable.computeTreeOpts;
3508
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
3289
3509
  const { transform, mapChildrenField } = treeOpts;
3290
3510
  const { checkField } = checkboxOpts;
3291
3511
  const childrenField = treeOpts.children || treeOpts.childrenField;
3292
- const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData);
3293
3512
  let rowList = [];
3294
3513
  if (checkField) {
3295
3514
  if (treeConfig) {
3515
+ const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData);
3296
3516
  rowList = XEUtils.filterTree(currTableData, row => XEUtils.get(row, checkField), { children: transform ? mapChildrenField : childrenField });
3297
3517
  }
3298
3518
  else {
3519
+ const currTableData = isFull ? tableFullData : afterFullData;
3299
3520
  rowList = currTableData.filter((row) => XEUtils.get(row, checkField));
3300
3521
  }
3301
3522
  }
3302
3523
  else {
3303
- const { selectCheckboxMaps, fullDataRowIdData } = this;
3304
3524
  XEUtils.each(selectCheckboxMaps, (row, rowid) => {
3305
3525
  if (isFull) {
3306
3526
  if (fullDataRowIdData[rowid]) {
@@ -3331,7 +3551,7 @@ const Methods = {
3331
3551
  const treeOpts = $xeTable.computeTreeOpts;
3332
3552
  const childrenField = treeOpts.children || treeOpts.childrenField;
3333
3553
  const { transform, rowField, parentField, mapChildrenField } = treeOpts;
3334
- const { remote: allRemoteFilter, filterMethod: allFilterMethod } = filterOpts;
3554
+ const { isEvery, remote: allRemoteFilter, filterMethod: allFilterMethod } = filterOpts;
3335
3555
  const { remote: allRemoteSort, sortMethod: allSortMethod, multiple: sortMultiple, chronological } = sortOpts;
3336
3556
  let tableData = [];
3337
3557
  let tableTree = [];
@@ -3390,7 +3610,7 @@ const Methods = {
3390
3610
  // 筛选虚拟树
3391
3611
  tableTree = XEUtils.searchTree(tableFullTreeData, handleFilter, {
3392
3612
  original: true,
3393
- isEvery: true,
3613
+ isEvery,
3394
3614
  children: mapChildrenField,
3395
3615
  mapChildren: childrenField
3396
3616
  });
@@ -3406,7 +3626,7 @@ const Methods = {
3406
3626
  // 还原虚拟树
3407
3627
  tableTree = XEUtils.searchTree(tableFullTreeData, () => true, {
3408
3628
  original: true,
3409
- isEvery: true,
3629
+ isEvery,
3410
3630
  children: mapChildrenField,
3411
3631
  mapChildren: childrenField
3412
3632
  });
@@ -3469,7 +3689,7 @@ const Methods = {
3469
3689
  // 还原虚拟树
3470
3690
  tableTree = XEUtils.searchTree(tableFullTreeData, () => true, {
3471
3691
  original: true,
3472
- isEvery: true,
3692
+ isEvery,
3473
3693
  children: treeOpts.mapChildrenField,
3474
3694
  mapChildren: childrenField
3475
3695
  });
@@ -3616,6 +3836,7 @@ const Methods = {
3616
3836
  * 默认执行一次,除非被重置
3617
3837
  */
3618
3838
  handleLoadDefaults() {
3839
+ const $xeTable = this;
3619
3840
  if (this.checkboxConfig) {
3620
3841
  this.handleDefaultSelectionChecked();
3621
3842
  }
@@ -3626,7 +3847,7 @@ const Methods = {
3626
3847
  this.handleDefaultRowExpand();
3627
3848
  }
3628
3849
  if (this.treeConfig) {
3629
- this.handleDefaultTreeExpand();
3850
+ handleDefaultTreeExpand($xeTable);
3630
3851
  }
3631
3852
  if (this.mergeCells) {
3632
3853
  this.handleDefaultMergeCells();
@@ -3814,9 +4035,9 @@ const Methods = {
3814
4035
  return this.refreshColumn(true);
3815
4036
  },
3816
4037
  handleCustomRestore(storeData) {
3817
- const $xetable = this;
3818
- const reactData = $xetable;
3819
- const internalData = $xetable;
4038
+ const $xeTable = this;
4039
+ const reactData = $xeTable;
4040
+ const internalData = $xeTable;
3820
4041
  let { collectColumn } = internalData;
3821
4042
  const { resizableData, sortData, visibleData, fixedData } = storeData;
3822
4043
  let hasCustomSort = false;
@@ -3885,8 +4106,19 @@ const Methods = {
3885
4106
  }
3886
4107
  },
3887
4108
  getCustomStoreData() {
3888
- const { id, customOpts, collectColumn } = this;
3889
- const { checkMethod } = customOpts;
4109
+ const $xeTable = this;
4110
+ const props = $xeTable;
4111
+ const internalData = $xeTable;
4112
+ const { id } = props;
4113
+ const customOpts = $xeTable.computeCustomOpts;
4114
+ const { collectColumn } = internalData;
4115
+ const { storage, checkMethod } = customOpts;
4116
+ const isAllCustom = storage === true;
4117
+ const storageOpts = isAllCustom ? {} : Object.assign({}, storage || {});
4118
+ const isCustomResizable = isAllCustom || storageOpts.resizable;
4119
+ const isCustomVisible = isAllCustom || storageOpts.visible;
4120
+ const isCustomFixed = isAllCustom || storageOpts.fixed;
4121
+ const isCustomSort = isAllCustom || storageOpts.sort;
3890
4122
  const resizableData = {};
3891
4123
  const sortData = {};
3892
4124
  const visibleData = {};
@@ -3903,47 +4135,37 @@ const Methods = {
3903
4135
  }
3904
4136
  let hasResizable = 0;
3905
4137
  let hasSort = 0;
3906
- let hasFixedt = 0;
4138
+ let hasFixed = 0;
3907
4139
  let hasVisible = 0;
3908
4140
  XEUtils.eachTree(collectColumn, (column, index, items, path, parentColumn) => {
4141
+ const colKey = column.getKey();
4142
+ if (!colKey) {
4143
+ errLog('vxe.error.reqProp', [`${column.getTitle() || column.type || ''} -> column.field=?`]);
4144
+ return;
4145
+ }
3909
4146
  // 只支持一级
3910
4147
  if (!parentColumn) {
3911
- collectColumn.forEach((column) => {
3912
- const colKey = column.getKey();
3913
- if (colKey) {
3914
- hasSort = 1;
3915
- sortData[colKey] = column.renderSortNumber;
3916
- }
3917
- });
3918
- if (column.fixed !== column.defaultFixed) {
3919
- const colKey = column.getKey();
3920
- if (colKey) {
3921
- hasFixedt = 1;
3922
- fixedData[colKey] = column.fixed;
3923
- }
4148
+ if (isCustomSort) {
4149
+ hasSort = 1;
4150
+ sortData[colKey] = column.renderSortNumber;
3924
4151
  }
3925
- }
3926
- if (column.resizeWidth) {
3927
- const colKey = column.getKey();
3928
- if (colKey) {
3929
- hasResizable = 1;
3930
- resizableData[colKey] = column.renderWidth;
4152
+ if (isCustomFixed && column.fixed !== column.defaultFixed) {
4153
+ hasFixed = 1;
4154
+ fixedData[colKey] = column.fixed;
3931
4155
  }
3932
4156
  }
3933
- if (!checkMethod || checkMethod({ column })) {
4157
+ if (isCustomResizable && column.resizeWidth) {
4158
+ hasResizable = 1;
4159
+ resizableData[colKey] = column.renderWidth;
4160
+ }
4161
+ if (isCustomVisible && (!checkMethod || checkMethod({ column }))) {
3934
4162
  if (!column.visible && column.defaultVisible) {
3935
- const colKey = column.getKey();
3936
- if (colKey) {
3937
- hasVisible = 1;
3938
- visibleData[colKey] = false;
3939
- }
4163
+ hasVisible = 1;
4164
+ visibleData[colKey] = false;
3940
4165
  }
3941
4166
  else if (column.visible && !column.defaultVisible) {
3942
- const colKey = column.getKey();
3943
- if (colKey) {
3944
- hasVisible = 1;
3945
- visibleData[colKey] = true;
3946
- }
4167
+ hasVisible = 1;
4168
+ visibleData[colKey] = true;
3947
4169
  }
3948
4170
  }
3949
4171
  });
@@ -3953,7 +4175,7 @@ const Methods = {
3953
4175
  if (hasSort) {
3954
4176
  storeData.sortData = sortData;
3955
4177
  }
3956
- if (hasFixedt) {
4178
+ if (hasFixed) {
3957
4179
  storeData.fixedData = fixedData;
3958
4180
  }
3959
4181
  if (hasVisible) {
@@ -4441,12 +4663,13 @@ const Methods = {
4441
4663
  const $xeTable = this;
4442
4664
  const internalData = $xeTable;
4443
4665
  const { fullAllDataRowIdData, afterFullData } = internalData;
4666
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
4444
4667
  const rowOpts = $xeTable.computeRowOpts;
4445
4668
  const cellOpts = $xeTable.computeCellOpts;
4446
4669
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
4447
4670
  const rest = {};
4448
4671
  afterFullData.forEach(row => {
4449
- const rowid = getRowid($xeTable, row);
4672
+ const rowid = handleGetRowId(row);
4450
4673
  const rowRest = fullAllDataRowIdData[rowid];
4451
4674
  if (rowRest) {
4452
4675
  const resizeHeight = rowRest.resizeHeight;
@@ -4473,8 +4696,9 @@ const Methods = {
4473
4696
  rHeight = Math.floor(rHeight * bodyHeight);
4474
4697
  }
4475
4698
  if (rHeight) {
4699
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
4476
4700
  rows.forEach(row => {
4477
- const rowid = XEUtils.isString(row) || XEUtils.isNumber(row) ? row : getRowid($xeTable, row);
4701
+ const rowid = XEUtils.isString(row) || XEUtils.isNumber(row) ? row : handleGetRowId(row);
4478
4702
  const rowRest = fullAllDataRowIdData[rowid];
4479
4703
  if (rowRest) {
4480
4704
  rowRest.resizeHeight = rHeight;
@@ -4615,6 +4839,8 @@ const Methods = {
4615
4839
  }
4616
4840
  },
4617
4841
  preventEvent(evnt, type, args, next, end) {
4842
+ const $xeTable = this;
4843
+ const $xeGrid = $xeTable.$xeGrid;
4618
4844
  let evntList = interceptor.get(type);
4619
4845
  // 兼容老版本
4620
4846
  if (!evntList.length && type === 'event.clearEdit') {
@@ -4626,8 +4852,22 @@ const Methods = {
4626
4852
  }
4627
4853
  }
4628
4854
  // 兼容老版本
4629
- let rest;
4630
- if (!evntList.some(func => func(Object.assign({ $grid: this.$xegrid, $table: this, $event: evnt }, args)) === false)) {
4855
+ let rest = null;
4856
+ let isStop = false;
4857
+ for (let i = 0; i < evntList.length; i++) {
4858
+ const func = evntList[i];
4859
+ const fnRest = func(Object.assign({ $grid: $xeGrid, $table: $xeTable, $event: evnt }, args));
4860
+ if (fnRest === false) {
4861
+ isStop = true;
4862
+ break;
4863
+ }
4864
+ else if (fnRest && fnRest.status === false) {
4865
+ rest = fnRest.result;
4866
+ isStop = true;
4867
+ break;
4868
+ }
4869
+ }
4870
+ if (!isStop) {
4631
4871
  if (next) {
4632
4872
  rest = next();
4633
4873
  }
@@ -4641,7 +4881,9 @@ const Methods = {
4641
4881
  * 全局按下事件处理
4642
4882
  */
4643
4883
  handleGlobalMousedownEvent(evnt) {
4644
- const { $el, $refs, $xegrid, $toolbar, mouseConfig, editStore, ctxMenuStore, editRules, editOpts, validOpts, areaOpts, filterStore, customStore, getRowNode } = this;
4884
+ const $xeTable = this;
4885
+ const $xeGrid = $xeTable.$xeGrid;
4886
+ const { $el, $refs, $toolbar, mouseConfig, editStore, ctxMenuStore, editRules, editOpts, validOpts, areaOpts, filterStore, customStore, getRowNode } = this;
4645
4887
  const { actived } = editStore;
4646
4888
  const { customWrapper, refValidTooltip } = $refs;
4647
4889
  const tableFilter = $refs.refTableFilter;
@@ -4731,7 +4973,7 @@ const Methods = {
4731
4973
  }
4732
4974
  }
4733
4975
  else if (mouseConfig) {
4734
- if (!getEventTargetNode(evnt, $el).flag && !($xegrid && getEventTargetNode(evnt, $xegrid.$el).flag) && !(tableMenu && getEventTargetNode(evnt, tableMenu.$el).flag) && !($toolbar && getEventTargetNode(evnt, $toolbar.$el).flag)) {
4976
+ if (!getEventTargetNode(evnt, $el).flag && !($xeGrid && getEventTargetNode(evnt, $xeGrid.$el).flag) && !(tableMenu && getEventTargetNode(evnt, tableMenu.$el).flag) && !($toolbar && getEventTargetNode(evnt, $toolbar.$el).flag)) {
4735
4977
  if (this.clearSelected) {
4736
4978
  this.clearSelected();
4737
4979
  }
@@ -4753,7 +4995,7 @@ const Methods = {
4753
4995
  if (ctxMenuStore.visible && tableMenu && !getEventTargetNode(evnt, tableMenu.$el).flag) {
4754
4996
  this.closeMenu();
4755
4997
  }
4756
- const isActivated = getEventTargetNode(evnt, ($xegrid || this).$el).flag;
4998
+ const isActivated = getEventTargetNode(evnt, ($xeGrid || this).$el).flag;
4757
4999
  // 如果存在校验,点击了表格之外则清除
4758
5000
  if (!isActivated && editRules && validOpts.autoClear) {
4759
5001
  this.validErrorMaps = {};
@@ -4817,6 +5059,7 @@ const Methods = {
4817
5059
  handleGlobalKeydownEvent(evnt) {
4818
5060
  const $xeTable = this;
4819
5061
  const internalData = $xeTable;
5062
+ const $xeGrid = $xeTable.$xeGrid;
4820
5063
  // 该行为只对当前激活的表格有效
4821
5064
  if (this.isActivated) {
4822
5065
  this.preventEvent(evnt, 'event.keydown', null, () => {
@@ -4915,7 +5158,7 @@ const Methods = {
4915
5158
  this.moveTabSelected(activeParams, hasShiftKey, evnt);
4916
5159
  }
4917
5160
  else {
4918
- this.moveSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt);
5161
+ this.moveEnterSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt);
4919
5162
  }
4920
5163
  }
4921
5164
  else {
@@ -4949,7 +5192,7 @@ const Methods = {
4949
5192
  return;
4950
5193
  }
4951
5194
  }
4952
- this.moveSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt);
5195
+ this.moveEnterSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt);
4953
5196
  if (enterMethod) {
4954
5197
  enterMethod(etrParams);
4955
5198
  }
@@ -4975,11 +5218,7 @@ const Methods = {
4975
5218
  if (!isEditStatus) {
4976
5219
  // 如果按下了方向键
4977
5220
  if (selected.row && selected.column) {
4978
- this.moveSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt);
4979
- }
4980
- else if ((isUpArrow || isDwArrow) && (rowOpts.isCurrent || highlightCurrentRow)) {
4981
- // 当前行按键上下移动
4982
- this.moveCurrentRow(isUpArrow, isDwArrow, evnt);
5221
+ $xeTable.moveArrowSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt);
4983
5222
  }
4984
5223
  }
4985
5224
  }
@@ -5002,7 +5241,7 @@ const Methods = {
5002
5241
  column: selected.column,
5003
5242
  columnIndex: this.getColumnIndex(selected.column),
5004
5243
  $table: this,
5005
- $grid: this.$xegrid
5244
+ $grid: $xeGrid
5006
5245
  };
5007
5246
  // 是否被禁用
5008
5247
  if (!beforeEditMethod || beforeEditMethod(params)) {
@@ -5029,7 +5268,7 @@ const Methods = {
5029
5268
  column: selected.column,
5030
5269
  columnIndex: this.getColumnIndex(selected.column),
5031
5270
  $table: this,
5032
- $grid: this.$xegrid
5271
+ $grid: $xeGrid
5033
5272
  };
5034
5273
  // 是否被禁用
5035
5274
  if (!beforeEditMethod || beforeEditMethod(params)) {
@@ -5058,7 +5297,7 @@ const Methods = {
5058
5297
  rowIndex: this.getRowIndex(parentRow),
5059
5298
  $rowIndex: this.getVMRowIndex(parentRow),
5060
5299
  $table: this,
5061
- $grid: this.$xegrid
5300
+ $grid: $xeGrid
5062
5301
  };
5063
5302
  this.setTreeExpand(parentRow, false)
5064
5303
  .then(() => this.scrollToRow(parentRow))
@@ -5080,7 +5319,7 @@ const Methods = {
5080
5319
  column: selected.column,
5081
5320
  columnIndex: this.getColumnIndex(selected.column),
5082
5321
  $table: this,
5083
- $grid: this.$xegrid
5322
+ $grid: $xeGrid
5084
5323
  };
5085
5324
  if (!beforeEditMethod || beforeEditMethod(params)) {
5086
5325
  if (editMethod) {
@@ -5201,7 +5440,7 @@ const Methods = {
5201
5440
  return;
5202
5441
  }
5203
5442
  if (tooltipStore.column !== column || !tooltipStore.visible) {
5204
- handleTooltip($xeTable, evnt, thEl, cellEl, null, params);
5443
+ handleTooltip($xeTable, evnt, thEl, thEl.querySelector('.vxe-cell--title') || cellEl, params);
5205
5444
  }
5206
5445
  },
5207
5446
  /**
@@ -5231,7 +5470,7 @@ const Methods = {
5231
5470
  }
5232
5471
  }
5233
5472
  if (tooltipStore.column !== column || tooltipStore.row !== row || !tooltipStore.visible) {
5234
- handleTooltip($xeTable, evnt, tdEl, tdEl.querySelector('.vxe-cell--wrapper'), null, params);
5473
+ handleTooltip($xeTable, evnt, tdEl, tdEl.querySelector('.vxe-cell--label') || tdEl.querySelector('.vxe-cell--wrapper'), params);
5235
5474
  }
5236
5475
  },
5237
5476
  /**
@@ -5242,10 +5481,10 @@ const Methods = {
5242
5481
  const reactData = $xeTable;
5243
5482
  const { column } = params;
5244
5483
  const { tooltipStore } = reactData;
5245
- const cell = evnt.currentTarget;
5484
+ const tdEl = evnt.currentTarget;
5246
5485
  handleTargetEnterEvent($xeTable, tooltipStore.column !== column || !!tooltipStore.row);
5247
5486
  if (tooltipStore.column !== column || !tooltipStore.visible) {
5248
- handleTooltip($xeTable, evnt, cell, cell.querySelector('.vxe-cell--wrapper') || cell.children[0], null, params);
5487
+ handleTooltip($xeTable, evnt, tdEl, tdEl.querySelector('.vxe-cell--label') || tdEl.querySelector('.vxe-cell--wrapper'), params);
5249
5488
  }
5250
5489
  },
5251
5490
  openTooltip(target, content) {
@@ -5302,11 +5541,15 @@ const Methods = {
5302
5541
  * 获取复选框半选状态的行数据
5303
5542
  */
5304
5543
  getCheckboxIndeterminateRecords(isFull) {
5305
- const { treeConfig, treeIndeterminateMaps, fullDataRowIdData } = this;
5544
+ const $xeTable = this;
5545
+ const props = $xeTable;
5546
+ const internalData = $xeTable;
5547
+ const { treeConfig } = props;
5548
+ const { fullDataRowIdData, treeIndeterminateRowMaps } = internalData;
5306
5549
  if (treeConfig) {
5307
5550
  const fullRest = [];
5308
5551
  const defRest = [];
5309
- XEUtils.each(treeIndeterminateMaps, (item, rowid) => {
5552
+ XEUtils.each(treeIndeterminateRowMaps, (item, rowid) => {
5310
5553
  if (item) {
5311
5554
  fullRest.push(item);
5312
5555
  if (fullDataRowIdData[rowid]) {
@@ -5376,20 +5619,22 @@ const Methods = {
5376
5619
  isCheckedByCheckboxRow(row) {
5377
5620
  const $xeTable = this;
5378
5621
  const reactData = $xeTable;
5379
- const { selectCheckboxMaps } = reactData;
5622
+ const internalData = $xeTable;
5623
+ const { updateCheckboxFlag } = reactData;
5624
+ const { selectCheckboxMaps } = internalData;
5380
5625
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5381
5626
  const { checkField } = checkboxOpts;
5382
5627
  if (checkField) {
5383
5628
  return XEUtils.get(row, checkField);
5384
5629
  }
5385
- return !!selectCheckboxMaps[getRowid($xeTable, row)];
5630
+ return !!updateCheckboxFlag && !!selectCheckboxMaps[getRowid($xeTable, row)];
5386
5631
  },
5387
5632
  isCheckedByCheckboxRowKey(rowid) {
5388
5633
  const $xeTable = this;
5389
5634
  const reactData = $xeTable;
5390
5635
  const internalData = $xeTable;
5391
- const { selectCheckboxMaps } = reactData;
5392
- const { fullAllDataRowIdData } = internalData;
5636
+ const { updateCheckboxFlag } = reactData;
5637
+ const { fullAllDataRowIdData, selectCheckboxMaps } = internalData;
5393
5638
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5394
5639
  const { checkField } = checkboxOpts;
5395
5640
  if (checkField) {
@@ -5399,19 +5644,19 @@ const Methods = {
5399
5644
  }
5400
5645
  return false;
5401
5646
  }
5402
- return !!selectCheckboxMaps[rowid];
5647
+ return !!updateCheckboxFlag && !!selectCheckboxMaps[rowid];
5403
5648
  },
5404
5649
  isIndeterminateByCheckboxRow(row) {
5405
5650
  const $xeTable = this;
5406
- const reactData = $xeTable;
5407
- const { treeIndeterminateMaps } = reactData;
5408
- return !!treeIndeterminateMaps[getRowid($xeTable, row)] && !$xeTable.isCheckedByCheckboxRow(row);
5651
+ const internalData = $xeTable;
5652
+ const { treeIndeterminateRowMaps } = internalData;
5653
+ return !!treeIndeterminateRowMaps[getRowid($xeTable, row)] && !$xeTable.isCheckedByCheckboxRow(row);
5409
5654
  },
5410
5655
  isIndeterminateByCheckboxRowKey(rowid) {
5411
5656
  const $xeTable = this;
5412
- const reactData = $xeTable;
5413
- const { treeIndeterminateMaps } = reactData;
5414
- return !!treeIndeterminateMaps[rowid] && !$xeTable.isCheckedByCheckboxRowKey(rowid);
5657
+ const internalData = $xeTable;
5658
+ const { treeIndeterminateRowMaps } = internalData;
5659
+ return !!treeIndeterminateRowMaps[rowid] && !$xeTable.isCheckedByCheckboxRowKey(rowid);
5415
5660
  },
5416
5661
  /**
5417
5662
  * 切换选中
@@ -5421,14 +5666,16 @@ const Methods = {
5421
5666
  const $xeTable = this;
5422
5667
  const props = $xeTable;
5423
5668
  const reactData = $xeTable;
5669
+ const internalData = $xeTable;
5424
5670
  const { treeConfig } = props;
5425
- const { selectCheckboxMaps } = reactData;
5426
- const selectRowMaps = Object.assign({}, selectCheckboxMaps);
5671
+ const { selectCheckboxMaps } = internalData;
5427
5672
  const treeOpts = $xeTable.computeTreeOpts;
5428
5673
  const { transform, mapChildrenField } = treeOpts;
5429
5674
  const childrenField = treeOpts.children || treeOpts.childrenField;
5430
5675
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5431
5676
  const { checkField, checkStrictly, checkMethod } = checkboxOpts;
5677
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5678
+ // indeterminateField 仅支持读取
5432
5679
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
5433
5680
  if (checkField) {
5434
5681
  // 树结构
@@ -5443,59 +5690,57 @@ const Methods = {
5443
5690
  handleCheckboxReserveRow($xeTable, row, checked);
5444
5691
  }
5445
5692
  }, { children: transform ? mapChildrenField : childrenField });
5446
- reactData.selectCheckboxMaps = selectRowMaps;
5693
+ reactData.updateCheckboxFlag++;
5447
5694
  return;
5448
5695
  }
5449
- else {
5450
- // 列表
5451
- rows.forEach(row => {
5452
- if (isForce || (!checkMethod || checkMethod({ row }))) {
5453
- XEUtils.set(row, checkField, checked);
5454
- handleCheckboxReserveRow($xeTable, row, checked);
5455
- }
5456
- });
5457
- }
5458
- reactData.selectCheckboxMaps = selectRowMaps;
5696
+ // 列表
5697
+ rows.forEach(row => {
5698
+ if (isForce || (!checkMethod || checkMethod({ row }))) {
5699
+ XEUtils.set(row, checkField, checked);
5700
+ handleCheckboxReserveRow($xeTable, row, checked);
5701
+ }
5702
+ });
5703
+ reactData.updateCheckboxFlag++;
5459
5704
  return;
5460
5705
  }
5461
5706
  // 树结构
5462
5707
  if (treeConfig && !checkStrictly) {
5463
5708
  // 更新子节点状态
5464
5709
  XEUtils.eachTree(rows, (row) => {
5465
- const rowid = getRowid($xeTable, row);
5710
+ const rowid = handleGetRowId(row);
5466
5711
  if (isForce || (!checkMethod || checkMethod({ row }))) {
5467
5712
  if (checked) {
5468
- selectRowMaps[rowid] = row;
5713
+ selectCheckboxMaps[rowid] = row;
5469
5714
  }
5470
5715
  else {
5471
- if (selectRowMaps[rowid]) {
5472
- delete selectRowMaps[rowid];
5716
+ if (selectCheckboxMaps[rowid]) {
5717
+ delete selectCheckboxMaps[rowid];
5473
5718
  }
5474
5719
  }
5475
5720
  handleCheckboxReserveRow($xeTable, row, checked);
5476
5721
  }
5477
5722
  }, { children: transform ? mapChildrenField : childrenField });
5478
- reactData.selectCheckboxMaps = selectRowMaps;
5723
+ reactData.updateCheckboxFlag++;
5479
5724
  return;
5480
5725
  }
5481
5726
  // 列表
5482
5727
  rows.forEach(row => {
5483
- const rowid = getRowid($xeTable, row);
5728
+ const rowid = handleGetRowId(row);
5484
5729
  if (isForce || (!checkMethod || checkMethod({ row }))) {
5485
5730
  if (checked) {
5486
- if (!selectRowMaps[rowid]) {
5487
- selectRowMaps[rowid] = row;
5731
+ if (!selectCheckboxMaps[rowid]) {
5732
+ selectCheckboxMaps[rowid] = row;
5488
5733
  }
5489
5734
  }
5490
5735
  else {
5491
- if (selectRowMaps[rowid]) {
5492
- delete selectRowMaps[rowid];
5736
+ if (selectCheckboxMaps[rowid]) {
5737
+ delete selectCheckboxMaps[rowid];
5493
5738
  }
5494
5739
  }
5495
5740
  handleCheckboxReserveRow($xeTable, row, checked);
5741
+ reactData.updateCheckboxFlag++;
5496
5742
  }
5497
5743
  });
5498
- reactData.selectCheckboxMaps = selectRowMaps;
5499
5744
  },
5500
5745
  /**
5501
5746
  * 即将移除
@@ -5506,7 +5751,10 @@ const Methods = {
5506
5751
  $xeTable.handleBatchSelectRows([row], checked, isForce);
5507
5752
  },
5508
5753
  handleToggleCheckRowEvent(evnt, params) {
5509
- const { selectCheckboxMaps, checkboxOpts } = this;
5754
+ const $xeTable = this;
5755
+ const internalData = $xeTable;
5756
+ const { selectCheckboxMaps } = internalData;
5757
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
5510
5758
  const { checkField, trigger } = checkboxOpts;
5511
5759
  const { row } = params;
5512
5760
  if (trigger === 'manual') {
@@ -5517,47 +5765,52 @@ const Methods = {
5517
5765
  checked = !XEUtils.get(row, checkField);
5518
5766
  }
5519
5767
  else {
5520
- checked = !selectCheckboxMaps[getRowid(this, row)];
5768
+ checked = !selectCheckboxMaps[getRowid($xeTable, row)];
5521
5769
  }
5522
5770
  if (evnt) {
5523
- this.triggerCheckRowEvent(evnt, params, checked);
5771
+ $xeTable.triggerCheckRowEvent(evnt, params, checked);
5524
5772
  }
5525
5773
  else {
5526
- this.handleSelectRow(params, checked);
5527
- this.checkSelectionStatus();
5774
+ $xeTable.handleBatchSelectRows([row], checked);
5775
+ $xeTable.checkSelectionStatus();
5528
5776
  }
5529
5777
  },
5530
5778
  triggerCheckRowEvent(evnt, params, checked) {
5531
5779
  const $xeTable = this;
5532
- const { checkboxOpts, afterFullData } = this;
5533
- const { checkMethod, trigger } = checkboxOpts;
5780
+ const props = $xeTable;
5781
+ const internalData = $xeTable;
5534
5782
  const { row } = params;
5783
+ const { afterFullData } = internalData;
5784
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
5785
+ const { checkMethod, trigger } = checkboxOpts;
5535
5786
  if (trigger === 'manual') {
5536
5787
  return;
5537
5788
  }
5538
5789
  evnt.stopPropagation();
5539
- if (checkboxOpts.isShiftKey && evnt.shiftKey && !this.treeConfig) {
5540
- const checkboxRecords = this.getCheckboxRecords();
5790
+ if (checkboxOpts.isShiftKey && evnt.shiftKey && !props.treeConfig) {
5791
+ const checkboxRecords = $xeTable.getCheckboxRecords();
5541
5792
  if (checkboxRecords.length) {
5542
5793
  const firstRow = checkboxRecords[0];
5543
- const _rowIndex = this.getVTRowIndex(row);
5544
- const _firstRowIndex = this.getVTRowIndex(firstRow);
5794
+ const _rowIndex = $xeTable.getVTRowIndex(row);
5795
+ const _firstRowIndex = $xeTable.getVTRowIndex(firstRow);
5545
5796
  if (_rowIndex !== _firstRowIndex) {
5546
- this.setAllCheckboxRow(false);
5797
+ $xeTable.setAllCheckboxRow(false);
5547
5798
  const rangeRows = _rowIndex < _firstRowIndex ? afterFullData.slice(_rowIndex, _firstRowIndex + 1) : afterFullData.slice(_firstRowIndex, _rowIndex + 1);
5548
- handleCheckedCheckboxRow($xeTable, rangeRows, true, false);
5549
- this.emitEvent('checkbox-range-select', Object.assign({ rangeRecords: rangeRows }, params), evnt);
5799
+ $xeTable.$nextTick(() => {
5800
+ handleCheckedCheckboxRow($xeTable, rangeRows, true, false);
5801
+ });
5802
+ $xeTable.dispatchEvent('checkbox-range-select', Object.assign({ rangeRecords: rangeRows }, params), evnt);
5550
5803
  return;
5551
5804
  }
5552
5805
  }
5553
5806
  }
5554
5807
  if (!checkMethod || checkMethod({ row })) {
5555
- this.handleSelectRow(params, checked);
5556
- this.checkSelectionStatus();
5557
- this.emitEvent('checkbox-change', Object.assign({
5558
- records: this.getCheckboxRecords(),
5559
- reserves: this.getCheckboxReserveRecords(),
5560
- indeterminates: this.getCheckboxIndeterminateRecords(),
5808
+ $xeTable.handleBatchSelectRows([row], checked);
5809
+ $xeTable.checkSelectionStatus();
5810
+ $xeTable.dispatchEvent('checkbox-change', Object.assign({
5811
+ records: () => $xeTable.getCheckboxRecords(),
5812
+ reserves: () => $xeTable.getCheckboxReserveRecords(),
5813
+ indeterminates: () => $xeTable.getCheckboxIndeterminateRecords(),
5561
5814
  checked
5562
5815
  }, params), evnt);
5563
5816
  }
@@ -5567,7 +5820,9 @@ const Methods = {
5567
5820
  */
5568
5821
  toggleCheckboxRow(row) {
5569
5822
  const $xeTable = this;
5570
- const { selectCheckboxMaps, checkboxOpts } = this;
5823
+ const internalData = $xeTable;
5824
+ const { selectCheckboxMaps } = internalData;
5825
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
5571
5826
  const { checkField } = checkboxOpts;
5572
5827
  const checked = checkField ? !XEUtils.get(row, checkField) : !selectCheckboxMaps[getRowid($xeTable, row)];
5573
5828
  $xeTable.handleBatchSelectRows([row], checked, true);
@@ -5588,9 +5843,7 @@ const Methods = {
5588
5843
  const reactData = $xeTable;
5589
5844
  const internalData = $xeTable;
5590
5845
  const { treeConfig } = props;
5591
- const { selectCheckboxMaps, treeIndeterminateMaps } = reactData;
5592
- const selectRowMaps = Object.assign({}, selectCheckboxMaps);
5593
- const halfRowMaps = Object.assign({}, treeIndeterminateMaps);
5846
+ const { selectCheckboxMaps, treeIndeterminateRowMaps } = internalData;
5594
5847
  const treeOpts = $xeTable.computeTreeOpts;
5595
5848
  const { transform, mapChildrenField } = treeOpts;
5596
5849
  const childrenField = treeOpts.children || treeOpts.childrenField;
@@ -5602,10 +5855,11 @@ const Methods = {
5602
5855
  }
5603
5856
  // 树结构
5604
5857
  if (treeConfig) {
5858
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5605
5859
  const childRowMaps = {};
5606
5860
  const childRowList = [];
5607
5861
  XEUtils.eachTree(afterTreeFullData, (row) => {
5608
- const rowid = getRowid($xeTable, row);
5862
+ const rowid = handleGetRowId(row);
5609
5863
  const childList = row[transform ? mapChildrenField : childrenField];
5610
5864
  if (childList && childList.length && !childRowMaps[rowid]) {
5611
5865
  childRowMaps[rowid] = 1;
@@ -5621,13 +5875,13 @@ const Methods = {
5621
5875
  let vLen = 0; // 有效行
5622
5876
  childList.forEach(checkMethod
5623
5877
  ? (item) => {
5624
- const childRowid = getRowid($xeTable, item);
5625
- const isSelect = checkField ? XEUtils.get(item, checkField) : selectRowMaps[childRowid];
5878
+ const childRowid = handleGetRowId(item);
5879
+ const isSelect = checkField ? XEUtils.get(item, checkField) : selectCheckboxMaps[childRowid];
5626
5880
  if (checkMethod({ row: item })) {
5627
5881
  if (isSelect) {
5628
5882
  sLen++;
5629
5883
  }
5630
- else if (halfRowMaps[childRowid]) {
5884
+ else if (treeIndeterminateRowMaps[childRowid]) {
5631
5885
  hLen++;
5632
5886
  }
5633
5887
  vLen++;
@@ -5636,18 +5890,18 @@ const Methods = {
5636
5890
  if (isSelect) {
5637
5891
  sLen++;
5638
5892
  }
5639
- else if (halfRowMaps[childRowid]) {
5893
+ else if (treeIndeterminateRowMaps[childRowid]) {
5640
5894
  hLen++;
5641
5895
  }
5642
5896
  }
5643
5897
  }
5644
5898
  : item => {
5645
- const childRowid = getRowid($xeTable, item);
5646
- const isSelect = checkField ? XEUtils.get(item, checkField) : selectRowMaps[childRowid];
5899
+ const childRowid = handleGetRowId(item);
5900
+ const isSelect = checkField ? XEUtils.get(item, checkField) : selectCheckboxMaps[childRowid];
5647
5901
  if (isSelect) {
5648
5902
  sLen++;
5649
5903
  }
5650
- else if (halfRowMaps[childRowid]) {
5904
+ else if (treeIndeterminateRowMaps[childRowid]) {
5651
5905
  hLen++;
5652
5906
  }
5653
5907
  vLen++;
@@ -5659,31 +5913,30 @@ const Methods = {
5659
5913
  }
5660
5914
  if (isSelected) {
5661
5915
  if (!checkField) {
5662
- selectRowMaps[rowid] = row;
5916
+ selectCheckboxMaps[rowid] = row;
5663
5917
  }
5664
- if (halfRowMaps[rowid]) {
5665
- delete halfRowMaps[rowid];
5918
+ if (treeIndeterminateRowMaps[rowid]) {
5919
+ delete treeIndeterminateRowMaps[rowid];
5666
5920
  }
5667
5921
  }
5668
5922
  else {
5669
5923
  if (!checkField) {
5670
- if (selectRowMaps[rowid]) {
5671
- delete selectRowMaps[rowid];
5924
+ if (selectCheckboxMaps[rowid]) {
5925
+ delete selectCheckboxMaps[rowid];
5672
5926
  }
5673
5927
  }
5674
5928
  if (halfSelect) {
5675
- halfRowMaps[rowid] = row;
5929
+ treeIndeterminateRowMaps[rowid] = row;
5676
5930
  }
5677
5931
  else {
5678
- if (halfRowMaps[rowid]) {
5679
- delete halfRowMaps[rowid];
5932
+ if (treeIndeterminateRowMaps[rowid]) {
5933
+ delete treeIndeterminateRowMaps[rowid];
5680
5934
  }
5681
5935
  }
5682
5936
  }
5683
5937
  });
5684
5938
  }
5685
- reactData.selectCheckboxMaps = selectRowMaps;
5686
- reactData.treeIndeterminateMaps = halfRowMaps;
5939
+ reactData.updateCheckboxFlag++;
5687
5940
  },
5688
5941
  updateAllCheckboxStatus() {
5689
5942
  const $xeTable = this;
@@ -5691,23 +5944,23 @@ const Methods = {
5691
5944
  const reactData = $xeTable;
5692
5945
  const internalData = $xeTable;
5693
5946
  const { treeConfig } = props;
5694
- const { selectCheckboxMaps, treeIndeterminateMaps } = reactData;
5947
+ const { afterFullData, afterTreeFullData, checkboxReserveRowMap, selectCheckboxMaps, treeIndeterminateRowMaps } = internalData;
5695
5948
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5696
5949
  const { checkField, checkMethod, showReserveStatus } = checkboxOpts;
5697
- const { afterFullData, afterTreeFullData, checkboxReserveRowMap } = internalData;
5950
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5698
5951
  let sLen = 0; // 已选
5699
5952
  let hLen = 0; // 半选
5700
5953
  let vLen = 0; // 有效行
5701
5954
  const rootList = (treeConfig ? afterTreeFullData : afterFullData);
5702
5955
  rootList.forEach(checkMethod
5703
5956
  ? row => {
5704
- const childRowid = getRowid($xeTable, row);
5957
+ const childRowid = handleGetRowId(row);
5705
5958
  const selected = checkField ? XEUtils.get(row, checkField) : selectCheckboxMaps[childRowid];
5706
5959
  if (checkMethod({ row })) {
5707
5960
  if (selected) {
5708
5961
  sLen++;
5709
5962
  }
5710
- else if (treeIndeterminateMaps[childRowid]) {
5963
+ else if (treeIndeterminateRowMaps[childRowid]) {
5711
5964
  hLen++;
5712
5965
  }
5713
5966
  vLen++;
@@ -5716,18 +5969,18 @@ const Methods = {
5716
5969
  if (selected) {
5717
5970
  sLen++;
5718
5971
  }
5719
- else if (treeIndeterminateMaps[childRowid]) {
5972
+ else if (treeIndeterminateRowMaps[childRowid]) {
5720
5973
  hLen++;
5721
5974
  }
5722
5975
  }
5723
5976
  }
5724
5977
  : row => {
5725
- const childRowid = getRowid($xeTable, row);
5978
+ const childRowid = handleGetRowId(row);
5726
5979
  const selected = checkField ? XEUtils.get(row, checkField) : selectCheckboxMaps[childRowid];
5727
5980
  if (selected) {
5728
5981
  sLen++;
5729
5982
  }
5730
- else if (treeIndeterminateMaps[childRowid]) {
5983
+ else if (treeIndeterminateRowMaps[childRowid]) {
5731
5984
  hLen++;
5732
5985
  }
5733
5986
  vLen++;
@@ -5784,19 +6037,26 @@ const Methods = {
5784
6037
  * 获取复选框保留选中的行
5785
6038
  */
5786
6039
  getCheckboxReserveRecords(isFull) {
5787
- const { fullDataRowIdData, afterFullData, checkboxReserveRowMap, checkboxOpts, treeConfig, treeOpts } = this;
6040
+ const $xeTable = this;
6041
+ const props = $xeTable;
6042
+ const internalData = $xeTable;
6043
+ const { treeConfig } = props;
6044
+ const { afterFullData, fullDataRowIdData, checkboxReserveRowMap } = internalData;
6045
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
6046
+ const treeOpts = $xeTable.computeTreeOpts;
5788
6047
  const childrenField = treeOpts.children || treeOpts.childrenField;
5789
6048
  const reserveSelection = [];
5790
6049
  if (checkboxOpts.reserve) {
6050
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5791
6051
  const afterFullIdMaps = {};
5792
6052
  if (treeConfig) {
5793
6053
  XEUtils.eachTree(afterFullData, row => {
5794
- afterFullIdMaps[getRowid(this, row)] = 1;
6054
+ afterFullIdMaps[handleGetRowId(row)] = 1;
5795
6055
  }, { children: childrenField });
5796
6056
  }
5797
6057
  else {
5798
6058
  afterFullData.forEach((row) => {
5799
- afterFullIdMaps[getRowid(this, row)] = 1;
6059
+ afterFullIdMaps[handleGetRowId(row)] = 1;
5800
6060
  });
5801
6061
  }
5802
6062
  XEUtils.each(checkboxReserveRowMap, (oldRow, oldRowid) => {
@@ -5837,9 +6097,9 @@ const Methods = {
5837
6097
  handleCheckedAllCheckboxRow($xeTable, value);
5838
6098
  if (evnt) {
5839
6099
  $xeTable.dispatchEvent('checkbox-all', {
5840
- records: $xeTable.getCheckboxRecords(),
5841
- reserves: $xeTable.getCheckboxReserveRecords(),
5842
- indeterminates: $xeTable.getCheckboxIndeterminateRecords(),
6100
+ records: () => $xeTable.getCheckboxRecords(),
6101
+ reserves: () => $xeTable.getCheckboxReserveRecords(),
6102
+ indeterminates: () => $xeTable.getCheckboxIndeterminateRecords(),
5843
6103
  checked: value
5844
6104
  }, evnt);
5845
6105
  }
@@ -5871,9 +6131,17 @@ const Methods = {
5871
6131
  * 清空行为不管是否被禁用还是保留记录,都将彻底清空选中状态
5872
6132
  */
5873
6133
  clearCheckboxRow() {
5874
- const { tableFullData, treeConfig, treeOpts, checkboxOpts } = this;
5875
- const { checkField, reserve } = checkboxOpts;
6134
+ const $xeTable = this;
6135
+ const props = $xeTable;
6136
+ const reactData = $xeTable;
6137
+ const internalData = $xeTable;
6138
+ const { treeConfig } = props;
6139
+ const { tableFullData } = internalData;
6140
+ const treeOpts = $xeTable.computeTreeOpts;
5876
6141
  const childrenField = treeOpts.children || treeOpts.childrenField;
6142
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
6143
+ const { checkField, reserve } = checkboxOpts;
6144
+ // indeterminateField 仅支持读取
5877
6145
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
5878
6146
  if (checkField) {
5879
6147
  const handleClearChecked = (item) => {
@@ -5892,10 +6160,11 @@ const Methods = {
5892
6160
  if (reserve) {
5893
6161
  tableFullData.forEach((row) => this.handleCheckboxReserveRow(row, false));
5894
6162
  }
5895
- this.isAllSelected = false;
5896
- this.isIndeterminate = false;
5897
- this.selectCheckboxMaps = {};
5898
- this.treeIndeterminateMaps = {};
6163
+ reactData.isAllSelected = false;
6164
+ reactData.isIndeterminate = false;
6165
+ internalData.selectCheckboxMaps = {};
6166
+ internalData.treeIndeterminateRowMaps = {};
6167
+ reactData.updateCheckboxFlag++;
5899
6168
  return this.$nextTick();
5900
6169
  },
5901
6170
  /**
@@ -6092,10 +6361,12 @@ const Methods = {
6092
6361
  },
6093
6362
  triggerHeaderCellClickEvent(evnt, params) {
6094
6363
  const $xeTable = this;
6364
+ const props = $xeTable;
6095
6365
  const internalData = $xeTable;
6096
6366
  const { _lastResizeTime } = internalData;
6097
6367
  const sortOpts = $xeTable.computeSortOpts;
6098
6368
  const columnOpts = $xeTable.computeColumnOpts;
6369
+ const currentColumnOpts = $xeTable.computeCurrentColumnOpts;
6099
6370
  const { column } = params;
6100
6371
  const cell = evnt.currentTarget;
6101
6372
  const triggerResizable = _lastResizeTime && _lastResizeTime > Date.now() - 300;
@@ -6105,7 +6376,7 @@ const Methods = {
6105
6376
  $xeTable.triggerSortEvent(evnt, column, getNextSortOrder($xeTable, column));
6106
6377
  }
6107
6378
  $xeTable.dispatchEvent('header-cell-click', Object.assign({ triggerResizable, triggerSort, triggerFilter, cell }, params), evnt);
6108
- if (columnOpts.isCurrent || $xeTable.highlightCurrentColumn) {
6379
+ if ((columnOpts.isCurrent || props.highlightCurrentColumn) && (!currentColumnOpts.trigger || ['header', 'default'].includes(currentColumnOpts.trigger))) {
6109
6380
  $xeTable.triggerCurrentColumnEvent(evnt, params);
6110
6381
  }
6111
6382
  return $xeTable.$nextTick();
@@ -6121,13 +6392,23 @@ const Methods = {
6121
6392
  * @param {ColumnInfo} fieldOrColumn 列配置
6122
6393
  */
6123
6394
  setCurrentColumn(fieldOrColumn) {
6124
- const column = handleFieldOrColumn(this, fieldOrColumn);
6395
+ const $xeTable = this;
6396
+ const props = $xeTable;
6397
+ const reactData = $xeTable;
6398
+ const { mouseConfig } = props;
6399
+ const mouseOpts = $xeTable.computeMouseOpts;
6400
+ const isMouseSelected = mouseConfig && mouseOpts.selected;
6401
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn);
6125
6402
  if (column) {
6126
- // this.clearCurrentRow()
6127
- this.clearCurrentColumn();
6128
- this.currentColumn = column;
6403
+ $xeTable.clearCurrentColumn();
6404
+ reactData.currentColumn = column;
6129
6405
  }
6130
- return this.$nextTick();
6406
+ return $xeTable.$nextTick().then(() => {
6407
+ // 更新状选中态
6408
+ if (isMouseSelected) {
6409
+ $xeTable.addCellSelectedClass();
6410
+ }
6411
+ });
6131
6412
  },
6132
6413
  /**
6133
6414
  * 用于当前列,手动清空当前高亮的状态
@@ -6136,25 +6417,6 @@ const Methods = {
6136
6417
  this.currentColumn = null;
6137
6418
  return this.$nextTick();
6138
6419
  },
6139
- checkValidate(type) {
6140
- if (this.triggerValidate) {
6141
- return this.triggerValidate(type);
6142
- }
6143
- return this.$nextTick();
6144
- },
6145
- /**
6146
- * 当单元格发生改变时
6147
- * 如果存在规则,则校验
6148
- */
6149
- handleChangeCell(evnt, params) {
6150
- this.checkValidate('blur')
6151
- .catch((e) => e)
6152
- .then(() => {
6153
- this.handleEdit(params, evnt)
6154
- .then(() => this.checkValidate('change'))
6155
- .catch((e) => e);
6156
- });
6157
- },
6158
6420
  /**
6159
6421
  * 列点击事件
6160
6422
  * 如果是单击模式,则激活为编辑状态
@@ -6164,7 +6426,7 @@ const Methods = {
6164
6426
  const $xeTable = this;
6165
6427
  const props = $xeTable;
6166
6428
  const reactData = $xeTable;
6167
- const { highlightCurrentRow, editConfig } = props;
6429
+ const { highlightCurrentRow, highlightCurrentColumn, editConfig } = props;
6168
6430
  const { editStore, isDragResize } = reactData;
6169
6431
  if (isDragResize) {
6170
6432
  return;
@@ -6176,6 +6438,8 @@ const Methods = {
6176
6438
  const checkboxOpts = $xeTable.computeCheckboxOpts;
6177
6439
  const keyboardOpts = $xeTable.computeKeyboardOpts;
6178
6440
  const rowOpts = $xeTable.computeRowOpts;
6441
+ const columnOpts = $xeTable.computeColumnOpts;
6442
+ const currentColumnOpts = $xeTable.computeCurrentColumnOpts;
6179
6443
  const { actived, focused } = editStore;
6180
6444
  const { row, column } = params;
6181
6445
  const { type, treeNode } = column;
@@ -6191,11 +6455,11 @@ const Methods = {
6191
6455
  if (!triggerCheckbox && !triggerRadio) {
6192
6456
  // 如果是展开行
6193
6457
  if (!triggerExpandNode && (expandOpts.trigger === 'row' || (isExpandType && expandOpts.trigger === 'cell'))) {
6194
- this.triggerRowExpandEvent(evnt, params);
6458
+ $xeTable.triggerRowExpandEvent(evnt, params);
6195
6459
  }
6196
6460
  // 如果是树形表格
6197
6461
  if ((treeOpts.trigger === 'row' || (treeNode && treeOpts.trigger === 'cell'))) {
6198
- this.triggerTreeExpandEvent(evnt, params);
6462
+ $xeTable.triggerTreeExpandEvent(evnt, params);
6199
6463
  }
6200
6464
  }
6201
6465
  // 如果点击了树节点
@@ -6204,16 +6468,22 @@ const Methods = {
6204
6468
  // 如果是高亮行
6205
6469
  if (rowOpts.isCurrent || highlightCurrentRow) {
6206
6470
  if (!triggerCheckbox && !triggerRadio) {
6207
- this.triggerCurrentRowEvent(evnt, params);
6471
+ $xeTable.triggerCurrentRowEvent(evnt, params);
6472
+ }
6473
+ }
6474
+ // 如果是当前列
6475
+ if ((columnOpts.isCurrent || highlightCurrentColumn) && (!currentColumnOpts.trigger || ['cell', 'default'].includes(currentColumnOpts.trigger))) {
6476
+ if (!triggerCheckbox && !triggerRadio) {
6477
+ $xeTable.triggerCurrentColumnEvent(evnt, params);
6208
6478
  }
6209
6479
  }
6210
6480
  // 如果是单选框
6211
6481
  if (!triggerRadio && (radioOpts.trigger === 'row' || (isRadioType && radioOpts.trigger === 'cell'))) {
6212
- this.triggerRadioRowEvent(evnt, params);
6482
+ $xeTable.triggerRadioRowEvent(evnt, params);
6213
6483
  }
6214
6484
  // 如果是复选框
6215
6485
  if (!triggerCheckbox && (checkboxOpts.trigger === 'row' || (isCheckboxType && checkboxOpts.trigger === 'cell'))) {
6216
- this.handleToggleCheckRowEvent(evnt, params);
6486
+ $xeTable.handleToggleCheckRowEvent(evnt, params);
6217
6487
  }
6218
6488
  }
6219
6489
  // 如果设置了单元格选中功能,则不会使用点击事件去处理(只能支持双击模式)
@@ -6225,16 +6495,16 @@ const Methods = {
6225
6495
  }
6226
6496
  if (editOpts.trigger === 'manual') {
6227
6497
  if (actived.args && actived.row === row && column !== actived.column) {
6228
- this.handleChangeCell(evnt, params);
6498
+ handleChangeCell($xeTable, evnt, params);
6229
6499
  }
6230
6500
  }
6231
6501
  else if (!actived.args || row !== actived.row || column !== actived.column) {
6232
6502
  if (editOpts.trigger === 'click') {
6233
- this.handleChangeCell(evnt, params);
6503
+ handleChangeCell($xeTable, evnt, params);
6234
6504
  }
6235
6505
  else if (editOpts.trigger === 'dblclick') {
6236
6506
  if (editOpts.mode === 'row' && actived.row === row) {
6237
- this.handleChangeCell(evnt, params);
6507
+ handleChangeCell($xeTable, evnt, params);
6238
6508
  }
6239
6509
  }
6240
6510
  }
@@ -6255,7 +6525,7 @@ const Methods = {
6255
6525
  }
6256
6526
  }
6257
6527
  }
6258
- this.emitEvent('cell-click', params, evnt);
6528
+ $xeTable.dispatchEvent('cell-click', params, evnt);
6259
6529
  },
6260
6530
  /**
6261
6531
  * 列双击点击事件
@@ -6277,17 +6547,17 @@ const Methods = {
6277
6547
  if (isEnableConf(editConfig) && editOpts.trigger === 'dblclick') {
6278
6548
  if (!actived.args || evnt.currentTarget !== actived.args.cell) {
6279
6549
  if (editOpts.mode === 'row') {
6280
- this.checkValidate('blur')
6550
+ checkValidate($xeTable, 'blur')
6281
6551
  .catch((e) => e)
6282
6552
  .then(() => {
6283
6553
  this.handleEdit(params, evnt)
6284
- .then(() => this.checkValidate('change'))
6554
+ .then(() => checkValidate($xeTable, 'change'))
6285
6555
  .catch((e) => e);
6286
6556
  });
6287
6557
  }
6288
6558
  else if (editOpts.mode === 'cell') {
6289
6559
  this.handleEdit(params, evnt)
6290
- .then(() => this.checkValidate('change'))
6560
+ .then(() => checkValidate($xeTable, 'change'))
6291
6561
  .catch((e) => e);
6292
6562
  }
6293
6563
  }
@@ -6473,14 +6743,16 @@ const Methods = {
6473
6743
  const internalData = $xeTable;
6474
6744
  const { treeConfig, dragConfig } = props;
6475
6745
  const rowDragOpts = $xeTable.computeRowDragOpts;
6476
- const { fullAllDataRowIdData } = internalData;
6746
+ const { afterFullData, tableFullData, fullAllDataRowIdData } = internalData;
6477
6747
  const { isPeerDrag, isCrossDrag, isSelfToChildDrag, dragEndMethod, dragToChildMethod } = rowDragOpts;
6478
6748
  const treeOpts = $xeTable.computeTreeOpts;
6479
6749
  const { transform, rowField, mapChildrenField, parentField } = treeOpts;
6480
6750
  const childrenField = treeOpts.children || treeOpts.childrenField;
6481
- const { afterFullData, tableFullData } = internalData;
6482
6751
  const dEndMethod = dragEndMethod || (dragConfig ? dragConfig.dragEndMethod : null);
6483
6752
  const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
6753
+ const errRest = {
6754
+ status: false
6755
+ };
6484
6756
  if (prevDragRow && dragRow) {
6485
6757
  // 判断是否有拖动
6486
6758
  if (prevDragRow !== dragRow) {
@@ -6495,7 +6767,7 @@ const Methods = {
6495
6767
  const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild;
6496
6768
  return Promise.resolve(dEndMethod ? dEndMethod(dragParams) : true).then((status) => {
6497
6769
  if (!status) {
6498
- return;
6770
+ return errRest;
6499
6771
  }
6500
6772
  let oafIndex = -1;
6501
6773
  let nafIndex = -1;
@@ -6520,12 +6792,12 @@ const Methods = {
6520
6792
  if (isPeerDrag && !isCrossDrag) {
6521
6793
  if (oldRest.row[parentField] !== newRest.row[parentField]) {
6522
6794
  // 非同级
6523
- return;
6795
+ return errRest;
6524
6796
  }
6525
6797
  }
6526
6798
  else {
6527
6799
  if (!isCrossDrag) {
6528
- return;
6800
+ return errRest;
6529
6801
  }
6530
6802
  if (oldAllMaps[newRowid]) {
6531
6803
  isSelfToChildStatus = true;
@@ -6536,7 +6808,7 @@ const Methods = {
6536
6808
  content: getI18n('vxe.error.treeDragChild')
6537
6809
  });
6538
6810
  }
6539
- return;
6811
+ return errRest;
6540
6812
  }
6541
6813
  }
6542
6814
  }
@@ -6544,13 +6816,13 @@ const Methods = {
6544
6816
  else if (oldLevel) {
6545
6817
  // 子到根
6546
6818
  if (!isCrossDrag) {
6547
- return;
6819
+ return errRest;
6548
6820
  }
6549
6821
  }
6550
6822
  else if (newLevel) {
6551
6823
  // 根到子
6552
6824
  if (!isCrossDrag) {
6553
- return;
6825
+ return errRest;
6554
6826
  }
6555
6827
  if (oldAllMaps[newRowid]) {
6556
6828
  isSelfToChildStatus = true;
@@ -6561,7 +6833,7 @@ const Methods = {
6561
6833
  content: getI18n('vxe.error.treeDragChild')
6562
6834
  });
6563
6835
  }
6564
- return;
6836
+ return errRest;
6565
6837
  }
6566
6838
  }
6567
6839
  }
@@ -6621,27 +6893,34 @@ const Methods = {
6621
6893
  if (reactData.scrollYLoad) {
6622
6894
  $xeTable.updateScrollYSpace();
6623
6895
  }
6624
- $xeTable.$nextTick().then(() => {
6896
+ if (evnt) {
6897
+ $xeTable.dispatchEvent('row-dragend', {
6898
+ oldRow: dragRow,
6899
+ newRow: prevDragRow,
6900
+ dragRow,
6901
+ dragPos: prevDragPos,
6902
+ dragToChild: isDragToChildFlag,
6903
+ offsetIndex: dragOffsetIndex,
6904
+ _index: {
6905
+ newIndex: nafIndex,
6906
+ oldIndex: oafIndex
6907
+ }
6908
+ }, evnt);
6909
+ }
6910
+ return $xeTable.$nextTick().then(() => {
6625
6911
  $xeTable.updateCellAreas();
6626
6912
  $xeTable.recalculate();
6913
+ }).then(() => {
6914
+ return {
6915
+ status: true
6916
+ };
6627
6917
  });
6628
- $xeTable.dispatchEvent('row-dragend', {
6629
- oldRow: dragRow,
6630
- newRow: prevDragRow,
6631
- dragRow,
6632
- dragPos: prevDragPos,
6633
- dragToChild: isDragToChildFlag,
6634
- offsetIndex: dragOffsetIndex,
6635
- _index: {
6636
- newIndex: nafIndex,
6637
- oldIndex: oafIndex
6638
- }
6639
- }, evnt);
6640
6918
  }).catch(() => {
6919
+ return errRest;
6641
6920
  });
6642
6921
  }
6643
6922
  }
6644
- return Promise.resolve();
6923
+ return Promise.resolve(errRest);
6645
6924
  },
6646
6925
  handleRowDragDragendEvent(evnt) {
6647
6926
  const $xeTable = this;
@@ -6786,6 +7065,9 @@ const Methods = {
6786
7065
  const { isPeerDrag, isCrossDrag, isSelfToChildDrag, isToChildDrag, dragEndMethod, dragToChildMethod } = columnDragOpts;
6787
7066
  const { collectColumn } = internalData;
6788
7067
  const dragOffsetIndex = prevDragPos === 'right' ? 1 : 0;
7068
+ const errRest = {
7069
+ status: false
7070
+ };
6789
7071
  if (prevDragCol && dragCol) {
6790
7072
  // 判断是否有拖动
6791
7073
  if (prevDragCol !== dragCol) {
@@ -6802,7 +7084,7 @@ const Methods = {
6802
7084
  const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild;
6803
7085
  return Promise.resolve(dragEndMethod ? dragEndMethod(dragParams) : true).then((status) => {
6804
7086
  if (!status) {
6805
- return;
7087
+ return errRest;
6806
7088
  }
6807
7089
  let oafIndex = -1;
6808
7090
  let nafIndex = -1;
@@ -6816,12 +7098,12 @@ const Methods = {
6816
7098
  if (isPeerDrag && !isCrossDrag) {
6817
7099
  if (dragColumn.parentId !== newColumn.parentId) {
6818
7100
  // 非同级
6819
- return;
7101
+ return errRest;
6820
7102
  }
6821
7103
  }
6822
7104
  else {
6823
7105
  if (!isCrossDrag) {
6824
- return;
7106
+ return errRest;
6825
7107
  }
6826
7108
  if (oldAllMaps[newColumn.id]) {
6827
7109
  isSelfToChildStatus = true;
@@ -6832,7 +7114,7 @@ const Methods = {
6832
7114
  content: getI18n('vxe.error.treeDragChild')
6833
7115
  });
6834
7116
  }
6835
- return;
7117
+ return errRest;
6836
7118
  }
6837
7119
  }
6838
7120
  }
@@ -6840,13 +7122,13 @@ const Methods = {
6840
7122
  else if (dragColumn.parentId) {
6841
7123
  // 子到根
6842
7124
  if (!isCrossDrag) {
6843
- return;
7125
+ return errRest;
6844
7126
  }
6845
7127
  }
6846
7128
  else if (newColumn.parentId) {
6847
7129
  // 根到子
6848
7130
  if (!isCrossDrag) {
6849
- return;
7131
+ return errRest;
6850
7132
  }
6851
7133
  if (oldAllMaps[newColumn.id]) {
6852
7134
  isSelfToChildStatus = true;
@@ -6857,7 +7139,7 @@ const Methods = {
6857
7139
  content: getI18n('vxe.error.treeDragChild')
6858
7140
  });
6859
7141
  }
6860
- return;
7142
+ return errRest;
6861
7143
  }
6862
7144
  }
6863
7145
  }
@@ -6918,26 +7200,32 @@ const Methods = {
6918
7200
  $xeTable.clearCopyCellArea();
6919
7201
  }
6920
7202
  }
6921
- $xeTable.dispatchEvent('column-dragend', {
6922
- oldColumn: dragColumn,
6923
- newColumn,
6924
- dragColumn,
6925
- dragPos: prevDragPos,
6926
- dragToChild: isDragToChildFlag,
6927
- offsetIndex: dragOffsetIndex,
6928
- _index: {
6929
- newIndex: nafIndex,
6930
- oldIndex: oafIndex
6931
- }
6932
- }, evnt);
7203
+ if (evnt) {
7204
+ $xeTable.dispatchEvent('column-dragend', {
7205
+ oldColumn: dragColumn,
7206
+ newColumn,
7207
+ dragColumn,
7208
+ dragPos: prevDragPos,
7209
+ dragToChild: isDragToChildFlag,
7210
+ offsetIndex: dragOffsetIndex,
7211
+ _index: {
7212
+ newIndex: nafIndex,
7213
+ oldIndex: oafIndex
7214
+ }
7215
+ }, evnt);
7216
+ }
6933
7217
  if (isSyncColumn) {
6934
7218
  $xeTable.handleColDragSwapColumn();
6935
7219
  }
7220
+ return {
7221
+ status: true
7222
+ };
6936
7223
  }).catch(() => {
7224
+ return errRest;
6937
7225
  });
6938
7226
  }
6939
7227
  }
6940
- return Promise.resolve();
7228
+ return Promise.resolve(errRest);
6941
7229
  },
6942
7230
  handleHeaderCellDragDragendEvent(evnt) {
6943
7231
  const $xeTable = this;
@@ -7063,48 +7351,52 @@ const Methods = {
7063
7351
  setPendingRow(rows, status) {
7064
7352
  const $xeTable = this;
7065
7353
  const reactData = $xeTable;
7066
- const pendingMaps = Object.assign({}, reactData.pendingRowMaps);
7354
+ const internalData = $xeTable;
7355
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
7356
+ const { pendingRowMaps } = internalData;
7067
7357
  if (rows && !XEUtils.isArray(rows)) {
7068
7358
  rows = [rows];
7069
7359
  }
7070
7360
  if (status) {
7071
7361
  rows.forEach((row) => {
7072
- const rowid = getRowid($xeTable, row);
7073
- if (rowid && !pendingMaps[rowid]) {
7074
- pendingMaps[rowid] = row;
7362
+ const rowid = handleGetRowId(row);
7363
+ if (rowid && !pendingRowMaps[rowid]) {
7364
+ pendingRowMaps[rowid] = row;
7075
7365
  }
7076
7366
  });
7077
7367
  }
7078
7368
  else {
7079
7369
  rows.forEach((row) => {
7080
- const rowid = getRowid($xeTable, row);
7081
- if (rowid && pendingMaps[rowid]) {
7082
- delete pendingMaps[rowid];
7370
+ const rowid = handleGetRowId(row);
7371
+ if (rowid && pendingRowMaps[rowid]) {
7372
+ delete pendingRowMaps[rowid];
7083
7373
  }
7084
7374
  });
7085
7375
  }
7086
- reactData.pendingRowMaps = pendingMaps;
7376
+ reactData.pendingRowFlag++;
7087
7377
  return $xeTable.$nextTick();
7088
7378
  },
7089
7379
  togglePendingRow(rows) {
7090
7380
  const $xeTable = this;
7091
7381
  const reactData = $xeTable;
7092
- const pendingMaps = Object.assign({}, reactData.pendingRowMaps);
7382
+ const internalData = $xeTable;
7383
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
7384
+ const { pendingRowMaps } = internalData;
7093
7385
  if (rows && !XEUtils.isArray(rows)) {
7094
7386
  rows = [rows];
7095
7387
  }
7096
7388
  rows.forEach((row) => {
7097
- const rowid = getRowid($xeTable, row);
7389
+ const rowid = handleGetRowId(row);
7098
7390
  if (rowid) {
7099
- if (pendingMaps[rowid]) {
7100
- delete pendingMaps[rowid];
7391
+ if (pendingRowMaps[rowid]) {
7392
+ delete pendingRowMaps[rowid];
7101
7393
  }
7102
7394
  else {
7103
- pendingMaps[rowid] = row;
7395
+ pendingRowMaps[rowid] = row;
7104
7396
  }
7105
7397
  }
7106
7398
  });
7107
- reactData.pendingRowMaps = pendingMaps;
7399
+ reactData.pendingRowFlag++;
7108
7400
  return $xeTable.$nextTick();
7109
7401
  },
7110
7402
  hasPendingByRow(row) {
@@ -7120,10 +7412,8 @@ const Methods = {
7120
7412
  },
7121
7413
  getPendingRecords() {
7122
7414
  const $xeTable = this;
7123
- const reactData = $xeTable;
7124
7415
  const internalData = $xeTable;
7125
- const { pendingRowMaps } = reactData;
7126
- const { fullAllDataRowIdData } = internalData;
7416
+ const { fullAllDataRowIdData, pendingRowMaps } = internalData;
7127
7417
  const insertRecords = [];
7128
7418
  XEUtils.each(pendingRowMaps, (row, rowid) => {
7129
7419
  if (fullAllDataRowIdData[rowid]) {
@@ -7133,8 +7423,12 @@ const Methods = {
7133
7423
  return insertRecords;
7134
7424
  },
7135
7425
  clearPendingRow() {
7136
- this.pendingRowMaps = {};
7137
- return this.$nextTick();
7426
+ const $xeTable = this;
7427
+ const reactData = $xeTable;
7428
+ const internalData = $xeTable;
7429
+ internalData.pendingRowMaps = {};
7430
+ reactData.pendingRowFlag++;
7431
+ return $xeTable.$nextTick();
7138
7432
  },
7139
7433
  sort(sortConfs, sortOrder) {
7140
7434
  const $xeTable = this;
@@ -7285,7 +7579,9 @@ const Methods = {
7285
7579
  * @param {Event} evnt 事件
7286
7580
  */
7287
7581
  closeFilter() {
7288
- const { filterStore } = this;
7582
+ const $xeTable = this;
7583
+ const reactData = $xeTable;
7584
+ const { filterStore } = reactData;
7289
7585
  const { column, visible } = filterStore;
7290
7586
  Object.assign(filterStore, {
7291
7587
  isAllSelected: false,
@@ -7294,9 +7590,15 @@ const Methods = {
7294
7590
  visible: false
7295
7591
  });
7296
7592
  if (visible) {
7297
- this.emitEvent('filter-visible', { column, field: column.field, property: column.field, filterList: this.getCheckedFilters(), visible: false }, null);
7593
+ $xeTable.dispatchEvent('filter-visible', {
7594
+ column,
7595
+ field: column.field,
7596
+ property: column.field,
7597
+ filterList: () => $xeTable.getCheckedFilters(),
7598
+ visible: false
7599
+ }, null);
7298
7600
  }
7299
- return this.$nextTick();
7601
+ return $xeTable.$nextTick();
7300
7602
  },
7301
7603
  /**
7302
7604
  * 判断指定列是否为筛选状态,如果为空则判断所有列
@@ -7327,17 +7629,16 @@ const Methods = {
7327
7629
  const $xeTable = this;
7328
7630
  const reactData = $xeTable;
7329
7631
  const internalData = $xeTable;
7330
- const rExpandLazyLoadedMaps = Object.assign({}, reactData.rowExpandLazyLoadedMaps);
7331
- const { fullAllDataRowIdData } = internalData;
7632
+ const { fullAllDataRowIdData, rowExpandLazyLoadedMaps } = internalData;
7332
7633
  const expandOpts = $xeTable.computeExpandOpts;
7333
7634
  const { lazy } = expandOpts;
7334
7635
  const rowid = getRowid($xeTable, row);
7335
7636
  const rowRest = fullAllDataRowIdData[rowid];
7336
7637
  if (lazy && rowRest) {
7337
7638
  rowRest.expandLoaded = false;
7338
- delete rExpandLazyLoadedMaps[rowid];
7639
+ delete rowExpandLazyLoadedMaps[rowid];
7339
7640
  }
7340
- reactData.rowExpandLazyLoadedMaps = rExpandLazyLoadedMaps;
7641
+ reactData.rowExpandedFlag++;
7341
7642
  return $xeTable.$nextTick();
7342
7643
  },
7343
7644
  /**
@@ -7345,14 +7646,17 @@ const Methods = {
7345
7646
  * @param {Row} row 行对象
7346
7647
  */
7347
7648
  reloadRowExpand(row) {
7348
- const { expandOpts, rowExpandLazyLoadedMaps } = this;
7649
+ const $xeTable = this;
7650
+ const internalData = $xeTable;
7651
+ const { rowExpandLazyLoadedMaps } = internalData;
7652
+ const expandOpts = $xeTable.computeExpandOpts;
7349
7653
  const { lazy } = expandOpts;
7350
7654
  const rowid = getRowid(this, row);
7351
7655
  if (lazy && !rowExpandLazyLoadedMaps[rowid]) {
7352
- this.clearRowExpandLoaded(row)
7353
- .then(() => this.handleAsyncRowExpand(row));
7656
+ $xeTable.clearRowExpandLoaded(row)
7657
+ .then(() => handleAsyncRowExpand($xeTable, row));
7354
7658
  }
7355
- return this.$nextTick();
7659
+ return $xeTable.$nextTick();
7356
7660
  },
7357
7661
  reloadExpandContent(row) {
7358
7662
  if (process.env.NODE_ENV === 'development') {
@@ -7365,20 +7669,33 @@ const Methods = {
7365
7669
  * 展开行事件
7366
7670
  */
7367
7671
  triggerRowExpandEvent(evnt, params) {
7368
- const { expandOpts, rowExpandLazyLoadedMaps, expandColumn: column } = this;
7672
+ const $xeTable = this;
7673
+ const reactData = $xeTable;
7674
+ const internalData = $xeTable;
7675
+ const { expandColumn: column } = reactData;
7676
+ const { rowExpandLazyLoadedMaps } = internalData;
7677
+ const expandOpts = $xeTable.computeExpandOpts;
7369
7678
  const { row } = params;
7370
7679
  const { lazy, trigger } = expandOpts;
7371
7680
  if (trigger === 'manual') {
7372
7681
  return;
7373
7682
  }
7374
7683
  evnt.stopPropagation();
7375
- const rowid = getRowid(this, row);
7684
+ const rowid = getRowid($xeTable, row);
7376
7685
  if (!lazy || !rowExpandLazyLoadedMaps[rowid]) {
7377
- const expanded = !this.isRowExpandByRow(row);
7378
- const columnIndex = this.getColumnIndex(column);
7379
- const $columnIndex = this.getVMColumnIndex(column);
7380
- this.setRowExpand(row, expanded);
7381
- this.emitEvent('toggle-row-expand', { expanded, column, columnIndex, $columnIndex, row, rowIndex: this.getRowIndex(row), $rowIndex: this.getVMRowIndex(row) }, evnt);
7686
+ const expanded = !$xeTable.isRowExpandByRow(row);
7687
+ const columnIndex = $xeTable.getColumnIndex(column);
7688
+ const $columnIndex = $xeTable.getVMColumnIndex(column);
7689
+ $xeTable.setRowExpand(row, expanded);
7690
+ $xeTable.dispatchEvent('toggle-row-expand', {
7691
+ expanded,
7692
+ column,
7693
+ columnIndex,
7694
+ $columnIndex,
7695
+ row,
7696
+ rowIndex: $xeTable.getRowIndex(row),
7697
+ $rowIndex: $xeTable.getVMRowIndex(row)
7698
+ }, evnt);
7382
7699
  }
7383
7700
  },
7384
7701
  /**
@@ -7424,48 +7741,6 @@ const Methods = {
7424
7741
  }
7425
7742
  return this.setRowExpand(expandedRows, expanded);
7426
7743
  },
7427
- handleAsyncRowExpand(row) {
7428
- const $xeTable = this;
7429
- const reactData = $xeTable;
7430
- const internalData = $xeTable;
7431
- return new Promise(resolve => {
7432
- const { expandOpts } = this;
7433
- const { loadMethod } = expandOpts;
7434
- if (loadMethod) {
7435
- const { fullAllDataRowIdData } = internalData;
7436
- const rExpandLazyLoadedMaps = Object.assign({}, reactData.rowExpandLazyLoadedMaps);
7437
- const rowid = getRowid($xeTable, row);
7438
- const rowRest = fullAllDataRowIdData[rowid];
7439
- rExpandLazyLoadedMaps[rowid] = row;
7440
- reactData.rowExpandLazyLoadedMaps = rExpandLazyLoadedMaps;
7441
- loadMethod({ $table: $xeTable, row, rowIndex: $xeTable.getRowIndex(row), $rowIndex: $xeTable.getVMRowIndex(row) }).then(() => {
7442
- const rExpandedMaps = Object.assign({}, reactData.rowExpandedMaps);
7443
- if (rowRest) {
7444
- rowRest.expandLoaded = true;
7445
- }
7446
- rExpandedMaps[rowid] = row;
7447
- reactData.rowExpandedMaps = rExpandedMaps;
7448
- }).catch(() => {
7449
- if (rowRest) {
7450
- rowRest.expandLoaded = false;
7451
- }
7452
- }).finally(() => {
7453
- const rExpandLazyLoadedMaps = Object.assign({}, reactData.rowExpandLazyLoadedMaps);
7454
- if (rExpandLazyLoadedMaps[rowid]) {
7455
- delete rExpandLazyLoadedMaps[rowid];
7456
- }
7457
- reactData.rowExpandLazyLoadedMaps = rExpandLazyLoadedMaps;
7458
- $xeTable.$nextTick()
7459
- .then(() => $xeTable.recalculate())
7460
- .then(() => $xeTable.updateCellAreas())
7461
- .then(() => resolve());
7462
- });
7463
- }
7464
- else {
7465
- resolve();
7466
- }
7467
- });
7468
- },
7469
7744
  /**
7470
7745
  * 设置展开行,二个参数设置这一行展开与否
7471
7746
  * 支持单行
@@ -7475,8 +7750,12 @@ const Methods = {
7475
7750
  */
7476
7751
  setRowExpand(rows, expanded) {
7477
7752
  const $xeTable = this;
7478
- const { rowExpandedMaps, fullAllDataRowIdData, rowExpandLazyLoadedMaps, expandOpts, expandColumn } = this;
7479
- let rExpandedMaps = Object.assign({}, rowExpandedMaps);
7753
+ const reactData = $xeTable;
7754
+ const internalData = $xeTable;
7755
+ const { expandColumn } = reactData;
7756
+ let { fullAllDataRowIdData, rowExpandedMaps, rowExpandLazyLoadedMaps } = internalData;
7757
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
7758
+ const expandOpts = $xeTable.computeExpandOpts;
7480
7759
  const { reserve, lazy, accordion, toggleMethod } = expandOpts;
7481
7760
  const lazyRests = [];
7482
7761
  const columnIndex = $xeTable.getColumnIndex(expandColumn);
@@ -7487,30 +7766,31 @@ const Methods = {
7487
7766
  }
7488
7767
  if (accordion) {
7489
7768
  // 只能同时展开一个
7490
- rExpandedMaps = {};
7769
+ rowExpandedMaps = {};
7770
+ internalData.rowExpandedMaps = rowExpandedMaps;
7491
7771
  rows = rows.slice(rows.length - 1, rows.length);
7492
7772
  }
7493
- const validRows = toggleMethod ? rows.filter((row) => toggleMethod({ expanded, column: expandColumn, columnIndex, $columnIndex, row, rowIndex: this.getRowIndex(row), $rowIndex: this.getVMRowIndex(row) })) : rows;
7773
+ const validRows = toggleMethod ? rows.filter((row) => toggleMethod({ $table: $xeTable, expanded, column: expandColumn, columnIndex, $columnIndex, row, rowIndex: this.getRowIndex(row), $rowIndex: this.getVMRowIndex(row) })) : rows;
7494
7774
  if (expanded) {
7495
7775
  validRows.forEach((row) => {
7496
- const rowid = getRowid(this, row);
7497
- if (!rExpandedMaps[rowid]) {
7776
+ const rowid = handleGetRowId(row);
7777
+ if (!rowExpandedMaps[rowid]) {
7498
7778
  const rowRest = fullAllDataRowIdData[rowid];
7499
7779
  const isLoad = lazy && !rowRest.expandLoaded && !rowExpandLazyLoadedMaps[rowid];
7500
7780
  if (isLoad) {
7501
- lazyRests.push(this.handleAsyncRowExpand(row));
7781
+ lazyRests.push(handleAsyncRowExpand($xeTable, row));
7502
7782
  }
7503
7783
  else {
7504
- rExpandedMaps[rowid] = row;
7784
+ rowExpandedMaps[rowid] = row;
7505
7785
  }
7506
7786
  }
7507
7787
  });
7508
7788
  }
7509
7789
  else {
7510
7790
  validRows.forEach((item) => {
7511
- const rowid = getRowid(this, item);
7512
- if (rExpandedMaps[rowid]) {
7513
- delete rExpandedMaps[rowid];
7791
+ const rowid = handleGetRowId(item);
7792
+ if (rowExpandedMaps[rowid]) {
7793
+ delete rowExpandedMaps[rowid];
7514
7794
  }
7515
7795
  });
7516
7796
  }
@@ -7518,7 +7798,7 @@ const Methods = {
7518
7798
  validRows.forEach((row) => handleRowExpandReserve($xeTable, row, expanded));
7519
7799
  }
7520
7800
  }
7521
- this.rowExpandedMaps = rExpandedMaps;
7801
+ reactData.rowExpandedFlag++;
7522
7802
  return Promise.all(lazyRests)
7523
7803
  .then(() => $xeTable.$nextTick())
7524
7804
  .then(() => $xeTable.recalculate(true))
@@ -7534,9 +7814,13 @@ const Methods = {
7534
7814
  * @param {Row} row 行对象
7535
7815
  */
7536
7816
  isRowExpandByRow(row) {
7537
- const { rowExpandedMaps } = this;
7817
+ const $xeTable = this;
7818
+ const reactData = $xeTable;
7819
+ const internalData = $xeTable;
7820
+ const { rowExpandedFlag } = reactData;
7821
+ const { rowExpandedMaps } = internalData;
7538
7822
  const rowid = getRowid(this, row);
7539
- return !!rowExpandedMaps[rowid];
7823
+ return !!rowExpandedFlag && !!rowExpandedMaps[rowid];
7540
7824
  },
7541
7825
  isExpandByRow(row) {
7542
7826
  if (process.env.NODE_ENV === 'development') {
@@ -7556,7 +7840,8 @@ const Methods = {
7556
7840
  const expandOpts = $xeTable.computeExpandOpts;
7557
7841
  const { reserve } = expandOpts;
7558
7842
  const expList = $xeTable.getRowExpandRecords();
7559
- reactData.rowExpandedMaps = {};
7843
+ internalData.rowExpandedMaps = {};
7844
+ reactData.rowExpandedFlag++;
7560
7845
  if (reserve) {
7561
7846
  tableFullData.forEach((row) => handleRowExpandReserve($xeTable, row, false));
7562
7847
  }
@@ -7576,8 +7861,10 @@ const Methods = {
7576
7861
  return this.$nextTick();
7577
7862
  },
7578
7863
  getRowExpandRecords() {
7864
+ const $xeTable = this;
7865
+ const internalData = $xeTable;
7579
7866
  const rest = [];
7580
- XEUtils.each(this.rowExpandedMaps, item => {
7867
+ XEUtils.each(internalData.rowExpandedMaps, item => {
7581
7868
  if (item) {
7582
7869
  rest.push(item);
7583
7870
  }
@@ -7585,8 +7872,10 @@ const Methods = {
7585
7872
  return rest;
7586
7873
  },
7587
7874
  getTreeExpandRecords() {
7875
+ const $xeTable = this;
7876
+ const internalData = $xeTable;
7588
7877
  const rest = [];
7589
- XEUtils.each(this.treeExpandedMaps, item => {
7878
+ XEUtils.each(internalData.treeExpandedMaps, item => {
7590
7879
  if (item) {
7591
7880
  rest.push(item);
7592
7881
  }
@@ -7619,12 +7908,10 @@ const Methods = {
7619
7908
  const $xeTable = this;
7620
7909
  const reactData = $xeTable;
7621
7910
  const internalData = $xeTable;
7622
- const { fullAllDataRowIdData } = internalData;
7911
+ const { fullAllDataRowIdData, treeExpandedMaps } = internalData;
7623
7912
  const treeOpts = $xeTable.computeTreeOpts;
7624
7913
  const { transform } = treeOpts;
7625
- let tExpandedMaps = {};
7626
7914
  if (rows) {
7627
- tExpandedMaps = Object.assign({}, reactData.treeExpandedMaps);
7628
7915
  if (!XEUtils.isArray(rows)) {
7629
7916
  rows = [rows];
7630
7917
  }
@@ -7633,8 +7920,8 @@ const Methods = {
7633
7920
  const rowRest = fullAllDataRowIdData[rowid];
7634
7921
  if (rowRest) {
7635
7922
  rowRest.treeLoaded = false;
7636
- if (tExpandedMaps[rowid]) {
7637
- delete tExpandedMaps[rowid];
7923
+ if (treeExpandedMaps[rowid]) {
7924
+ delete treeExpandedMaps[rowid];
7638
7925
  }
7639
7926
  }
7640
7927
  });
@@ -7644,7 +7931,8 @@ const Methods = {
7644
7931
  rowRest.treeLoaded = false;
7645
7932
  });
7646
7933
  }
7647
- reactData.treeExpandedMaps = {};
7934
+ internalData.treeExpandedMaps = {};
7935
+ reactData.treeExpandedFlag++;
7648
7936
  if (transform) {
7649
7937
  handleVirtualTreeToList($xeTable);
7650
7938
  return $xeTable.handleTableData();
@@ -7657,36 +7945,42 @@ const Methods = {
7657
7945
  */
7658
7946
  reloadTreeExpand(row) {
7659
7947
  const $xeTable = this;
7660
- const { treeOpts, treeExpandLazyLoadedMaps } = this;
7948
+ const internalData = $xeTable;
7949
+ const { treeExpandLazyLoadedMaps } = internalData;
7950
+ const treeOpts = $xeTable.computeTreeOpts;
7661
7951
  const { transform, lazy } = treeOpts;
7662
7952
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
7663
- const rowid = getRowid(this, row);
7953
+ const rowid = getRowid($xeTable, row);
7664
7954
  if (lazy && row[hasChildField] && !treeExpandLazyLoadedMaps[rowid]) {
7665
- return this.clearTreeExpandLoaded(row).then(() => {
7666
- return this.handleAsyncTreeExpandChilds(row);
7955
+ return $xeTable.clearTreeExpandLoaded(row).then(() => {
7956
+ return handleAsyncTreeExpandChilds($xeTable, row);
7667
7957
  }).then(() => {
7668
7958
  if (transform) {
7669
7959
  handleVirtualTreeToList($xeTable);
7670
- return this.handleTableData();
7960
+ return $xeTable.handleTableData();
7671
7961
  }
7672
7962
  }).then(() => {
7673
- return this.recalculate();
7963
+ return $xeTable.recalculate();
7674
7964
  });
7675
7965
  }
7676
- return this.$nextTick();
7966
+ return $xeTable.$nextTick();
7677
7967
  },
7678
7968
  reloadTreeChilds(row) {
7969
+ const $xeTable = this;
7679
7970
  if (process.env.NODE_ENV === 'development') {
7680
7971
  warnLog('vxe.error.delFunc', ['reloadTreeChilds', 'reloadTreeExpand']);
7681
7972
  }
7682
7973
  // 即将废弃
7683
- return this.reloadTreeExpand(row);
7974
+ return $xeTable.reloadTreeExpand(row);
7684
7975
  },
7685
7976
  /**
7686
7977
  * 展开树节点事件
7687
7978
  */
7688
7979
  triggerTreeExpandEvent(evnt, params) {
7689
- const { treeOpts, treeExpandLazyLoadedMaps } = this;
7980
+ const $xeTable = this;
7981
+ const internalData = $xeTable;
7982
+ const { treeExpandLazyLoadedMaps } = internalData;
7983
+ const treeOpts = $xeTable.computeTreeOpts;
7690
7984
  const { row, column } = params;
7691
7985
  const { lazy, trigger } = treeOpts;
7692
7986
  if (trigger === 'manual') {
@@ -7695,11 +7989,11 @@ const Methods = {
7695
7989
  evnt.stopPropagation();
7696
7990
  const rowid = getRowid(this, row);
7697
7991
  if (!lazy || !treeExpandLazyLoadedMaps[rowid]) {
7698
- const expanded = !this.isTreeExpandByRow(row);
7699
- const columnIndex = this.getColumnIndex(column);
7700
- const $columnIndex = this.getVMColumnIndex(column);
7701
- this.setTreeExpand(row, expanded);
7702
- this.emitEvent('toggle-tree-expand', { expanded, column, columnIndex, $columnIndex, row }, evnt);
7992
+ const expanded = !$xeTable.isTreeExpandByRow(row);
7993
+ const columnIndex = $xeTable.getColumnIndex(column);
7994
+ const $columnIndex = $xeTable.getVMColumnIndex(column);
7995
+ $xeTable.setTreeExpand(row, expanded);
7996
+ $xeTable.dispatchEvent('toggle-tree-expand', { expanded, column, columnIndex, $columnIndex, row }, evnt);
7703
7997
  }
7704
7998
  },
7705
7999
  /**
@@ -7708,87 +8002,6 @@ const Methods = {
7708
8002
  toggleTreeExpand(row) {
7709
8003
  return this.setTreeExpand(row, !this.isTreeExpandByRow(row));
7710
8004
  },
7711
- /**
7712
- * 处理默认展开树节点
7713
- */
7714
- handleDefaultTreeExpand() {
7715
- const { treeConfig, treeOpts, tableFullData } = this;
7716
- if (treeConfig) {
7717
- const { expandAll, expandRowKeys } = treeOpts;
7718
- const childrenField = treeOpts.children || treeOpts.childrenField;
7719
- if (expandAll) {
7720
- this.setAllTreeExpand(true);
7721
- }
7722
- else if (expandRowKeys) {
7723
- const defExpandeds = [];
7724
- const rowkey = getRowkey(this);
7725
- expandRowKeys.forEach((rowid) => {
7726
- const matchObj = XEUtils.findTree(tableFullData, item => rowid === XEUtils.get(item, rowkey), { children: childrenField });
7727
- if (matchObj) {
7728
- defExpandeds.push(matchObj.item);
7729
- }
7730
- });
7731
- this.setTreeExpand(defExpandeds, true);
7732
- }
7733
- }
7734
- },
7735
- handleAsyncTreeExpandChilds(row) {
7736
- const $xeTable = this;
7737
- const { treeOpts, checkboxOpts } = this;
7738
- const { transform, loadMethod } = treeOpts;
7739
- const { checkStrictly } = checkboxOpts;
7740
- return new Promise(resolve => {
7741
- if (loadMethod) {
7742
- const { treeExpandLazyLoadedMaps, fullAllDataRowIdData } = this;
7743
- const rowid = getRowid($xeTable, row);
7744
- const rowRest = fullAllDataRowIdData[rowid];
7745
- treeExpandLazyLoadedMaps[rowid] = row;
7746
- Promise.resolve(loadMethod({ $table: $xeTable, row })).then((childRecords) => {
7747
- if (rowRest) {
7748
- rowRest.treeLoaded = true;
7749
- }
7750
- if (treeExpandLazyLoadedMaps[rowid]) {
7751
- delete treeExpandLazyLoadedMaps[rowid];
7752
- }
7753
- if (!XEUtils.isArray(childRecords)) {
7754
- childRecords = [];
7755
- }
7756
- if (childRecords) {
7757
- return this.loadTreeChildren(row, childRecords).then((childRows) => {
7758
- const { treeExpandedMaps } = this;
7759
- if (childRows.length && !treeExpandedMaps[rowid]) {
7760
- treeExpandedMaps[rowid] = row;
7761
- }
7762
- // 如果当前节点已选中,则展开后子节点也被选中
7763
- if (!checkStrictly && this.isCheckedByCheckboxRow(row)) {
7764
- handleCheckedCheckboxRow($xeTable, childRows, true);
7765
- }
7766
- return this.$nextTick().then(() => {
7767
- if (transform) {
7768
- this.handleTableData();
7769
- updateAfterDataIndex($xeTable);
7770
- return this.$nextTick();
7771
- }
7772
- });
7773
- });
7774
- }
7775
- }).catch(() => {
7776
- const { treeExpandLazyLoadedMaps } = this;
7777
- if (rowRest) {
7778
- rowRest.treeLoaded = false;
7779
- }
7780
- if (treeExpandLazyLoadedMaps[rowid]) {
7781
- delete treeExpandLazyLoadedMaps[rowid];
7782
- }
7783
- }).finally(() => {
7784
- this.$nextTick().then(() => this.recalculate()).then(() => resolve());
7785
- });
7786
- }
7787
- else {
7788
- resolve();
7789
- }
7790
- });
7791
- },
7792
8005
  /**
7793
8006
  * 设置所有树节点的展开与否
7794
8007
  * @param {Boolean} expanded 是否展开
@@ -7813,42 +8026,47 @@ const Methods = {
7813
8026
  * @returns
7814
8027
  */
7815
8028
  handleBaseTreeExpand(rows, expanded) {
7816
- const { fullAllDataRowIdData, tableFullData, treeExpandedMaps, treeOpts, treeExpandLazyLoadedMaps, treeNodeColumn } = this;
8029
+ const $xeTable = this;
8030
+ const reactData = $xeTable;
8031
+ const internalData = $xeTable;
8032
+ const { treeNodeColumn } = reactData;
8033
+ const { fullAllDataRowIdData, tableFullData, treeExpandedMaps, treeExpandLazyLoadedMaps } = internalData;
8034
+ const treeOpts = $xeTable.computeTreeOpts;
7817
8035
  const { reserve, lazy, accordion, toggleMethod } = treeOpts;
7818
- const treeTempExpandedMaps = Object.assign({}, treeExpandedMaps);
7819
8036
  const childrenField = treeOpts.children || treeOpts.childrenField;
7820
8037
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
7821
8038
  const result = [];
7822
- const columnIndex = this.getColumnIndex(treeNodeColumn);
7823
- const $columnIndex = this.getVMColumnIndex(treeNodeColumn);
7824
- let validRows = toggleMethod ? rows.filter((row) => toggleMethod({ expanded, column: treeNodeColumn, columnIndex, $columnIndex, row })) : rows;
8039
+ const columnIndex = $xeTable.getColumnIndex(treeNodeColumn);
8040
+ const $columnIndex = $xeTable.getVMColumnIndex(treeNodeColumn);
8041
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
8042
+ let validRows = toggleMethod ? rows.filter((row) => toggleMethod({ $table: $xeTable, expanded, column: treeNodeColumn, columnIndex, $columnIndex, row })) : rows;
7825
8043
  if (accordion) {
7826
8044
  validRows = validRows.length ? [validRows[validRows.length - 1]] : [];
7827
8045
  // 同一级只能展开一个
7828
8046
  const matchObj = XEUtils.findTree(tableFullData, item => item === validRows[0], { children: childrenField });
7829
8047
  if (matchObj) {
7830
8048
  matchObj.items.forEach(item => {
7831
- const rowid = getRowid(this, item);
7832
- if (treeTempExpandedMaps[rowid]) {
7833
- delete treeTempExpandedMaps[rowid];
8049
+ const rowid = handleGetRowId(item);
8050
+ if (treeExpandedMaps[rowid]) {
8051
+ delete treeExpandedMaps[rowid];
7834
8052
  }
7835
8053
  });
7836
8054
  }
7837
8055
  }
7838
8056
  if (expanded) {
7839
8057
  validRows.forEach((row) => {
7840
- const rowid = getRowid(this, row);
7841
- if (!treeTempExpandedMaps[rowid]) {
8058
+ const rowid = handleGetRowId(row);
8059
+ if (!treeExpandedMaps[rowid]) {
7842
8060
  const rowRest = fullAllDataRowIdData[rowid];
7843
8061
  if (rowRest) {
7844
8062
  const isLoad = lazy && row[hasChildField] && !rowRest.treeLoaded && !treeExpandLazyLoadedMaps[rowid];
7845
8063
  // 是否使用懒加载
7846
8064
  if (isLoad) {
7847
- result.push(this.handleAsyncTreeExpandChilds(row));
8065
+ result.push(handleAsyncTreeExpandChilds($xeTable, row));
7848
8066
  }
7849
8067
  else {
7850
8068
  if (row[childrenField] && row[childrenField].length) {
7851
- treeTempExpandedMaps[rowid] = row;
8069
+ treeExpandedMaps[rowid] = row;
7852
8070
  }
7853
8071
  }
7854
8072
  }
@@ -7857,18 +8075,18 @@ const Methods = {
7857
8075
  }
7858
8076
  else {
7859
8077
  validRows.forEach((item) => {
7860
- const rowid = getRowid(this, item);
7861
- if (treeTempExpandedMaps[rowid]) {
7862
- delete treeTempExpandedMaps[rowid];
8078
+ const rowid = handleGetRowId(item);
8079
+ if (treeExpandedMaps[rowid]) {
8080
+ delete treeExpandedMaps[rowid];
7863
8081
  }
7864
8082
  });
7865
8083
  }
7866
8084
  if (reserve) {
7867
- validRows.forEach((row) => this.handleTreeExpandReserve(row, expanded));
8085
+ validRows.forEach((row) => handleTreeExpandReserve($xeTable, row, expanded));
7868
8086
  }
7869
- this.treeExpandedMaps = treeTempExpandedMaps;
8087
+ reactData.treeExpandedFlag++;
7870
8088
  return Promise.all(result).then(() => {
7871
- return this.recalculate();
8089
+ return $xeTable.recalculate();
7872
8090
  });
7873
8091
  },
7874
8092
  /**
@@ -7922,30 +8140,38 @@ const Methods = {
7922
8140
  * @param {Row} row 行对象
7923
8141
  */
7924
8142
  isTreeExpandByRow(row) {
7925
- const { treeExpandedMaps } = this;
7926
- return !!treeExpandedMaps[getRowid(this, row)];
8143
+ const $xeTable = this;
8144
+ const reactData = $xeTable;
8145
+ const internalData = $xeTable;
8146
+ const { treeExpandedFlag } = reactData;
8147
+ const { treeExpandedMaps } = internalData;
8148
+ return !!treeExpandedFlag && !!treeExpandedMaps[getRowid($xeTable, row)];
7927
8149
  },
7928
8150
  /**
7929
8151
  * 手动清空树形节点的展开状态,数据会恢复成未展开的状态
7930
8152
  */
7931
8153
  clearTreeExpand() {
7932
8154
  const $xeTable = this;
7933
- const { treeOpts, tableFullData } = this;
7934
- const { transform, reserve } = treeOpts;
8155
+ const reactData = $xeTable;
8156
+ const internalData = $xeTable;
8157
+ const { tableFullTreeData } = internalData;
8158
+ const treeOpts = $xeTable.computeTreeOpts;
7935
8159
  const childrenField = treeOpts.children || treeOpts.childrenField;
7936
- const expList = this.getTreeExpandRecords();
7937
- this.treeExpandedMaps = {};
8160
+ const { transform, reserve } = treeOpts;
8161
+ const expList = $xeTable.getTreeExpandRecords();
8162
+ internalData.treeExpandedMaps = {};
8163
+ reactData.treeExpandedFlag++;
7938
8164
  if (reserve) {
7939
- XEUtils.eachTree(tableFullData, row => this.handleTreeExpandReserve(row, false), { children: childrenField });
8165
+ XEUtils.eachTree(tableFullTreeData, row => handleTreeExpandReserve($xeTable, row, false), { children: childrenField });
7940
8166
  }
7941
- return this.handleTableData().then(() => {
8167
+ return $xeTable.handleTableData().then(() => {
7942
8168
  if (transform) {
7943
8169
  handleVirtualTreeToList($xeTable);
7944
- return this.handleTableData();
8170
+ return $xeTable.handleTableData();
7945
8171
  }
7946
8172
  }).then(() => {
7947
8173
  if (expList.length) {
7948
- this.recalculate();
8174
+ $xeTable.recalculate();
7949
8175
  }
7950
8176
  });
7951
8177
  },
@@ -7953,18 +8179,6 @@ const Methods = {
7953
8179
  this.treeExpandedReserveRowMap = {};
7954
8180
  return this.$nextTick();
7955
8181
  },
7956
- handleTreeExpandReserve(row, expanded) {
7957
- const { treeExpandedReserveRowMap, treeOpts } = this;
7958
- if (treeOpts.reserve) {
7959
- const rowid = getRowid(this, row);
7960
- if (expanded) {
7961
- treeExpandedReserveRowMap[rowid] = row;
7962
- }
7963
- else if (treeExpandedReserveRowMap[rowid]) {
7964
- delete treeExpandedReserveRowMap[rowid];
7965
- }
7966
- }
7967
- },
7968
8182
  /**
7969
8183
  * 获取表格的滚动状态
7970
8184
  */
@@ -8282,10 +8496,10 @@ const Methods = {
8282
8496
  return;
8283
8497
  }
8284
8498
  const { highlightHoverRow } = tableProps;
8285
- const { scrollXLoad, scrollYLoad } = reactData;
8499
+ const { scrollXLoad, scrollYLoad, expandColumn } = reactData;
8286
8500
  const leftFixedWidth = $xeTable.computeLeftFixedWidth;
8287
8501
  const rightFixedWidth = $xeTable.computeRightFixedWidth;
8288
- if (!(scrollYLoad || leftFixedWidth || rightFixedWidth)) {
8502
+ if (!(leftFixedWidth || rightFixedWidth || expandColumn)) {
8289
8503
  return;
8290
8504
  }
8291
8505
  const { elemStore, lastScrollTop, lastScrollLeft } = internalData;
@@ -8537,8 +8751,8 @@ const Methods = {
8537
8751
  const $xeTable = this;
8538
8752
  const reactData = $xeTable;
8539
8753
  const internalData = $xeTable;
8540
- const { isAllOverflow, scrollYLoad, expandColumn, rowExpandedMaps } = reactData;
8541
- const { scrollYStore, elemStore, isResizeCellHeight, afterFullData, fullAllDataRowIdData } = internalData;
8754
+ const { isAllOverflow, scrollYLoad, expandColumn } = reactData;
8755
+ const { scrollYStore, elemStore, isResizeCellHeight, afterFullData, fullAllDataRowIdData, rowExpandedMaps } = internalData;
8542
8756
  const { startIndex } = scrollYStore;
8543
8757
  const expandOpts = $xeTable.computeExpandOpts;
8544
8758
  const rowOpts = $xeTable.computeRowOpts;
@@ -8781,13 +8995,15 @@ const Methods = {
8781
8995
  * 更新表尾合计
8782
8996
  */
8783
8997
  updateFooter() {
8998
+ const $xeTable = this;
8999
+ const $xeGrid = $xeTable.$xeGrid;
8784
9000
  const { showFooter, visibleColumn, footerData, footerMethod } = this;
8785
9001
  let footData = [];
8786
9002
  if (showFooter && footerData && footerData.length) {
8787
9003
  footData = footerData.slice(0);
8788
9004
  }
8789
9005
  else if (showFooter && footerMethod) {
8790
- footData = visibleColumn.length ? footerMethod({ columns: visibleColumn, data: this.afterFullData, $table: this, $grid: this.$xegrid }) : [];
9006
+ footData = visibleColumn.length ? footerMethod({ columns: visibleColumn, data: this.afterFullData, $table: $xeTable, $grid: $xeGrid }) : [];
8791
9007
  }
8792
9008
  this.footerTableData = footData;
8793
9009
  return this.$nextTick();
@@ -8865,7 +9081,7 @@ const Methods = {
8865
9081
  if (this.footerSpanMethod) {
8866
9082
  errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
8867
9083
  }
8868
- setMerges(this, merges, this.mergeFooterList, null);
9084
+ setMerges(this, merges, this.mergeFooterList);
8869
9085
  return this.$nextTick().then(() => {
8870
9086
  this.updateCellAreas();
8871
9087
  return updateStyle($xeTable);
@@ -8919,11 +9135,14 @@ const Methods = {
8919
9135
  },
8920
9136
  dispatchEvent(type, params, evnt) {
8921
9137
  const $xeTable = this;
8922
- $xeTable.$emit(type, createEvent(evnt, { $table: $xeTable, $grid: $xeTable.$xegrid }, params));
9138
+ const $xeGrid = $xeTable.$xeGrid;
9139
+ $xeTable.$emit(type, createEvent(evnt, { $table: $xeTable, $grid: $xeGrid }, params));
8923
9140
  },
8924
9141
  // 已废弃,使用 dispatchEvent
8925
9142
  emitEvent(type, params, evnt) {
8926
- this.$emit(type, Object.assign({ $table: this, $grid: this.$xegrid, $event: evnt }, params));
9143
+ const $xeTable = this;
9144
+ const $xeGrid = $xeTable.$xeGrid;
9145
+ this.$emit(type, Object.assign({ $table: $xeTable, $grid: $xeGrid, $event: evnt }, params));
8927
9146
  },
8928
9147
  focus() {
8929
9148
  this.isActivated = true;