vxe-table 4.17.6 → 4.17.7

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 +109 -54
  7. package/es/ui/index.js +1 -1
  8. package/es/ui/src/log.js +1 -1
  9. package/lib/index.umd.js +55 -74
  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 +29 -18
  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 +109 -53
  32. /package/es/{iconfont.1761877377602.ttf → iconfont.1762136085329.ttf} +0 -0
  33. /package/es/{iconfont.1761877377602.woff → iconfont.1762136085329.woff} +0 -0
  34. /package/es/{iconfont.1761877377602.woff2 → iconfont.1762136085329.woff2} +0 -0
  35. /package/lib/{iconfont.1761877377602.ttf → iconfont.1762136085329.ttf} +0 -0
  36. /package/lib/{iconfont.1761877377602.woff → iconfont.1762136085329.woff} +0 -0
  37. /package/lib/{iconfont.1761877377602.woff2 → iconfont.1762136085329.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,
@@ -2338,8 +2413,8 @@ export default defineVxeComponent({
2338
2413
  updateAfterDataIndex();
2339
2414
  };
2340
2415
  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;
2416
+ const { mouseConfig } = props;
2417
+ const { isGroup, currentRow, tableColumn, overflowX, scrollbarWidth, overflowY, scrollbarHeight, scrollXWidth, columnStore, editStore, isColLoading } = reactData;
2343
2418
  const { visibleColumn, tableHeight, elemStore, customHeight, customMinHeight, customMaxHeight, tHeaderHeight, tFooterHeight } = internalData;
2344
2419
  const $xeGanttView = internalData.xeGanttView;
2345
2420
  const el = refElem.value;
@@ -2347,12 +2422,15 @@ export default defineVxeComponent({
2347
2422
  return;
2348
2423
  }
2349
2424
  const containerList = ['main', 'left', 'right'];
2425
+ const { leftList, rightList } = columnStore;
2350
2426
  let osbWidth = overflowY ? scrollbarWidth : 0;
2351
2427
  let osbHeight = overflowX ? scrollbarHeight : 0;
2352
2428
  const emptyPlaceholderElem = refEmptyPlaceholder.value;
2429
+ const isHeaderRenderOptimize = computeIsHeaderRenderOptimize.value;
2430
+ const isBodyRenderOptimize = computeIsBodyRenderOptimize.value;
2431
+ const isFooterRenderOptimize = computeIsFooterRenderOptimize.value;
2353
2432
  const scrollbarOpts = computeScrollbarOpts.value;
2354
2433
  const mouseOpts = computeMouseOpts.value;
2355
- const expandOpts = computeExpandOpts.value;
2356
2434
  const bodyWrapperElem = getRefElem(elemStore['main-body-wrapper']);
2357
2435
  const bodyTableElem = getRefElem(elemStore['main-body-table']);
2358
2436
  if (emptyPlaceholderElem) {
@@ -2470,7 +2548,7 @@ export default defineVxeComponent({
2470
2548
  let fixedColumn = [];
2471
2549
  let fixedWrapperElem;
2472
2550
  if (fixedType) {
2473
- fixedColumn = isFixedLeft ? columnStore.leftList : columnStore.rightList;
2551
+ fixedColumn = isFixedLeft ? leftList : rightList;
2474
2552
  fixedWrapperElem = isFixedLeft ? refLeftContainer.value : refRightContainer.value;
2475
2553
  }
2476
2554
  layoutList.forEach(layout => {
@@ -2481,20 +2559,11 @@ export default defineVxeComponent({
2481
2559
  // 表头体样式处理
2482
2560
  // 横向滚动渲染
2483
2561
  let renderColumnList = tableColumn;
2484
- let isOptimizeMode = false;
2562
+ const isOptimizeMode = isHeaderRenderOptimize;
2485
2563
  if (isGroup) {
2486
2564
  renderColumnList = visibleColumn;
2487
2565
  }
2488
2566
  else {
2489
- // 如果是使用优化模式
2490
- if (scrollXLoad && allColumnHeaderOverflow) {
2491
- if (spanMethod || footerSpanMethod) {
2492
- // 如果不支持优化模式
2493
- }
2494
- else {
2495
- isOptimizeMode = true;
2496
- }
2497
- }
2498
2567
  if (!isOptimizeMode || (!isColLoading && (fixedType || !overflowX))) {
2499
2568
  renderColumnList = visibleColumn;
2500
2569
  }
@@ -2547,16 +2616,7 @@ export default defineVxeComponent({
2547
2616
  fixedWrapperElem.style.width = `${fixedColumn.reduce((previous, column) => previous + column.renderWidth, 0)}px`;
2548
2617
  }
2549
2618
  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
- }
2619
+ const isOptimizeMode = isBodyRenderOptimize;
2560
2620
  if (fixedType) {
2561
2621
  renderColumnList = visibleColumn;
2562
2622
  if (isOptimizeMode) {
@@ -2588,16 +2648,7 @@ export default defineVxeComponent({
2588
2648
  }
2589
2649
  else if (layout === 'footer') {
2590
2650
  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
- }
2651
+ const isOptimizeMode = isFooterRenderOptimize;
2601
2652
  if (!isOptimizeMode || (!isColLoading && (fixedType || !overflowX))) {
2602
2653
  renderColumnList = visibleColumn;
2603
2654
  }
@@ -4014,6 +4065,7 @@ export default defineVxeComponent({
4014
4065
  * @returns
4015
4066
  */
4016
4067
  const handleVirtualTreeExpand = (rows, expanded) => {
4068
+ const { lastScrollLeft, lastScrollTop } = internalData;
4017
4069
  return handleBaseTreeExpand(rows, expanded).then(() => {
4018
4070
  handleVirtualTreeToList();
4019
4071
  $xeTable.handleTableData();
@@ -4021,9 +4073,9 @@ export default defineVxeComponent({
4021
4073
  updateAfterDataIndex();
4022
4074
  return nextTick();
4023
4075
  }).then(() => {
4024
- updateTreeLineStyle();
4025
- return handleLazyRecalculate(true, true, true);
4076
+ return handleRecalculateStyle(true, true, true);
4026
4077
  }).then(() => {
4078
+ restoreScrollLocation($xeTable, lastScrollLeft, lastScrollTop);
4027
4079
  updateTreeLineStyle();
4028
4080
  setTimeout(() => {
4029
4081
  $xeTable.updateCellAreas();
@@ -11698,7 +11750,7 @@ export default defineVxeComponent({
11698
11750
  },
11699
11751
  // 更新纵向 Y 可视渲染上下剩余空间大小
11700
11752
  updateScrollYSpace() {
11701
- const { isAllOverflow, overflowY, scrollYLoad, expandColumn } = reactData;
11753
+ const { isAllOverflow, overflowY, scrollYLoad, scrollYHeight, expandColumn } = reactData;
11702
11754
  const { scrollYStore, elemStore, isResizeCellHeight, afterFullData, fullAllDataRowIdData, rowExpandedMaps } = internalData;
11703
11755
  const $xeGanttView = internalData.xeGanttView;
11704
11756
  const { startIndex } = scrollYStore;
@@ -11713,13 +11765,13 @@ export default defineVxeComponent({
11713
11765
  const rightbodyTableElem = getRefElem(elemStore['right-body-table']);
11714
11766
  const containerList = ['main', 'left', 'right'];
11715
11767
  let ySpaceTop = 0;
11716
- let scrollYHeight = 0;
11768
+ let sYHeight = scrollYHeight;
11717
11769
  let isScrollYBig = false;
11718
11770
  if (scrollYLoad) {
11719
11771
  const isCustomCellHeight = isResizeCellHeight || cellOpts.height || rowOpts.height;
11720
11772
  if (!isCustomCellHeight && !expandColumn && isAllOverflow) {
11721
- scrollYHeight = afterFullData.length * defaultRowHeight;
11722
- if (scrollYHeight > maxYHeight) {
11773
+ sYHeight = afterFullData.length * defaultRowHeight;
11774
+ if (sYHeight > maxYHeight) {
11723
11775
  isScrollYBig = true;
11724
11776
  }
11725
11777
  ySpaceTop = Math.max(0, startIndex * defaultRowHeight);
@@ -11732,19 +11784,22 @@ export default defineVxeComponent({
11732
11784
  const lastRow = afterFullData[afterFullData.length - 1];
11733
11785
  rowid = getRowid($xeTable, lastRow);
11734
11786
  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;
11787
+ // 如果为空时还没计算完数据,保持原高度不变
11788
+ if (rowRest.oTop) {
11789
+ sYHeight = (rowRest.oTop || 0) + (rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight);
11790
+ // 是否展开行
11791
+ if (expandColumn && rowExpandedMaps[rowid]) {
11792
+ sYHeight += rowRest.expandHeight || expandOpts.height || 0;
11793
+ }
11739
11794
  }
11740
- if (scrollYHeight > maxYHeight) {
11795
+ if (sYHeight > maxYHeight) {
11741
11796
  isScrollYBig = true;
11742
11797
  }
11743
11798
  }
11744
11799
  }
11745
11800
  else {
11746
11801
  if (bodyTableElem) {
11747
- scrollYHeight = bodyTableElem.clientHeight;
11802
+ sYHeight = bodyTableElem.clientHeight;
11748
11803
  }
11749
11804
  }
11750
11805
  let clientHeight = 0;
@@ -11752,7 +11807,7 @@ export default defineVxeComponent({
11752
11807
  clientHeight = bodyScrollElem.clientHeight;
11753
11808
  }
11754
11809
  // 虚拟渲染
11755
- let ySpaceHeight = scrollYHeight;
11810
+ let ySpaceHeight = sYHeight;
11756
11811
  let scrollYTop = ySpaceTop;
11757
11812
  if (isScrollYBig) {
11758
11813
  // 触底
@@ -11794,7 +11849,7 @@ export default defineVxeComponent({
11794
11849
  rowExpandYSpaceEl.style.height = ySpaceHeight ? `${ySpaceHeight}px` : '';
11795
11850
  }
11796
11851
  reactData.scrollYTop = scrollYTop;
11797
- reactData.scrollYHeight = scrollYHeight;
11852
+ reactData.scrollYHeight = ySpaceHeight;
11798
11853
  reactData.isScrollYBig = isScrollYBig;
11799
11854
  calcScrollbar();
11800
11855
  if (isScrollYBig && mouseOpts.area) {
@@ -12945,12 +13000,12 @@ export default defineVxeComponent({
12945
13000
  if (props.resizable) {
12946
13001
  warnLog('vxe.error.delProp', ['resizable', 'column-config.resizable']);
12947
13002
  }
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
- }
13003
+ // if (props.virtualXConfig && props.scrollX) {
13004
+ // warnLog('vxe.error.notSupportProp', ['virtual-x-config', 'scroll-x', 'scroll-x=null'])
13005
+ // }
13006
+ // if (props.virtualYConfig && props.scrollY) {
13007
+ // warnLog('vxe.error.notSupportProp', ['virtual-y-config', 'scroll-y', 'scroll-y=null'])
13008
+ // }
12954
13009
  if (props.aggregateConfig && props.rowGroupConfig) {
12955
13010
  warnLog('vxe.error.notSupportProp', ['aggregate-config', 'row-group-config', 'row-group-config=null']);
12956
13011
  }
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.7";
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.7"}`;
4
4
  export const warnLog = log.create('warn', version);
5
5
  export const errLog = log.create('error', version);