vxe-table 4.17.6 → 4.17.8

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 (37) hide show
  1. package/es/style.css +1 -1
  2. package/es/table/src/body.js +12 -20
  3. package/es/table/src/cell.js +41 -35
  4. package/es/table/src/footer.js +3 -12
  5. package/es/table/src/header.js +4 -12
  6. package/es/table/src/table.js +122 -58
  7. package/es/ui/index.js +1 -1
  8. package/es/ui/src/log.js +1 -1
  9. package/lib/index.umd.js +56 -75
  10. package/lib/index.umd.min.js +1 -1
  11. package/lib/style.css +1 -1
  12. package/lib/table/src/body.js +10 -23
  13. package/lib/table/src/body.min.js +1 -1
  14. package/lib/table/src/cell.js +8 -4
  15. package/lib/table/src/cell.min.js +1 -1
  16. package/lib/table/src/footer.js +4 -15
  17. package/lib/table/src/footer.min.js +1 -1
  18. package/lib/table/src/header.js +5 -14
  19. package/lib/table/src/header.min.js +1 -1
  20. package/lib/table/src/table.js +30 -19
  21. package/lib/table/src/table.min.js +1 -1
  22. package/lib/ui/index.js +1 -1
  23. package/lib/ui/index.min.js +1 -1
  24. package/lib/ui/src/log.js +1 -1
  25. package/lib/ui/src/log.min.js +1 -1
  26. package/package.json +1 -1
  27. package/packages/table/src/body.ts +8 -20
  28. package/packages/table/src/cell.ts +41 -35
  29. package/packages/table/src/footer.ts +3 -11
  30. package/packages/table/src/header.ts +4 -12
  31. package/packages/table/src/table.ts +122 -57
  32. /package/es/{iconfont.1761877377602.ttf → iconfont.1762324094489.ttf} +0 -0
  33. /package/es/{iconfont.1761877377602.woff → iconfont.1762324094489.woff} +0 -0
  34. /package/es/{iconfont.1761877377602.woff2 → iconfont.1762324094489.woff2} +0 -0
  35. /package/lib/{iconfont.1761877377602.ttf → iconfont.1762324094489.ttf} +0 -0
  36. /package/lib/{iconfont.1761877377602.woff → iconfont.1762324094489.woff} +0 -0
  37. /package/lib/{iconfont.1761877377602.woff2 → iconfont.1762324094489.woff2} +0 -0
@@ -23,7 +23,7 @@ export default defineVxeComponent({
23
23
  setup(props) {
24
24
  const $xeTable = inject('$xeTable', {});
25
25
  const { xID, props: tableProps, context: tableContext, reactData: tableReactData, internalData: tableInternalData } = $xeTable;
26
- const { computeEditOpts, computeMouseOpts, computeCellOffsetWidth, computeAreaOpts, computeDefaultRowHeight, computeEmptyOpts, computeTooltipOpts, computeRadioOpts, computeExpandOpts, computeTreeOpts, computeCheckboxOpts, computeCellOpts, computeValidOpts, computeRowOpts, computeColumnOpts, computeRowDragOpts, computeResizableOpts, computeVirtualXOpts, computeVirtualYOpts } = $xeTable.getComputeMaps();
26
+ const { computeEditOpts, computeMouseOpts, computeCellOffsetWidth, computeAreaOpts, computeDefaultRowHeight, computeEmptyOpts, computeTooltipOpts, computeRadioOpts, computeExpandOpts, computeTreeOpts, computeCheckboxOpts, computeCellOpts, computeValidOpts, computeRowOpts, computeColumnOpts, computeRowDragOpts, computeResizableOpts, computeVirtualXOpts, computeVirtualYOpts, computeIsBodyRenderOptimize } = $xeTable.getComputeMaps();
27
27
  const refElem = ref();
28
28
  const refBodyScroll = ref();
29
29
  const refBodyTable = ref();
@@ -666,24 +666,15 @@ export default defineVxeComponent({
666
666
  const $xeGrid = $xeTable.xeGrid;
667
667
  const $xeGantt = $xeTable.xeGantt;
668
668
  const { fixedColumn, fixedType, tableColumn } = props;
669
- const { spanMethod, footerSpanMethod, mouseConfig } = tableProps;
670
- const { isGroup, tableData, isColLoading, overflowX, scrollXLoad, scrollYLoad, isAllOverflow, expandColumn, dragRow, dragCol } = tableReactData;
669
+ const { mouseConfig } = tableProps;
670
+ const { isGroup, tableData, isColLoading, overflowX, scrollXLoad, scrollYLoad, dragRow, dragCol } = tableReactData;
671
671
  const { visibleColumn, fullAllDataRowIdData, fullColumnIdData } = tableInternalData;
672
672
  const emptyOpts = computeEmptyOpts.value;
673
673
  const mouseOpts = computeMouseOpts.value;
674
- const expandOpts = computeExpandOpts.value;
674
+ const isBodyRenderOptimize = computeIsBodyRenderOptimize.value;
675
675
  let renderDataList = tableData;
676
676
  let renderColumnList = tableColumn;
677
- let isOptimizeMode = false;
678
- // 如果是使用优化模式
679
- if (scrollXLoad || scrollYLoad || isAllOverflow) {
680
- if ((expandColumn && expandOpts.mode !== 'fixed') || spanMethod || footerSpanMethod) {
681
- // 如果不支持优化模式
682
- }
683
- else {
684
- isOptimizeMode = true;
685
- }
686
- }
677
+ const isOptimizeMode = isBodyRenderOptimize;
687
678
  if (!isColLoading && (fixedType || !overflowX)) {
688
679
  renderColumnList = visibleColumn;
689
680
  }
@@ -756,17 +747,18 @@ export default defineVxeComponent({
756
747
  emptyContent = tableProps.emptyText || getI18n('vxe.table.emptyText');
757
748
  }
758
749
  }
759
- const ons = {
760
- onScroll(evnt) {
761
- $xeTable.triggerBodyScrollEvent(evnt, fixedType);
762
- }
763
- };
764
750
  return h('div', {
765
751
  ref: refElem,
766
752
  class: ['vxe-table--body-wrapper', fixedType ? `fixed-${fixedType}--wrapper` : 'body--wrapper'],
767
753
  xid: xID
768
754
  }, [
769
- h('div', Object.assign({ ref: refBodyScroll, class: 'vxe-table--body-inner-wrapper' }, ons), [
755
+ h('div', {
756
+ ref: refBodyScroll,
757
+ class: 'vxe-table--body-inner-wrapper',
758
+ onScroll(evnt) {
759
+ $xeTable.triggerBodyScrollEvent(evnt, fixedType);
760
+ }
761
+ }, [
770
762
  fixedType
771
763
  ? renderEmptyElement($xeTable)
772
764
  : h('div', {
@@ -164,7 +164,8 @@ function renderTitleContent(params, content) {
164
164
  const { computeHeaderTooltipOpts } = $table.getComputeMaps();
165
165
  const { showHeaderOverflow: allColumnHeaderOverflow } = tableProps;
166
166
  const { isRowGroupStatus } = tableReactData;
167
- const { showHeaderOverflow } = column;
167
+ const { showHeaderOverflow, slots } = column;
168
+ const titleSlot = slots ? slots.title : null;
168
169
  const headerTooltipOpts = computeHeaderTooltipOpts.value;
169
170
  const showAllTip = headerTooltipOpts.showAll;
170
171
  const headOverflow = XEUtils.eqNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow;
@@ -198,9 +199,11 @@ function renderTitleContent(params, content) {
198
199
  return [
199
200
  h('span', Object.assign({ class: 'vxe-cell--title' }, ons), isRowGroupStatus && column.aggFunc && $table.getPivotTableAggregateRenderColTitles
200
201
  ? $table.getPivotTableAggregateRenderColTitles(column, titleVN)
201
- : [
202
- titleVN
203
- ])
202
+ : titleSlot
203
+ ? $table.callSlot(titleSlot, params)
204
+ : [
205
+ titleVN
206
+ ])
204
207
  ];
205
208
  }
206
209
  function getFooterContent(params) {
@@ -1007,38 +1010,41 @@ export const Cell = {
1007
1010
  const { computeSortOpts } = $table.getComputeMaps();
1008
1011
  const sortOpts = computeSortOpts.value;
1009
1012
  const { showIcon, allowBtn, ascTitle, descTitle, iconLayout, iconAsc, iconDesc, iconVisibleMethod } = sortOpts;
1010
- const { order } = column;
1013
+ const { order, slots } = column;
1011
1014
  if (showIcon && (!iconVisibleMethod || iconVisibleMethod(params))) {
1012
- return [
1013
- h('span', {
1014
- class: ['vxe-cell--sort', `vxe-cell--sort-${iconLayout}-layout`]
1015
- }, [
1016
- h('i', {
1017
- class: ['vxe-sort--asc-btn', iconAsc || getIcon().TABLE_SORT_ASC, {
1018
- 'sort--active': order === 'asc'
1019
- }],
1020
- title: XEUtils.eqNull(ascTitle) ? getI18n('vxe.table.sortAsc') : `${ascTitle || ''}`,
1021
- onClick: allowBtn
1022
- ? (evnt) => {
1023
- evnt.stopPropagation();
1024
- $table.triggerSortEvent(evnt, column, 'asc');
1025
- }
1026
- : undefined
1027
- }),
1028
- h('i', {
1029
- class: ['vxe-sort--desc-btn', iconDesc || getIcon().TABLE_SORT_DESC, {
1030
- 'sort--active': order === 'desc'
1031
- }],
1032
- title: XEUtils.eqNull(descTitle) ? getI18n('vxe.table.sortDesc') : `${descTitle || ''}`,
1033
- onClick: allowBtn
1034
- ? (evnt) => {
1035
- evnt.stopPropagation();
1036
- $table.triggerSortEvent(evnt, column, 'desc');
1037
- }
1038
- : undefined
1039
- })
1040
- ])
1041
- ];
1015
+ const sortSlot = slots ? slots.sort : null;
1016
+ return sortSlot
1017
+ ? getSlotVNs($table.callSlot(sortSlot, params))
1018
+ : [
1019
+ h('span', {
1020
+ class: ['vxe-cell--sort', `vxe-cell--sort-${iconLayout}-layout`]
1021
+ }, [
1022
+ h('i', {
1023
+ class: ['vxe-sort--asc-btn', iconAsc || getIcon().TABLE_SORT_ASC, {
1024
+ 'sort--active': order === 'asc'
1025
+ }],
1026
+ title: XEUtils.eqNull(ascTitle) ? getI18n('vxe.table.sortAsc') : `${ascTitle || ''}`,
1027
+ onClick: allowBtn
1028
+ ? (evnt) => {
1029
+ evnt.stopPropagation();
1030
+ $table.triggerSortEvent(evnt, column, 'asc');
1031
+ }
1032
+ : undefined
1033
+ }),
1034
+ h('i', {
1035
+ class: ['vxe-sort--desc-btn', iconDesc || getIcon().TABLE_SORT_DESC, {
1036
+ 'sort--active': order === 'desc'
1037
+ }],
1038
+ title: XEUtils.eqNull(descTitle) ? getI18n('vxe.table.sortDesc') : `${descTitle || ''}`,
1039
+ onClick: allowBtn
1040
+ ? (evnt) => {
1041
+ evnt.stopPropagation();
1042
+ $table.triggerSortEvent(evnt, column, 'desc');
1043
+ }
1044
+ : undefined
1045
+ })
1046
+ ])
1047
+ ];
1042
1048
  }
1043
1049
  return [];
1044
1050
  },
@@ -30,7 +30,7 @@ export default defineVxeComponent({
30
30
  setup(props) {
31
31
  const $xeTable = inject('$xeTable', {});
32
32
  const { xID, props: tableProps, reactData: tableReactData, internalData: tableInternalData } = $xeTable;
33
- const { computeFooterTooltipOpts, computeColumnOpts, computeCellOpts, computeFooterCellOpts, computeDefaultRowHeight, computeResizableOpts, computeVirtualXOpts } = $xeTable.getComputeMaps();
33
+ const { computeFooterTooltipOpts, computeColumnOpts, computeCellOpts, computeFooterCellOpts, computeDefaultRowHeight, computeResizableOpts, computeVirtualXOpts, computeIsFooterRenderOptimize } = $xeTable.getComputeMaps();
34
34
  const refElem = ref();
35
35
  const refFooterScroll = ref();
36
36
  const refFooterTable = ref();
@@ -221,20 +221,11 @@ export default defineVxeComponent({
221
221
  };
222
222
  const renderVN = () => {
223
223
  const { fixedType, fixedColumn, tableColumn } = props;
224
- const { spanMethod, footerSpanMethod, showFooterOverflow: allColumnFooterOverflow } = tableProps;
225
224
  const { visibleColumn, fullColumnIdData } = tableInternalData;
226
225
  const { isGroup, isColLoading, overflowX, scrollXLoad, dragCol } = tableReactData;
226
+ const isFooterRenderOptimize = computeIsFooterRenderOptimize.value;
227
227
  let renderColumnList = tableColumn;
228
- let isOptimizeMode = false;
229
- // 如果是使用优化模式
230
- if (scrollXLoad && allColumnFooterOverflow) {
231
- if (spanMethod || footerSpanMethod) {
232
- // 如果不支持优化模式
233
- }
234
- else {
235
- isOptimizeMode = true;
236
- }
237
- }
228
+ const isOptimizeMode = isFooterRenderOptimize;
238
229
  if (!isOptimizeMode || (!isColLoading && (fixedType || !overflowX))) {
239
230
  renderColumnList = visibleColumn;
240
231
  }
@@ -37,7 +37,7 @@ export default defineVxeComponent({
37
37
  setup(props) {
38
38
  const $xeTable = inject('$xeTable', {});
39
39
  const { xID, props: tableProps, reactData: tableReactData, internalData: tableInternalData } = $xeTable;
40
- const { computeColumnOpts, computeColumnDragOpts, computeCellOpts, computeMouseOpts, computeHeaderCellOpts, computeDefaultRowHeight, computeVirtualXOpts, computeFloatingFilterOpts } = $xeTable.getComputeMaps();
40
+ const { computeColumnOpts, computeColumnDragOpts, computeCellOpts, computeMouseOpts, computeHeaderCellOpts, computeDefaultRowHeight, computeVirtualXOpts, computeFloatingFilterOpts, computeIsHeaderRenderOptimize } = $xeTable.getComputeMaps();
41
41
  const headerColumn = ref([]);
42
42
  const refElem = ref();
43
43
  const refHeaderScroll = ref();
@@ -373,26 +373,18 @@ export default defineVxeComponent({
373
373
  };
374
374
  const renderVN = () => {
375
375
  const { fixedType, fixedColumn, tableColumn } = props;
376
- const { mouseConfig, showHeaderOverflow: allColumnHeaderOverflow, spanMethod, footerSpanMethod } = tableProps;
376
+ const { mouseConfig } = tableProps;
377
377
  const { isGroup, isColLoading, overflowX, scrollXLoad, dragCol } = tableReactData;
378
378
  const { visibleColumn, fullColumnIdData } = tableInternalData;
379
379
  const mouseOpts = computeMouseOpts.value;
380
+ const isHeaderRenderOptimize = computeIsHeaderRenderOptimize.value;
380
381
  let renderHeaderList = headerColumn.value || [];
381
382
  let renderColumnList = tableColumn;
382
- let isOptimizeMode = false;
383
+ const isOptimizeMode = isHeaderRenderOptimize;
383
384
  if (isGroup) {
384
385
  renderColumnList = visibleColumn;
385
386
  }
386
387
  else {
387
- // 如果是使用优化模式
388
- if (scrollXLoad && allColumnHeaderOverflow) {
389
- if (spanMethod || footerSpanMethod) {
390
- // 如果不支持优化模式
391
- }
392
- else {
393
- isOptimizeMode = true;
394
- }
395
- }
396
388
  if (!isOptimizeMode || (!isColLoading && (fixedType || !overflowX))) {
397
389
  renderColumnList = visibleColumn;
398
390
  }
@@ -588,6 +588,77 @@ export default defineVxeComponent({
588
588
  }
589
589
  return leftWidth;
590
590
  });
591
+ const computeBodyMergeCoverFixed = computed(() => {
592
+ const { columnStore, mergeBodyFlag } = reactData;
593
+ const { mergeBodyList, visibleColumn } = internalData;
594
+ const { leftList, rightList } = columnStore;
595
+ const rscIndex = visibleColumn.length - rightList.length;
596
+ if (mergeBodyFlag && (leftList.length || rightList.length)) {
597
+ const lecIndex = leftList.length;
598
+ for (let i = 0; i < mergeBodyList.length; i++) {
599
+ const { col, colspan } = mergeBodyList[i];
600
+ if (col < lecIndex || (col + colspan) > rscIndex) {
601
+ return true;
602
+ }
603
+ }
604
+ }
605
+ return false;
606
+ });
607
+ const computeIsHeaderRenderOptimize = computed(() => {
608
+ const { spanMethod, footerSpanMethod, showHeaderOverflow: allColumnHeaderOverflow } = props;
609
+ const { isGroup, scrollXLoad } = reactData;
610
+ let isOptimizeMode = false;
611
+ if (isGroup) {
612
+ // 分组表头
613
+ }
614
+ else {
615
+ // 如果是使用优化模式
616
+ if (scrollXLoad && allColumnHeaderOverflow) {
617
+ if (spanMethod || footerSpanMethod) {
618
+ // 如果不支持优化模式
619
+ }
620
+ else {
621
+ isOptimizeMode = true;
622
+ }
623
+ }
624
+ }
625
+ return isOptimizeMode;
626
+ });
627
+ const computeIsBodyRenderOptimize = computed(() => {
628
+ const { spanMethod, footerSpanMethod } = props;
629
+ const { scrollXLoad, scrollYLoad, isAllOverflow, expandColumn } = reactData;
630
+ const bodyMergeCoverFixed = computeBodyMergeCoverFixed.value;
631
+ const expandOpts = computeExpandOpts.value;
632
+ let isOptimizeMode = false;
633
+ // 如果是使用优化模式
634
+ if (scrollXLoad || scrollYLoad || isAllOverflow) {
635
+ // 如果是展开行,内联模式,不支持优化
636
+ // 如果是方法合并,不支持优化
637
+ // 如果固定列且配置式合并,不支持优化
638
+ if ((expandColumn && expandOpts.mode !== 'fixed') || bodyMergeCoverFixed || spanMethod || footerSpanMethod) {
639
+ // 如果不支持优化模式
640
+ }
641
+ else {
642
+ isOptimizeMode = true;
643
+ }
644
+ }
645
+ return isOptimizeMode;
646
+ });
647
+ const computeIsFooterRenderOptimize = computed(() => {
648
+ const { spanMethod, footerSpanMethod, showFooterOverflow: allColumnFooterOverflow } = props;
649
+ const { scrollXLoad } = reactData;
650
+ let isOptimizeMode = false;
651
+ // 如果是使用优化模式
652
+ if (scrollXLoad && allColumnFooterOverflow) {
653
+ if (spanMethod || footerSpanMethod) {
654
+ // 如果不支持优化模式
655
+ }
656
+ else {
657
+ isOptimizeMode = true;
658
+ }
659
+ }
660
+ return isOptimizeMode;
661
+ });
591
662
  const computeHeaderMenu = computed(() => {
592
663
  const menuOpts = computeMenuOpts.value;
593
664
  const headerOpts = menuOpts.header;
@@ -835,9 +906,13 @@ export default defineVxeComponent({
835
906
  computeCustomOpts,
836
907
  computeLeftFixedWidth,
837
908
  computeRightFixedWidth,
909
+ computeBodyMergeCoverFixed,
838
910
  computeFixedColumnSize,
839
911
  computeIsMaxFixedColumn,
840
912
  computeIsAllCheckboxDisabled,
913
+ computeIsHeaderRenderOptimize,
914
+ computeIsBodyRenderOptimize,
915
+ computeIsFooterRenderOptimize,
841
916
  computeVirtualScrollBars,
842
917
  computeRowGroupFields,
843
918
  computeRowGroupColumns,
@@ -1942,19 +2017,28 @@ export default defineVxeComponent({
1942
2017
  * 计算自适应行高
1943
2018
  */
1944
2019
  const calcCellAutoHeight = (rowRest, wrapperEl) => {
1945
- const cellElemList = wrapperEl.querySelectorAll(`.vxe-cell--wrapper[rowid="${rowRest.rowid}"]`);
2020
+ const { scrollXLoad } = reactData;
2021
+ const wrapperElemList = wrapperEl.querySelectorAll(`.vxe-cell--wrapper[rowid="${rowRest.rowid}"]`);
1946
2022
  let colHeight = rowRest.height;
1947
2023
  let firstCellStyle = null;
1948
2024
  let topBottomPadding = 0;
1949
- for (let i = 0; i < cellElemList.length; i++) {
1950
- const wrapperElem = cellElemList[i];
2025
+ for (let i = 0; i < wrapperElemList.length; i++) {
2026
+ const wrapperElem = wrapperElemList[i];
1951
2027
  const cellElem = wrapperElem.parentElement;
1952
2028
  if (!firstCellStyle) {
2029
+ const cellStyle = cellElem.style;
2030
+ const orHeight = cellStyle.height;
2031
+ if (!scrollXLoad) {
2032
+ cellStyle.height = '';
2033
+ }
1953
2034
  firstCellStyle = getComputedStyle(cellElem);
1954
2035
  topBottomPadding = firstCellStyle ? Math.ceil(XEUtils.toNumber(firstCellStyle.paddingTop) + XEUtils.toNumber(firstCellStyle.paddingBottom)) : 0;
2036
+ if (!scrollXLoad) {
2037
+ cellStyle.height = orHeight;
2038
+ }
1955
2039
  }
1956
2040
  const cellHeight = wrapperElem ? wrapperElem.clientHeight : 0;
1957
- colHeight = Math.max(colHeight, Math.ceil(cellHeight + topBottomPadding));
2041
+ colHeight = scrollXLoad ? Math.max(colHeight, Math.ceil(cellHeight + topBottomPadding)) : Math.ceil(cellHeight + topBottomPadding);
1958
2042
  }
1959
2043
  return colHeight;
1960
2044
  };
@@ -2338,8 +2422,8 @@ export default defineVxeComponent({
2338
2422
  updateAfterDataIndex();
2339
2423
  };
2340
2424
  const updateStyle = () => {
2341
- const { showHeaderOverflow: allColumnHeaderOverflow, showFooterOverflow: allColumnFooterOverflow, mouseConfig, spanMethod, footerSpanMethod } = props;
2342
- const { isGroup, currentRow, tableColumn, scrollXLoad, scrollYLoad, overflowX, scrollbarWidth, overflowY, scrollbarHeight, scrollXWidth, columnStore, editStore, isAllOverflow, expandColumn, isColLoading } = reactData;
2425
+ const { mouseConfig } = props;
2426
+ const { isGroup, currentRow, tableColumn, overflowX, scrollbarWidth, overflowY, scrollbarHeight, scrollXWidth, columnStore, editStore, isColLoading } = reactData;
2343
2427
  const { visibleColumn, tableHeight, elemStore, customHeight, customMinHeight, customMaxHeight, tHeaderHeight, tFooterHeight } = internalData;
2344
2428
  const $xeGanttView = internalData.xeGanttView;
2345
2429
  const el = refElem.value;
@@ -2347,12 +2431,15 @@ export default defineVxeComponent({
2347
2431
  return;
2348
2432
  }
2349
2433
  const containerList = ['main', 'left', 'right'];
2434
+ const { leftList, rightList } = columnStore;
2350
2435
  let osbWidth = overflowY ? scrollbarWidth : 0;
2351
2436
  let osbHeight = overflowX ? scrollbarHeight : 0;
2352
2437
  const emptyPlaceholderElem = refEmptyPlaceholder.value;
2438
+ const isHeaderRenderOptimize = computeIsHeaderRenderOptimize.value;
2439
+ const isBodyRenderOptimize = computeIsBodyRenderOptimize.value;
2440
+ const isFooterRenderOptimize = computeIsFooterRenderOptimize.value;
2353
2441
  const scrollbarOpts = computeScrollbarOpts.value;
2354
2442
  const mouseOpts = computeMouseOpts.value;
2355
- const expandOpts = computeExpandOpts.value;
2356
2443
  const bodyWrapperElem = getRefElem(elemStore['main-body-wrapper']);
2357
2444
  const bodyTableElem = getRefElem(elemStore['main-body-table']);
2358
2445
  if (emptyPlaceholderElem) {
@@ -2470,7 +2557,7 @@ export default defineVxeComponent({
2470
2557
  let fixedColumn = [];
2471
2558
  let fixedWrapperElem;
2472
2559
  if (fixedType) {
2473
- fixedColumn = isFixedLeft ? columnStore.leftList : columnStore.rightList;
2560
+ fixedColumn = isFixedLeft ? leftList : rightList;
2474
2561
  fixedWrapperElem = isFixedLeft ? refLeftContainer.value : refRightContainer.value;
2475
2562
  }
2476
2563
  layoutList.forEach(layout => {
@@ -2481,20 +2568,11 @@ export default defineVxeComponent({
2481
2568
  // 表头体样式处理
2482
2569
  // 横向滚动渲染
2483
2570
  let renderColumnList = tableColumn;
2484
- let isOptimizeMode = false;
2571
+ const isOptimizeMode = isHeaderRenderOptimize;
2485
2572
  if (isGroup) {
2486
2573
  renderColumnList = visibleColumn;
2487
2574
  }
2488
2575
  else {
2489
- // 如果是使用优化模式
2490
- if (scrollXLoad && allColumnHeaderOverflow) {
2491
- if (spanMethod || footerSpanMethod) {
2492
- // 如果不支持优化模式
2493
- }
2494
- else {
2495
- isOptimizeMode = true;
2496
- }
2497
- }
2498
2576
  if (!isOptimizeMode || (!isColLoading && (fixedType || !overflowX))) {
2499
2577
  renderColumnList = visibleColumn;
2500
2578
  }
@@ -2547,16 +2625,7 @@ export default defineVxeComponent({
2547
2625
  fixedWrapperElem.style.width = `${fixedColumn.reduce((previous, column) => previous + column.renderWidth, 0)}px`;
2548
2626
  }
2549
2627
  let renderColumnList = tableColumn;
2550
- let isOptimizeMode = false;
2551
- // 如果是使用优化模式
2552
- if (scrollXLoad || scrollYLoad || isAllOverflow) {
2553
- if ((expandColumn && expandOpts.mode !== 'fixed') || spanMethod || footerSpanMethod) {
2554
- // 如果不支持优化模式
2555
- }
2556
- else {
2557
- isOptimizeMode = true;
2558
- }
2559
- }
2628
+ const isOptimizeMode = isBodyRenderOptimize;
2560
2629
  if (fixedType) {
2561
2630
  renderColumnList = visibleColumn;
2562
2631
  if (isOptimizeMode) {
@@ -2588,16 +2657,7 @@ export default defineVxeComponent({
2588
2657
  }
2589
2658
  else if (layout === 'footer') {
2590
2659
  let renderColumnList = tableColumn;
2591
- let isOptimizeMode = false;
2592
- // 如果是使用优化模式
2593
- if (scrollXLoad && allColumnFooterOverflow) {
2594
- if (spanMethod || footerSpanMethod) {
2595
- // 如果不支持优化模式
2596
- }
2597
- else {
2598
- isOptimizeMode = true;
2599
- }
2600
- }
2660
+ const isOptimizeMode = isFooterRenderOptimize;
2601
2661
  if (!isOptimizeMode || (!isColLoading && (fixedType || !overflowX))) {
2602
2662
  renderColumnList = visibleColumn;
2603
2663
  }
@@ -4014,6 +4074,7 @@ export default defineVxeComponent({
4014
4074
  * @returns
4015
4075
  */
4016
4076
  const handleVirtualTreeExpand = (rows, expanded) => {
4077
+ const { lastScrollLeft, lastScrollTop } = internalData;
4017
4078
  return handleBaseTreeExpand(rows, expanded).then(() => {
4018
4079
  handleVirtualTreeToList();
4019
4080
  $xeTable.handleTableData();
@@ -4021,9 +4082,9 @@ export default defineVxeComponent({
4021
4082
  updateAfterDataIndex();
4022
4083
  return nextTick();
4023
4084
  }).then(() => {
4024
- updateTreeLineStyle();
4025
- return handleLazyRecalculate(true, true, true);
4085
+ return handleRecalculateStyle(true, true, true);
4026
4086
  }).then(() => {
4087
+ restoreScrollLocation($xeTable, lastScrollLeft, lastScrollTop);
4027
4088
  updateTreeLineStyle();
4028
4089
  setTimeout(() => {
4029
4090
  $xeTable.updateCellAreas();
@@ -11698,7 +11759,7 @@ export default defineVxeComponent({
11698
11759
  },
11699
11760
  // 更新纵向 Y 可视渲染上下剩余空间大小
11700
11761
  updateScrollYSpace() {
11701
- const { isAllOverflow, overflowY, scrollYLoad, expandColumn } = reactData;
11762
+ const { isAllOverflow, overflowY, scrollYLoad, scrollYHeight, expandColumn } = reactData;
11702
11763
  const { scrollYStore, elemStore, isResizeCellHeight, afterFullData, fullAllDataRowIdData, rowExpandedMaps } = internalData;
11703
11764
  const $xeGanttView = internalData.xeGanttView;
11704
11765
  const { startIndex } = scrollYStore;
@@ -11713,13 +11774,13 @@ export default defineVxeComponent({
11713
11774
  const rightbodyTableElem = getRefElem(elemStore['right-body-table']);
11714
11775
  const containerList = ['main', 'left', 'right'];
11715
11776
  let ySpaceTop = 0;
11716
- let scrollYHeight = 0;
11777
+ let sYHeight = scrollYHeight;
11717
11778
  let isScrollYBig = false;
11718
11779
  if (scrollYLoad) {
11719
11780
  const isCustomCellHeight = isResizeCellHeight || cellOpts.height || rowOpts.height;
11720
11781
  if (!isCustomCellHeight && !expandColumn && isAllOverflow) {
11721
- scrollYHeight = afterFullData.length * defaultRowHeight;
11722
- if (scrollYHeight > maxYHeight) {
11782
+ sYHeight = afterFullData.length * defaultRowHeight;
11783
+ if (sYHeight > maxYHeight) {
11723
11784
  isScrollYBig = true;
11724
11785
  }
11725
11786
  ySpaceTop = Math.max(0, startIndex * defaultRowHeight);
@@ -11732,19 +11793,22 @@ export default defineVxeComponent({
11732
11793
  const lastRow = afterFullData[afterFullData.length - 1];
11733
11794
  rowid = getRowid($xeTable, lastRow);
11734
11795
  rowRest = fullAllDataRowIdData[rowid] || {};
11735
- scrollYHeight = (rowRest.oTop || 0) + (rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight);
11736
- // 是否展开行
11737
- if (expandColumn && rowExpandedMaps[rowid]) {
11738
- scrollYHeight += rowRest.expandHeight || expandOpts.height || 0;
11796
+ // 如果为空时还没计算完数据,保持原高度不变
11797
+ if (rowRest.oTop) {
11798
+ sYHeight = (rowRest.oTop || 0) + (rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight);
11799
+ // 是否展开行
11800
+ if (expandColumn && rowExpandedMaps[rowid]) {
11801
+ sYHeight += rowRest.expandHeight || expandOpts.height || 0;
11802
+ }
11739
11803
  }
11740
- if (scrollYHeight > maxYHeight) {
11804
+ if (sYHeight > maxYHeight) {
11741
11805
  isScrollYBig = true;
11742
11806
  }
11743
11807
  }
11744
11808
  }
11745
11809
  else {
11746
11810
  if (bodyTableElem) {
11747
- scrollYHeight = bodyTableElem.clientHeight;
11811
+ sYHeight = bodyTableElem.clientHeight;
11748
11812
  }
11749
11813
  }
11750
11814
  let clientHeight = 0;
@@ -11752,7 +11816,7 @@ export default defineVxeComponent({
11752
11816
  clientHeight = bodyScrollElem.clientHeight;
11753
11817
  }
11754
11818
  // 虚拟渲染
11755
- let ySpaceHeight = scrollYHeight;
11819
+ let ySpaceHeight = sYHeight;
11756
11820
  let scrollYTop = ySpaceTop;
11757
11821
  if (isScrollYBig) {
11758
11822
  // 触底
@@ -11794,7 +11858,7 @@ export default defineVxeComponent({
11794
11858
  rowExpandYSpaceEl.style.height = ySpaceHeight ? `${ySpaceHeight}px` : '';
11795
11859
  }
11796
11860
  reactData.scrollYTop = scrollYTop;
11797
- reactData.scrollYHeight = scrollYHeight;
11861
+ reactData.scrollYHeight = ySpaceHeight;
11798
11862
  reactData.isScrollYBig = isScrollYBig;
11799
11863
  calcScrollbar();
11800
11864
  if (isScrollYBig && mouseOpts.area) {
@@ -12945,12 +13009,12 @@ export default defineVxeComponent({
12945
13009
  if (props.resizable) {
12946
13010
  warnLog('vxe.error.delProp', ['resizable', 'column-config.resizable']);
12947
13011
  }
12948
- if (props.virtualXConfig && props.scrollX) {
12949
- warnLog('vxe.error.notSupportProp', ['virtual-x-config', 'scroll-x', 'scroll-x=null']);
12950
- }
12951
- if (props.virtualYConfig && props.scrollY) {
12952
- warnLog('vxe.error.notSupportProp', ['virtual-y-config', 'scroll-y', 'scroll-y=null']);
12953
- }
13012
+ // if (props.virtualXConfig && props.scrollX) {
13013
+ // warnLog('vxe.error.notSupportProp', ['virtual-x-config', 'scroll-x', 'scroll-x=null'])
13014
+ // }
13015
+ // if (props.virtualYConfig && props.scrollY) {
13016
+ // warnLog('vxe.error.notSupportProp', ['virtual-y-config', 'scroll-y', 'scroll-y=null'])
13017
+ // }
12954
13018
  if (props.aggregateConfig && props.rowGroupConfig) {
12955
13019
  warnLog('vxe.error.notSupportProp', ['aggregate-config', 'row-group-config', 'row-group-config=null']);
12956
13020
  }
package/es/ui/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { VxeUI } from '@vxe-ui/core';
2
2
  import { getFuncText } from './src/utils';
3
- export const version = "4.17.6";
3
+ export const version = "4.17.8";
4
4
  VxeUI.version = version;
5
5
  VxeUI.tableVersion = version;
6
6
  VxeUI.setConfig({
package/es/ui/src/log.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { VxeUI } from '@vxe-ui/core';
2
2
  const { log } = VxeUI;
3
- const version = `table v${"4.17.6"}`;
3
+ const version = `table v${"4.17.8"}`;
4
4
  export const warnLog = log.create('warn', version);
5
5
  export const errLog = log.create('error', version);