vxe-table 4.23.0-beta.0 → 4.23.0-beta.2

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 (58) hide show
  1. package/README.md +2 -2
  2. package/dist/all.esm.js +540 -103
  3. package/dist/style.css +1 -1
  4. package/dist/style.min.css +1 -1
  5. package/es/index.css +1 -1
  6. package/es/index.min.css +1 -1
  7. package/es/locale/lang/fr-FR.js +29 -29
  8. package/es/style.css +1 -1
  9. package/es/style.min.css +1 -1
  10. package/es/table/src/props.js +9 -1
  11. package/es/table/src/scrollbar.js +54 -0
  12. package/es/table/src/table.js +458 -89
  13. package/es/table/src/util.js +11 -2
  14. package/es/table/style.css +30 -0
  15. package/es/table/style.min.css +1 -1
  16. package/es/ui/index.js +9 -11
  17. package/es/ui/src/log.js +1 -1
  18. package/es/vxe-table/style.css +30 -0
  19. package/es/vxe-table/style.min.css +1 -1
  20. package/lib/index.css +1 -1
  21. package/lib/index.min.css +1 -1
  22. package/lib/index.umd.js +118 -38
  23. package/lib/index.umd.min.js +1 -1
  24. package/lib/locale/lang/fr-FR.js +29 -29
  25. package/lib/locale/lang/fr-FR.min.js +1 -1
  26. package/lib/locale/lang/fr-FR.umd.js +29 -29
  27. package/lib/style.css +1 -1
  28. package/lib/style.min.css +1 -1
  29. package/lib/table/src/props.js +9 -1
  30. package/lib/table/src/props.min.js +1 -1
  31. package/lib/table/src/scrollbar.js +63 -0
  32. package/lib/table/src/scrollbar.min.js +1 -0
  33. package/lib/table/src/table.js +33 -23
  34. package/lib/table/src/table.min.js +1 -1
  35. package/lib/table/src/util.js +11 -2
  36. package/lib/table/src/util.min.js +1 -1
  37. package/lib/table/style/style.css +30 -0
  38. package/lib/table/style/style.min.css +1 -1
  39. package/lib/ui/index.js +9 -11
  40. package/lib/ui/index.min.js +1 -1
  41. package/lib/ui/src/log.js +1 -1
  42. package/lib/ui/src/log.min.js +1 -1
  43. package/lib/vxe-table/style/style.css +30 -0
  44. package/lib/vxe-table/style/style.min.css +1 -1
  45. package/package.json +2 -2
  46. package/packages/locale/lang/fr-FR.ts +903 -903
  47. package/packages/table/src/props.ts +9 -1
  48. package/packages/table/src/scrollbar.ts +57 -0
  49. package/packages/table/src/table.ts +494 -91
  50. package/packages/table/src/util.ts +15 -2
  51. package/packages/ui/index.ts +8 -10
  52. package/styles/components/table.scss +65 -0
  53. /package/es/{iconfont.1791880428511.ttf → iconfont.1792035024476.ttf} +0 -0
  54. /package/es/{iconfont.1791880428511.woff → iconfont.1792035024476.woff} +0 -0
  55. /package/es/{iconfont.1791880428511.woff2 → iconfont.1792035024476.woff2} +0 -0
  56. /package/lib/{iconfont.1791880428511.ttf → iconfont.1792035024476.ttf} +0 -0
  57. /package/lib/{iconfont.1791880428511.woff → iconfont.1792035024476.woff} +0 -0
  58. /package/lib/{iconfont.1791880428511.woff2 → iconfont.1792035024476.woff2} +0 -0
package/dist/all.esm.js CHANGED
@@ -56,7 +56,7 @@ function getDefaultConfig(val1, def1) {
56
56
  return XEUtils.eqNull(val1) ? def1 : val1;
57
57
  }
58
58
 
59
- const version = "4.23.0-beta.0";
59
+ const version = "4.23.0-beta.2";
60
60
  VxeUI.version = version;
61
61
  VxeUI.tableVersion = version;
62
62
  VxeUI.setConfig({
@@ -318,16 +318,14 @@ VxeUI.setConfig({
318
318
  oSize: 0
319
319
  },
320
320
  scrollbarConfig: {
321
- // width: 14,
322
- // height: 14,
323
- x: {
324
- // position: 'bottom',
325
- visible: true
326
- },
327
- y: {
328
- // position: 'right',
329
- visible: true
330
- }
321
+ // xConfig: {
322
+ // // position: 'bottom',
323
+ // // visible: true
324
+ // },
325
+ // yConfig: {
326
+ // // position: 'right',
327
+ // // visible: true
328
+ // }
331
329
  },
332
330
  undoRedoHistoryConfig: {
333
331
  stackSize: 50
@@ -940,7 +938,7 @@ function getPopupWrapperElement(panelElem) {
940
938
  }
941
939
 
942
940
  const { log } = VxeUI;
943
- const tableVersion = `table v${"4.23.0-beta.0"}`;
941
+ const tableVersion = `table v${"4.23.0-beta.2"}`;
944
942
  function createComponentLog(name) {
945
943
  const uiVersion = VxeUI.uiVersion ? `ui v${VxeUI.uiVersion}` : '';
946
944
  const ganttVersion = VxeUI.ganttVersion ? `gantt v${VxeUI.ganttVersion}` : '';
@@ -1192,9 +1190,15 @@ function createInternalData$3() {
1192
1190
  // 当前行
1193
1191
  currentRow: null,
1194
1192
  currentCol: null,
1195
- // 最后滚动位置
1196
- lastScrollLeft: 0,
1193
+ // resizeObserver: undefined,
1194
+ // 滚动条
1195
+ // scrollObserver: undefined,
1196
+ // isThumbDrag: false,
1197
+ thumbDragOffset: 0,
1198
+ yThumbTop: 0,
1199
+ xThumbLeft: 0,
1197
1200
  lastScrollTop: 0,
1201
+ lastScrollLeft: 0,
1198
1202
  // 单选框属性,已选中保留的行
1199
1203
  radioReserveRow: null,
1200
1204
  // 复选框属性,已选中保留的行集合
@@ -1327,6 +1331,9 @@ function createReactData$2() {
1327
1331
  scrollbarWidth: 0,
1328
1332
  // 横向滚动条的高度
1329
1333
  scrollbarHeight: 0,
1334
+ // 滚动条
1335
+ yThumbHeight: 0,
1336
+ xThumbWidth: 0,
1330
1337
  // 行高
1331
1338
  rowHeight: 0,
1332
1339
  // 表格父容器的高度
@@ -3852,7 +3859,10 @@ const tableProps = {
3852
3859
  type: Boolean,
3853
3860
  default: () => getConfig$7().table.highlightCurrentRow
3854
3861
  },
3855
- // (即将废弃)鼠标移到行是否要高亮显示
3862
+ /**
3863
+ * (即将废弃)鼠标移到行是否要高亮显示
3864
+ * @deprecated
3865
+ */
3856
3866
  highlightHoverRow: {
3857
3867
  type: Boolean,
3858
3868
  default: () => getConfig$7().table.highlightHoverRow
@@ -4075,6 +4085,10 @@ const tableProps = {
4075
4085
  virtualXConfig: Object,
4076
4086
  // 纵向虚拟滚动配置项
4077
4087
  virtualYConfig: Object,
4088
+ useScrollbar: {
4089
+ type: Boolean,
4090
+ default: () => getDefaultConfig(getConfig$7().table.useScrollbar, getConfig$7().useScrollbar)
4091
+ },
4078
4092
  // 滚动条配置项
4079
4093
  scrollbarConfig: Object,
4080
4094
  // 撤销/恢复历史配置项
@@ -4285,6 +4299,61 @@ function clearColAnimate(elem, clss) {
4285
4299
  }, 500);
4286
4300
  }
4287
4301
 
4302
+ /**
4303
+ * 计算滚动条滑块的长度
4304
+ */
4305
+ function getThumbSize(viewportSize, contentSize, trackSize) {
4306
+ if (contentSize <= viewportSize) {
4307
+ return 0;
4308
+ }
4309
+ const ratio = viewportSize / contentSize;
4310
+ const ideal = trackSize * ratio;
4311
+ return Math.max(20, Math.min(ideal, trackSize));
4312
+ }
4313
+ /**
4314
+ * 计算滚动条滑块的偏移位置
4315
+ */
4316
+ function getThumbOffsetSize(offsetSize, viewportSize, contentSize, trackSize, thumbSize) {
4317
+ const maxScroll = contentSize - viewportSize;
4318
+ if (maxScroll <= 0) {
4319
+ return 0;
4320
+ }
4321
+ const maxThumbOffset = trackSize - thumbSize;
4322
+ if (maxThumbOffset <= 0) {
4323
+ return 0;
4324
+ }
4325
+ const clamped = Math.min(Math.max(offsetSize, 0), maxScroll);
4326
+ const ratio = clamped / maxScroll;
4327
+ return ratio * maxThumbOffset;
4328
+ }
4329
+ /**
4330
+ * 根据点击轨道的位置,计算滑块的偏移位置
4331
+ */
4332
+ function getScrollFromClick(clickPosition, viewportSize, contentSize, trackSize, thumbSize) {
4333
+ const maxThumbOffset = trackSize - thumbSize;
4334
+ const maxScroll = contentSize - viewportSize;
4335
+ if (maxScroll <= 0 || maxThumbOffset <= 0) {
4336
+ return 0;
4337
+ }
4338
+ let thumbOffset = clickPosition - thumbSize / 2;
4339
+ thumbOffset = Math.min(Math.max(thumbOffset, 0), maxThumbOffset);
4340
+ const scrollOffset = (thumbOffset / maxThumbOffset) * maxScroll;
4341
+ return scrollOffset;
4342
+ }
4343
+ /**
4344
+ * 拖拽 thumb 时,根据鼠标位置计算滑块的偏移位置
4345
+ */
4346
+ function getScrollFromDrag(pointerPosition, dragOffset, viewportSize, contentSize, trackSize, thumbSize) {
4347
+ const maxScroll = contentSize - viewportSize;
4348
+ const maxThumbOffset = trackSize - thumbSize;
4349
+ if (maxScroll <= 0 || maxThumbOffset <= 0) {
4350
+ return 0;
4351
+ }
4352
+ let thumbOffset = pointerPosition - dragOffset;
4353
+ thumbOffset = Math.min(Math.max(thumbOffset, 0), maxThumbOffset);
4354
+ return (thumbOffset / maxThumbOffset) * maxScroll;
4355
+ }
4356
+
4288
4357
  // 跨表拖拽
4289
4358
  const crossTableDragRowInfo = reactive({
4290
4359
  row: null
@@ -15974,7 +16043,7 @@ renderer$2.mixin({
15974
16043
  });
15975
16044
 
15976
16045
  const { warnLog: warnLog$2, errLog: errLog$2 } = createComponentLog('table');
15977
- const { getConfig: getConfig$2, getIcon: getIcon$1, getI18n: getI18n$2, renderer: renderer$1, formats, createEvent: createEvent$2, globalResize, interceptor, hooks: hooks$1, globalEvents: globalEvents$1, GLOBAL_EVENT_KEYS: GLOBAL_EVENT_KEYS$1, useFns: useFns$2, renderEmptyElement: renderEmptyElement$1 } = VxeUI;
16046
+ const { getConfig: getConfig$2, getIcon: getIcon$1, getI18n: getI18n$2, renderer: renderer$1, formats, createEvent: createEvent$2, globalResize, interceptor, hooks: hooks$1, domUtils, globalEvents: globalEvents$1, GLOBAL_EVENT_KEYS: GLOBAL_EVENT_KEYS$1, useFns: useFns$2, renderEmptyElement: renderEmptyElement$1 } = VxeUI;
15978
16047
  const supportMaxRow = 5e6;
15979
16048
  const customStorageKey = 'VXE_CUSTOM_STORE';
15980
16049
  const maxYHeight = 5e6;
@@ -15989,6 +16058,7 @@ var VxeTableComponent = defineVxeComponent({
15989
16058
  const { slots, emit } = context;
15990
16059
  const xID = XEUtils.uniqueId();
15991
16060
  const browseObj = XEUtils.browse();
16061
+ const scrollDefaultConf = Object.assign({}, getConfig$2().scrollbar);
15992
16062
  // 使用已安装的组件,如果未安装则不渲染
15993
16063
  const VxeUILoadingComponent = VxeUI.getComponent('VxeLoading');
15994
16064
  const VxeUITooltipComponent = VxeUI.getComponent('VxeTooltip');
@@ -16048,6 +16118,10 @@ var VxeTableComponent = defineVxeComponent({
16048
16118
  const refScrollYBottomCornerElem = ref();
16049
16119
  const refScrollXSpaceElem = ref();
16050
16120
  const refScrollYSpaceElem = ref();
16121
+ const refTrackXElem = ref();
16122
+ const refTrackYElem = ref();
16123
+ const refThumbXElem = ref();
16124
+ const refThumbYElem = ref();
16051
16125
  let $xeToolbar;
16052
16126
  const computeTableId = computed(() => {
16053
16127
  const { id } = props;
@@ -16131,14 +16205,42 @@ var VxeTableComponent = defineVxeComponent({
16131
16205
  return Object.assign({}, getConfig$2().table.scrollbarConfig, props.scrollbarConfig);
16132
16206
  });
16133
16207
  const computeScrollbarXOpts = computed(() => {
16134
- var _a;
16135
16208
  const scrollbarOpts = computeScrollbarOpts.value;
16136
- return Object.assign({}, scrollbarOpts.x, ((_a = props.scrollbarConfig) === null || _a === void 0 ? void 0 : _a.x) || {});
16209
+ return scrollbarOpts.x ? Object.assign({}, scrollbarOpts.x, scrollbarOpts.xConfig) : (scrollbarOpts.xConfig || {});
16137
16210
  });
16138
16211
  const computeScrollbarYOpts = computed(() => {
16139
- var _a;
16140
16212
  const scrollbarOpts = computeScrollbarOpts.value;
16141
- return Object.assign({}, scrollbarOpts.y, ((_a = props.scrollbarConfig) === null || _a === void 0 ? void 0 : _a.y) || {});
16213
+ return scrollbarOpts.y ? Object.assign({}, scrollbarOpts.y, scrollbarOpts.yConfig) : (scrollbarOpts.yConfig || {});
16214
+ });
16215
+ const computeScrollXHeight = computed(() => {
16216
+ const scrollbarOpts = computeScrollbarOpts.value;
16217
+ const scrollbarXOpts = computeScrollbarXOpts.value;
16218
+ return XEUtils.toNumber(getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), scrollDefaultConf.height));
16219
+ });
16220
+ const computeScrollYWidth = computed(() => {
16221
+ const scrollbarOpts = computeScrollbarOpts.value;
16222
+ const scrollbarYOpts = computeScrollbarYOpts.value;
16223
+ return XEUtils.toNumber(getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), scrollDefaultConf.width));
16224
+ });
16225
+ const computeScrollXVisible = computed(() => {
16226
+ const scrollbarOpts = computeScrollbarOpts.value;
16227
+ const scrollbarXOpts = computeScrollbarXOpts.value;
16228
+ return getDefaultConfig(scrollbarXOpts.visible, scrollbarOpts.visible);
16229
+ });
16230
+ const computeScrollYVisible = computed(() => {
16231
+ const scrollbarOpts = computeScrollbarOpts.value;
16232
+ const scrollbarYOpts = computeScrollbarYOpts.value;
16233
+ return getDefaultConfig(scrollbarYOpts.visible, scrollbarOpts.visible);
16234
+ });
16235
+ const computeScrollXAutoHide = computed(() => {
16236
+ const scrollbarOpts = computeScrollbarOpts.value;
16237
+ const scrollbarXOpts = computeScrollbarXOpts.value;
16238
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), scrollDefaultConf.autoHide);
16239
+ });
16240
+ const computeScrollYAutoHide = computed(() => {
16241
+ const scrollbarOpts = computeScrollbarOpts.value;
16242
+ const scrollbarYOpts = computeScrollbarYOpts.value;
16243
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), scrollDefaultConf.autoHide);
16142
16244
  });
16143
16245
  const computeScrollbarXToTop = computed(() => {
16144
16246
  const scrollbarXOpts = computeScrollbarXOpts.value;
@@ -16148,6 +16250,23 @@ var VxeTableComponent = defineVxeComponent({
16148
16250
  const scrollbarYOpts = computeScrollbarYOpts.value;
16149
16251
  return scrollbarYOpts.position === 'left';
16150
16252
  });
16253
+ const computeScrollbarWrapperClss = computed(() => {
16254
+ const { yThumbHeight, xThumbWidth } = reactData;
16255
+ const scrollbarXToTop = computeScrollbarXToTop.value;
16256
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
16257
+ const scrollXVisible = computeScrollXVisible.value;
16258
+ const scrollYVisible = computeScrollYVisible.value;
16259
+ return domUtils.buildClass([
16260
+ 'vxe-scrollbar is--virtual',
16261
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
16262
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
16263
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
16264
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
16265
+ ], {
16266
+ 'overflow-y': yThumbHeight,
16267
+ 'overflow-x': xThumbWidth
16268
+ });
16269
+ });
16151
16270
  const computeScrollYThreshold = computed(() => {
16152
16271
  const virtualYOpts = computeVirtualYOpts.value;
16153
16272
  const { threshold } = virtualYOpts;
@@ -16177,6 +16296,10 @@ var VxeTableComponent = defineVxeComponent({
16177
16296
  }
16178
16297
  return cellOpts;
16179
16298
  });
16299
+ const computeCellHeitht = computed(() => {
16300
+ const cellOpts = computeCellOpts.value;
16301
+ return cellOpts.height;
16302
+ });
16180
16303
  const computeHeaderCellOpts = computed(() => {
16181
16304
  const headerCellOpts = Object.assign({}, getConfig$2().table.headerCellConfig, props.headerCellConfig);
16182
16305
  const defaultRowHeight = computeDefaultRowHeight.value;
@@ -16476,16 +16599,16 @@ var VxeTableComponent = defineVxeComponent({
16476
16599
  return '';
16477
16600
  });
16478
16601
  const computeTableStyle = computed(() => {
16479
- const scrollbarOpts = computeScrollbarOpts.value;
16480
- const { width, height } = scrollbarOpts;
16481
- const tStys = {};
16482
- if (width) {
16483
- tStys['--vxe-ui-table-view-scrollbar-width'] = toCssUnit(width);
16484
- }
16485
- if (height) {
16486
- tStys['--vxe-ui-table-view-scrollbar-height'] = toCssUnit(height);
16602
+ const barWidth = computeScrollYWidth.value;
16603
+ const barHeight = computeScrollXHeight.value;
16604
+ const stys = {};
16605
+ if (barWidth || barHeight) {
16606
+ stys['--vxe-ui-table-view-scrollbar-width'] = toCssUnit(barWidth || barHeight);
16607
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight);
16608
+ stys['--vxe-ui-table-view-scrollbar-height'] = toCssUnit(barHeight || barWidth);
16609
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth);
16487
16610
  }
16488
- return tStys;
16611
+ return stys;
16489
16612
  });
16490
16613
  const computeTableRowExpandedList = computed(() => {
16491
16614
  const { tableData, rowExpandedFlag, expandColumn, rowGroupExpandedFlag, treeExpandedFlag } = reactData;
@@ -16673,8 +16796,15 @@ var VxeTableComponent = defineVxeComponent({
16673
16796
  computeScrollbarOpts,
16674
16797
  computeScrollbarXOpts,
16675
16798
  computeScrollbarYOpts,
16799
+ computeScrollXHeight,
16800
+ computeScrollYWidth,
16801
+ computeScrollXVisible,
16802
+ computeScrollYVisible,
16803
+ computeScrollXAutoHide,
16804
+ computeScrollYAutoHide,
16676
16805
  computeScrollbarXToTop,
16677
16806
  computeScrollbarYToLeft,
16807
+ computeScrollbarWrapperClss,
16678
16808
  computeColumnOpts,
16679
16809
  computeCurrentColumnOpts,
16680
16810
  computeScrollXThreshold,
@@ -17791,14 +17921,6 @@ var VxeTableComponent = defineVxeComponent({
17791
17921
  if (!bodyWrapperElem) {
17792
17922
  return;
17793
17923
  }
17794
- const yHandleEl = refScrollYHandleElem.value;
17795
- if (!yHandleEl) {
17796
- return;
17797
- }
17798
- const xHandleEl = refScrollXHandleElem.value;
17799
- if (!xHandleEl) {
17800
- return;
17801
- }
17802
17924
  const columnOpts = computeColumnOpts.value;
17803
17925
  let tWidth = 0;
17804
17926
  const minCellWidth = 40; // 列宽最少限制 40px
@@ -18391,7 +18513,6 @@ var VxeTableComponent = defineVxeComponent({
18391
18513
  const isHeaderRenderOptimize = computeIsHeaderRenderOptimize.value;
18392
18514
  const isBodyRenderOptimize = computeIsBodyRenderOptimize.value;
18393
18515
  const isFooterRenderOptimize = computeIsFooterRenderOptimize.value;
18394
- const scrollbarOpts = computeScrollbarOpts.value;
18395
18516
  const mouseOpts = computeMouseOpts.value;
18396
18517
  const bodyWrapperElem = getRefElem(elemStore['main-body-wrapper']);
18397
18518
  const bodyTableElem = getRefElem(elemStore['main-body-table']);
@@ -18399,24 +18520,26 @@ var VxeTableComponent = defineVxeComponent({
18399
18520
  emptyPlaceholderElem.style.top = `${tHeaderHeight}px`;
18400
18521
  emptyPlaceholderElem.style.height = bodyWrapperElem ? `${bodyWrapperElem.offsetHeight - osbHeight}px` : '';
18401
18522
  }
18402
- const scrollbarXConf = scrollbarOpts.x || {};
18403
- const scrollbarYConf = scrollbarOpts.y || {};
18523
+ const scrollXVisible = computeScrollXVisible.value;
18524
+ const scrollYVisible = computeScrollYVisible.value;
18404
18525
  const scrollbarYToLeft = computeScrollbarYToLeft.value;
18405
18526
  let xScrollbarVisible = overflowX ? 'visible' : 'hidden';
18406
- if (scrollbarXConf.visible === 'visible' || $xeGanttView) {
18527
+ const hideXScroll = scrollXVisible === false || scrollXVisible === 'hidden';
18528
+ if (scrollXVisible === 'visible' || $xeGanttView) {
18407
18529
  osbHeight = scrollbarHeight;
18408
18530
  xScrollbarVisible = 'visible';
18409
18531
  }
18410
- else if (scrollbarXConf.visible === 'hidden' || scrollbarXConf.visible === false) {
18532
+ else if (hideXScroll) {
18411
18533
  osbHeight = 0;
18412
18534
  xScrollbarVisible = 'hidden';
18413
18535
  }
18414
18536
  let yScrollbarVisible = overflowY ? 'visible' : 'hidden';
18415
- if ((scrollbarYConf.visible === 'hidden' || scrollbarYConf.visible === false) || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
18537
+ const hideYScroll = scrollYVisible === false || scrollYVisible === 'hidden';
18538
+ if (hideYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
18416
18539
  osbWidth = 0;
18417
18540
  yScrollbarVisible = 'hidden';
18418
18541
  }
18419
- else if (scrollbarYConf.visible === 'visible') {
18542
+ else if (scrollYVisible === 'visible') {
18420
18543
  osbWidth = scrollbarWidth;
18421
18544
  yScrollbarVisible = 'visible';
18422
18545
  }
@@ -19224,7 +19347,6 @@ var VxeTableComponent = defineVxeComponent({
19224
19347
  const calcScrollbar = () => {
19225
19348
  const { scrollXWidth, scrollYHeight } = reactData;
19226
19349
  const { elemStore } = internalData;
19227
- const scrollbarOpts = computeScrollbarOpts.value;
19228
19350
  const el = refElem.value;
19229
19351
  if (!el || !el.clientWidth) {
19230
19352
  return;
@@ -19234,17 +19356,30 @@ var VxeTableComponent = defineVxeComponent({
19234
19356
  const footerTableElem = getRefElem(elemStore['main-footer-table']);
19235
19357
  const xHandleEl = refScrollXHandleElem.value;
19236
19358
  const yHandleEl = refScrollYHandleElem.value;
19359
+ const thumbXElem = refThumbXElem.value;
19360
+ const thumbYElem = refThumbYElem.value;
19237
19361
  let overflowY = false;
19238
19362
  let overflowX = false;
19239
19363
  if (bodyWrapperElem) {
19364
+ const scrollbarOpts = computeScrollbarOpts.value;
19365
+ const barWidth = computeScrollYWidth.value;
19366
+ const barHeight = computeScrollXHeight.value;
19240
19367
  overflowY = scrollYHeight > bodyWrapperElem.clientHeight;
19241
- if (yHandleEl) {
19242
- reactData.scrollbarWidth = scrollbarOpts.width || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14;
19368
+ // 如果是虚拟滚动条
19369
+ if (thumbYElem) {
19370
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbYElem.offsetWidth : 0;
19371
+ }
19372
+ else if (yHandleEl) {
19373
+ reactData.scrollbarWidth = (barWidth || barHeight) || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14;
19243
19374
  }
19244
19375
  reactData.overflowY = overflowY;
19245
19376
  overflowX = scrollXWidth > bodyWrapperElem.clientWidth;
19246
- if (xHandleEl) {
19247
- reactData.scrollbarHeight = scrollbarOpts.height || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14;
19377
+ // 如果是虚拟滚动条
19378
+ if (thumbXElem) {
19379
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbXElem.offsetHeight : 0;
19380
+ }
19381
+ else if (xHandleEl) {
19382
+ reactData.scrollbarHeight = (barHeight || barWidth) || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14;
19248
19383
  }
19249
19384
  const hHeight = headerTableElem ? headerTableElem.clientHeight : 0;
19250
19385
  const fHeight = footerTableElem ? footerTableElem.clientHeight : 0;
@@ -19310,6 +19445,10 @@ var VxeTableComponent = defineVxeComponent({
19310
19445
  }
19311
19446
  });
19312
19447
  };
19448
+ const updateScrollbar = () => {
19449
+ updateThumbSize();
19450
+ updateThumbOffset();
19451
+ };
19313
19452
  const defaultMinRunDelay = 50;
19314
19453
  const handleLazyRecalculate = (reFull, reWidth, reHeight, options) => {
19315
19454
  const minRunDelay = (options ? options.minRunDelay : defaultMinRunDelay) || defaultMinRunDelay;
@@ -19330,6 +19469,7 @@ var VxeTableComponent = defineVxeComponent({
19330
19469
  const refreshDelay = resizeOpts.refreshDelay || 30;
19331
19470
  const reDelay = rceDelay + refreshDelay;
19332
19471
  const el = refElem.value;
19472
+ updateScrollbar();
19333
19473
  if (el && el.clientWidth) {
19334
19474
  autoCellWidth();
19335
19475
  updateRowExpandStyle();
@@ -27331,6 +27471,18 @@ var VxeTableComponent = defineVxeComponent({
27331
27471
  }
27332
27472
  return nextTick();
27333
27473
  },
27474
+ /**
27475
+ * @private
27476
+ */
27477
+ updateScrollbar() {
27478
+ return updateScrollbar();
27479
+ },
27480
+ /**
27481
+ * @private
27482
+ */
27483
+ updateThumbOffset() {
27484
+ return updateThumbOffset();
27485
+ },
27334
27486
  /**
27335
27487
  * 表头单元格按下事件
27336
27488
  */
@@ -28478,19 +28630,18 @@ var VxeTableComponent = defineVxeComponent({
28478
28630
  },
28479
28631
  handleScrollEvent(evnt, isRollY, isRollX, scrollTop, scrollLeft, params) {
28480
28632
  const { highlightHoverRow } = props;
28481
- const { lastScrollLeft, lastScrollTop } = internalData;
28482
- const xHandleEl = refScrollXHandleElem.value;
28483
- const yHandleEl = refScrollYHandleElem.value;
28484
- if (!xHandleEl || !yHandleEl) {
28633
+ const { elemStore, lastScrollLeft, lastScrollTop } = internalData;
28634
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll']);
28635
+ if (!bodyScrollElem) {
28485
28636
  return;
28486
28637
  }
28487
28638
  const rowOpts = computeRowOpts.value;
28488
28639
  const validTip = refValidTooltip.value;
28489
28640
  const tooltip = refTooltip.value;
28490
- const bodyHeight = yHandleEl.clientHeight;
28491
- const bodyWidth = xHandleEl.clientWidth;
28492
- const scrollHeight = yHandleEl.scrollHeight;
28493
- const scrollWidth = xHandleEl.scrollWidth;
28641
+ const bodyHeight = bodyScrollElem.clientHeight;
28642
+ const bodyWidth = bodyScrollElem.clientWidth;
28643
+ const scrollHeight = bodyScrollElem.scrollHeight;
28644
+ const scrollWidth = bodyScrollElem.scrollWidth;
28494
28645
  let isTop = false;
28495
28646
  let isBottom = false;
28496
28647
  let isLeft = false;
@@ -28552,6 +28703,7 @@ var VxeTableComponent = defineVxeComponent({
28552
28703
  isLeft,
28553
28704
  isRight,
28554
28705
  direction }, params);
28706
+ updateThumbOffset();
28555
28707
  updateRowExpandStyle();
28556
28708
  checkLastSyncScroll(isRollX, isRollY);
28557
28709
  if (isRollX) {
@@ -28596,6 +28748,7 @@ var VxeTableComponent = defineVxeComponent({
28596
28748
  }
28597
28749
  },
28598
28750
  triggerBodyScrollEvent(evnt, fixedType) {
28751
+ const { useScrollbar } = props;
28599
28752
  const { scrollYLoad, scrollXLoad } = reactData;
28600
28753
  const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData;
28601
28754
  if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
@@ -28615,19 +28768,21 @@ var VxeTableComponent = defineVxeComponent({
28615
28768
  if (!bodyScrollElem) {
28616
28769
  return;
28617
28770
  }
28618
- if (!xHandleEl) {
28619
- return;
28620
- }
28621
- if (!yHandleEl) {
28622
- return;
28771
+ if (!useScrollbar) {
28772
+ if (!xHandleEl) {
28773
+ return;
28774
+ }
28775
+ if (!yHandleEl) {
28776
+ return;
28777
+ }
28623
28778
  }
28624
28779
  if (inBodyScroll) {
28625
28780
  if (scrollRenderType !== fixedType) {
28626
28781
  return;
28627
28782
  }
28628
28783
  }
28629
- let scrollTop = yHandleEl.scrollTop;
28630
- let scrollLeft = xHandleEl.scrollLeft;
28784
+ let scrollTop = 0;
28785
+ let scrollLeft = 0;
28631
28786
  if (leftScrollElem && fixedType === 'left') {
28632
28787
  scrollTop = leftScrollElem.scrollTop;
28633
28788
  }
@@ -28768,8 +28923,8 @@ var VxeTableComponent = defineVxeComponent({
28768
28923
  const rightFixedWidth = computeRightFixedWidth.value;
28769
28924
  const { elemStore, lastScrollTop, lastScrollLeft } = internalData;
28770
28925
  const rowOpts = computeRowOpts.value;
28771
- const scrollbarXOpts = computeScrollbarXOpts.value;
28772
- const scrollbarYOpts = computeScrollbarYOpts.value;
28926
+ const scrollXVisible = computeScrollXVisible.value;
28927
+ const scrollYVisible = computeScrollYVisible.value;
28773
28928
  const xHandleEl = refScrollXHandleElem.value;
28774
28929
  const yHandleEl = refScrollYHandleElem.value;
28775
28930
  const leftScrollElem = getRefElem(elemStore['left-body-scroll']);
@@ -28792,14 +28947,14 @@ var VxeTableComponent = defineVxeComponent({
28792
28947
  const isRollY = overflowY && scrollTop !== lastScrollTop;
28793
28948
  if (isRollX) {
28794
28949
  // 如果禁用滚动
28795
- if (scrollbarXOpts.visible === 'hidden') {
28950
+ if (scrollXVisible === false || scrollXVisible === 'hidden') {
28796
28951
  evnt.preventDefault();
28797
28952
  return;
28798
28953
  }
28799
28954
  }
28800
28955
  if (isRollY) {
28801
28956
  // 如果禁用滚动
28802
- if (scrollbarYOpts.visible === 'hidden') {
28957
+ if (scrollYVisible === false || scrollYVisible === 'hidden') {
28803
28958
  evnt.preventDefault();
28804
28959
  return;
28805
28960
  }
@@ -29364,6 +29519,168 @@ var VxeTableComponent = defineVxeComponent({
29364
29519
  return nextTick();
29365
29520
  }
29366
29521
  };
29522
+ const updateThumbSize = () => {
29523
+ const { elemStore } = internalData;
29524
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
29525
+ if (!viewEl) {
29526
+ return;
29527
+ }
29528
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
29529
+ return;
29530
+ }
29531
+ const trackXEl = refTrackXElem.value;
29532
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
29533
+ const thumbXElem = refThumbXElem.value;
29534
+ if (thumbXElem) {
29535
+ thumbXElem.style.width = xThumbWidth + 'px';
29536
+ }
29537
+ reactData.xThumbWidth = xThumbWidth;
29538
+ const trackYEl = refTrackYElem.value;
29539
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
29540
+ const thumbYElem = refThumbYElem.value;
29541
+ if (thumbYElem) {
29542
+ thumbYElem.style.height = yThumbHeight + 'px';
29543
+ }
29544
+ reactData.yThumbHeight = yThumbHeight;
29545
+ };
29546
+ const updateThumbOffset = () => {
29547
+ const { elemStore } = internalData;
29548
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
29549
+ if (!viewEl) {
29550
+ return;
29551
+ }
29552
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
29553
+ return;
29554
+ }
29555
+ const { xThumbWidth, yThumbHeight } = reactData;
29556
+ const trackXEl = refTrackXElem.value;
29557
+ const thumbXElem = refThumbXElem.value;
29558
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
29559
+ internalData.xThumbLeft = xThumbLeft;
29560
+ if (thumbXElem && xThumbWidth) {
29561
+ thumbXElem.style.width = xThumbWidth + 'px';
29562
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
29563
+ }
29564
+ const trackYEl = refTrackYElem.value;
29565
+ const thumbYElem = refThumbYElem.value;
29566
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
29567
+ internalData.yThumbTop = yThumbTop;
29568
+ if (thumbYElem && yThumbHeight) {
29569
+ thumbYElem.style.height = yThumbHeight + 'px';
29570
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
29571
+ }
29572
+ };
29573
+ const clickTrackXEvent = (evnt) => {
29574
+ const { elemStore } = internalData;
29575
+ const trackEl = evnt.currentTarget;
29576
+ if (trackEl !== evnt.target) {
29577
+ return;
29578
+ }
29579
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
29580
+ if (!viewEl) {
29581
+ return;
29582
+ }
29583
+ const { xThumbWidth } = reactData;
29584
+ const trackRect = trackEl.getBoundingClientRect();
29585
+ viewEl.scrollTo({
29586
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
29587
+ behavior: 'auto'
29588
+ });
29589
+ };
29590
+ const clickTrackYEvent = (evnt) => {
29591
+ const { elemStore } = internalData;
29592
+ const trackEl = evnt.currentTarget;
29593
+ if (trackEl !== evnt.target) {
29594
+ return;
29595
+ }
29596
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
29597
+ if (!viewEl) {
29598
+ return;
29599
+ }
29600
+ const { yThumbHeight } = reactData;
29601
+ const trackRect = trackEl.getBoundingClientRect();
29602
+ viewEl.scrollTo({
29603
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
29604
+ behavior: 'auto'
29605
+ });
29606
+ };
29607
+ const pointerdownThumbXEvent = (evnt) => {
29608
+ const { elemStore } = internalData;
29609
+ const thumbEl = evnt.currentTarget;
29610
+ internalData.isThumbDrag = true;
29611
+ thumbEl.setPointerCapture(evnt.pointerId);
29612
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
29613
+ if (!viewEl) {
29614
+ return;
29615
+ }
29616
+ const { xThumbWidth } = reactData;
29617
+ const trackEl = thumbEl.parentElement;
29618
+ const trackRect = trackEl.getBoundingClientRect();
29619
+ const pointerPosition = evnt.clientX - trackRect.left;
29620
+ // 记录 thumb 的偏移
29621
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
29622
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
29623
+ };
29624
+ const pointermoveThumbXEvent = (evnt) => {
29625
+ const thumbEl = evnt.currentTarget;
29626
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
29627
+ return;
29628
+ }
29629
+ const { elemStore, isThumbDrag, thumbDragOffset } = internalData;
29630
+ if (isThumbDrag) {
29631
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
29632
+ if (!viewEl) {
29633
+ return;
29634
+ }
29635
+ const { xThumbWidth } = reactData;
29636
+ const thumbEl = evnt.currentTarget;
29637
+ const trackEl = thumbEl.parentElement;
29638
+ const trackRect = trackEl.getBoundingClientRect();
29639
+ // 更新偏移
29640
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
29641
+ }
29642
+ };
29643
+ const cleatPointerThumbEvent = (evnt) => {
29644
+ const thumbEl = evnt.currentTarget;
29645
+ thumbEl.releasePointerCapture(evnt.pointerId);
29646
+ internalData.isThumbDrag = false;
29647
+ };
29648
+ const pointerdownThumbYEvent = (evnt) => {
29649
+ const { elemStore } = internalData;
29650
+ const thumbEl = evnt.currentTarget;
29651
+ internalData.isThumbDrag = true;
29652
+ thumbEl.setPointerCapture(evnt.pointerId);
29653
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
29654
+ if (!viewEl) {
29655
+ return;
29656
+ }
29657
+ const { yThumbHeight } = reactData;
29658
+ const trackEl = thumbEl.parentElement;
29659
+ const trackRect = trackEl.getBoundingClientRect();
29660
+ const pointerPosition = evnt.clientY - trackRect.top;
29661
+ // 记录 thumb 的偏移
29662
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
29663
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
29664
+ };
29665
+ const pointermoveThumbYEvent = (evnt) => {
29666
+ const thumbEl = evnt.currentTarget;
29667
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
29668
+ return;
29669
+ }
29670
+ const { elemStore, isThumbDrag, thumbDragOffset } = internalData;
29671
+ if (isThumbDrag) {
29672
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
29673
+ if (!viewEl) {
29674
+ return;
29675
+ }
29676
+ const { yThumbHeight } = reactData;
29677
+ const thumbEl = evnt.currentTarget;
29678
+ const trackEl = thumbEl.parentElement;
29679
+ const trackRect = trackEl.getBoundingClientRect();
29680
+ // 更新偏移
29681
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
29682
+ }
29683
+ };
29367
29684
  // 检测对应模块是否安装
29368
29685
  // 'openExport,openPrint,exportData,openImport,importData,saveFile,readFile,importByFile,print'.split(',').forEach(name => {
29369
29686
  // ($xeTable as any)[name] = function () {
@@ -29388,6 +29705,8 @@ var VxeTableComponent = defineVxeComponent({
29388
29705
  const scrollbarOpts = computeScrollbarOpts.value;
29389
29706
  const scrollbarXOpts = computeScrollbarXOpts.value;
29390
29707
  const scrollbarYOpts = computeScrollbarYOpts.value;
29708
+ const scrollXVisible = computeScrollXVisible.value;
29709
+ const scrollYVisible = computeScrollYVisible.value;
29391
29710
  const { overscrollBehavior: overscrollXBehavior } = scrollbarXOpts;
29392
29711
  const { overscrollBehavior: overscrollYBehavior } = scrollbarYOpts;
29393
29712
  const isFixedLeft = fixedType === 'left';
@@ -29396,10 +29715,15 @@ var VxeTableComponent = defineVxeComponent({
29396
29715
  const osYBehavior = XEUtils.eqNull(overscrollYBehavior) ? scrollbarOpts.overscrollBehavior : overscrollYBehavior;
29397
29716
  return h('div', {
29398
29717
  ref: isFixedLeft ? refLeftContainer : refRightContainer,
29399
- class: [`vxe-table--fixed-${fixedType}-wrapper`, `sx--${scrollbarXOpts.visible}`, `sy--${scrollbarYOpts.visible}`, {
29718
+ class: [
29719
+ `vxe-table--fixed-${fixedType}-wrapper`,
29720
+ `sx--${(scrollXVisible === false || scrollXVisible === 'hidden') ? 'hidden' : 'visible'}`,
29721
+ `sy--${(scrollYVisible === false || scrollYVisible === 'hidden') ? 'hidden' : 'visible'}`,
29722
+ {
29400
29723
  [`x-ob--${osXBehavior}`]: osXBehavior,
29401
29724
  [`y-ob--${osYBehavior}`]: osYBehavior
29402
- }]
29725
+ }
29726
+ ]
29403
29727
  }, [
29404
29728
  showHeader
29405
29729
  ? h(TableHeaderComponent, {
@@ -29658,6 +29982,7 @@ var VxeTableComponent = defineVxeComponent({
29658
29982
  };
29659
29983
  const renderScrollY = () => {
29660
29984
  return h('div', {
29985
+ key: 'vsy',
29661
29986
  ref: refScrollYVirtualElem,
29662
29987
  class: 'vxe-table--scroll-y-virtual'
29663
29988
  }, [
@@ -29695,12 +30020,15 @@ var VxeTableComponent = defineVxeComponent({
29695
30020
  const scrollbarOpts = computeScrollbarOpts.value;
29696
30021
  const scrollbarXOpts = computeScrollbarXOpts.value;
29697
30022
  const scrollbarYOpts = computeScrollbarYOpts.value;
30023
+ const scrollXVisible = computeScrollXVisible.value;
30024
+ const scrollYVisible = computeScrollYVisible.value;
29698
30025
  const { overscrollBehavior: overscrollXBehavior } = scrollbarXOpts;
29699
30026
  const { overscrollBehavior: overscrollYBehavior } = scrollbarYOpts;
29700
30027
  const { leftList, rightList } = columnStore;
29701
30028
  const osXBehavior = XEUtils.eqNull(overscrollXBehavior) ? scrollbarOpts.overscrollBehavior : overscrollXBehavior;
29702
30029
  const osYBehavior = XEUtils.eqNull(overscrollYBehavior) ? scrollbarOpts.overscrollBehavior : overscrollYBehavior;
29703
30030
  return h('div', {
30031
+ key: 'tvw',
29704
30032
  ref: refTableViewportElem,
29705
30033
  class: ['vxe-table--viewport-wrapper', {
29706
30034
  [`x-ob--${osXBehavior}`]: osXBehavior,
@@ -29708,7 +30036,11 @@ var VxeTableComponent = defineVxeComponent({
29708
30036
  }]
29709
30037
  }, [
29710
30038
  h('div', {
29711
- class: ['vxe-table--main-wrapper', `sx--${scrollbarXOpts.visible}`, `sy--${scrollbarYOpts.visible}`]
30039
+ class: [
30040
+ 'vxe-table--main-wrapper',
30041
+ `sx--${(scrollXVisible === false || scrollXVisible === 'hidden') ? 'hidden' : 'visible'}`,
30042
+ `sy--${(scrollYVisible === false || scrollYVisible === 'hidden') ? 'hidden' : 'visible'}`
30043
+ ]
29712
30044
  }, [
29713
30045
  /**
29714
30046
  * 表头
@@ -29749,9 +30081,10 @@ var VxeTableComponent = defineVxeComponent({
29749
30081
  renderRowExpandedVNs()
29750
30082
  ]);
29751
30083
  };
29752
- const renderBody = () => {
30084
+ const renderNativeBody = () => {
29753
30085
  const scrollbarYToLeft = computeScrollbarYToLeft.value;
29754
30086
  return h('div', {
30087
+ key: 'lnb',
29755
30088
  class: 'vxe-table--layout-wrapper'
29756
30089
  }, scrollbarYToLeft
29757
30090
  ? [
@@ -29763,8 +30096,74 @@ var VxeTableComponent = defineVxeComponent({
29763
30096
  renderScrollY()
29764
30097
  ]);
29765
30098
  };
30099
+ const renderVirtualBody = () => {
30100
+ const $xeGanttView = internalData.xeGanttView;
30101
+ const { useScrollbar } = props;
30102
+ const { xThumbWidth, yThumbHeight } = reactData;
30103
+ const scrollbarOpts = computeScrollbarOpts.value;
30104
+ const scrollXAutoHide = computeScrollXAutoHide.value;
30105
+ const scrollYAutoHide = computeScrollYAutoHide.value;
30106
+ const scrollXVisible = computeScrollXVisible.value;
30107
+ const scrollYVisible = computeScrollYVisible.value;
30108
+ const scrollbarXToTop = computeScrollbarXToTop.value;
30109
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
30110
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value;
30111
+ const hideXScroll = scrollXVisible === false || scrollXVisible === 'hidden';
30112
+ const hideYScroll = scrollYVisible === false || scrollYVisible === 'hidden';
30113
+ return h('div', {
30114
+ key: 'lvb',
30115
+ class: ['vxe-table--layout-wrapper', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
30116
+ 'is--virtual-scrollbar': useScrollbar,
30117
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
30118
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
30119
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
30120
+ 'overflow-y': yThumbHeight,
30121
+ 'overflow-x': xThumbWidth
30122
+ }]
30123
+ }, [
30124
+ renderViewport(),
30125
+ h('div', {
30126
+ class: scrollbarWrapperClss
30127
+ }, [
30128
+ hideXScroll
30129
+ ? renderEmptyElement$1($xeTable)
30130
+ : h('div', {
30131
+ ref: refTrackXElem,
30132
+ class: 'vxe-scrollbar--track-x',
30133
+ onClick: clickTrackXEvent
30134
+ }, [
30135
+ h('div', {
30136
+ ref: refThumbXElem,
30137
+ class: 'vxe-scrollbar--thumb-x',
30138
+ onPointerdown: pointerdownThumbXEvent,
30139
+ onPointermove: pointermoveThumbXEvent,
30140
+ onPointerup: cleatPointerThumbEvent,
30141
+ onPointercancel: cleatPointerThumbEvent,
30142
+ onLostpointercapture: cleatPointerThumbEvent
30143
+ })
30144
+ ]),
30145
+ hideYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)
30146
+ ? renderEmptyElement$1($xeTable)
30147
+ : h('div', {
30148
+ ref: refTrackYElem,
30149
+ class: 'vxe-scrollbar--track-y',
30150
+ onClick: clickTrackYEvent
30151
+ }, [
30152
+ h('div', {
30153
+ ref: refThumbYElem,
30154
+ class: 'vxe-scrollbar--thumb-y',
30155
+ onPointerdown: pointerdownThumbYEvent,
30156
+ onPointermove: pointermoveThumbYEvent,
30157
+ onPointerup: cleatPointerThumbEvent,
30158
+ onPointercancel: cleatPointerThumbEvent,
30159
+ onLostpointercapture: cleatPointerThumbEvent
30160
+ })
30161
+ ])
30162
+ ])
30163
+ ]);
30164
+ };
29766
30165
  const renderVN = () => {
29767
- const { loading, stripe, showHeader, height, treeConfig, mouseConfig, showFooter, highlightCell, highlightHoverRow, highlightHoverColumn, editConfig, editRules, importConfig, exportConfig, printConfig } = props;
30166
+ const { loading, stripe, useScrollbar, showHeader, height, treeConfig, mouseConfig, showFooter, highlightCell, highlightHoverRow, highlightHoverColumn, editConfig, editRules, importConfig, exportConfig, printConfig } = props;
29768
30167
  const { isGroup, overflowX, overflowY, scrollXLoad, scrollYLoad, tableData, initStore, isRowGroupStatus, columnStore, filterStore, customStore, tooltipStore } = reactData;
29769
30168
  const { teleportToWrapperElem, popupToWrapperElem, customPopupToElem } = internalData;
29770
30169
  const { leftList, rightList } = columnStore;
@@ -29807,7 +30206,7 @@ var VxeTableComponent = defineVxeComponent({
29807
30206
  if (isCrossTableDrag && !tableData.length) {
29808
30207
  tbOns.onDragover = $xeTable.handleCrossTableRowDragoverEmptyEvent;
29809
30208
  }
29810
- return h('div', Object.assign({ ref: refElem, class: ['vxe-table', 'vxe-table--render-default', `tid_${xID}`, `border--${tableBorder}`, `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
30209
+ return h('div', Object.assign({ ref: refElem, class: ['vxe-table', 'vxe-table--render-default', `tid_${xID}`, `border--${tableBorder}`, useScrollbar ? 'is--virtual-scrollbar' : 'is--native-scrollbar', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
29811
30210
  [`size--${vSize}`]: vSize,
29812
30211
  [`valid-msg--${validOpts.msgMode}`]: !!editRules,
29813
30212
  'vxe-editable': !!editConfig,
@@ -29868,15 +30267,17 @@ var VxeTableComponent = defineVxeComponent({
29868
30267
  h('div', {
29869
30268
  key: 'tw',
29870
30269
  class: 'vxe-table--render-wrapper'
29871
- }, scrollbarXToTop
29872
- ? [
29873
- renderScrollX(),
29874
- renderBody()
29875
- ]
29876
- : [
29877
- renderBody(),
29878
- renderScrollX()
29879
- ]),
30270
+ }, useScrollbar
30271
+ ? [renderVirtualBody()]
30272
+ : (scrollbarXToTop
30273
+ ? [
30274
+ renderScrollX(),
30275
+ renderNativeBody()
30276
+ ]
30277
+ : [
30278
+ renderNativeBody(),
30279
+ renderScrollX()
30280
+ ])),
29880
30281
  /**
29881
30282
  * 空数据
29882
30283
  */
@@ -30183,6 +30584,7 @@ var VxeTableComponent = defineVxeComponent({
30183
30584
  $xeTable.refreshColumn();
30184
30585
  });
30185
30586
  });
30587
+ const reScrollFlag = ref(0);
30186
30588
  const reLayoutFlag = ref(0);
30187
30589
  watch(computeSize, () => {
30188
30590
  reLayoutFlag.value++;
@@ -30215,36 +30617,47 @@ var VxeTableComponent = defineVxeComponent({
30215
30617
  watch(() => props.maxHeight, () => {
30216
30618
  reLayoutFlag.value++;
30217
30619
  });
30620
+ watch(() => VxeUI.getLanguage(), () => {
30621
+ reLayoutFlag.value++;
30622
+ });
30218
30623
  watch(computeScrollbarXToTop, () => {
30624
+ reScrollFlag.value++;
30219
30625
  reLayoutFlag.value++;
30220
30626
  });
30221
30627
  watch(computeScrollbarYToLeft, () => {
30628
+ reScrollFlag.value++;
30222
30629
  reLayoutFlag.value++;
30223
30630
  });
30224
- watch(() => VxeUI.getLanguage(), () => {
30631
+ watch(computeScrollXVisible, () => {
30632
+ reScrollFlag.value++;
30225
30633
  reLayoutFlag.value++;
30226
30634
  });
30227
- watch(() => {
30228
- const scrollbarXOpts = computeScrollbarXOpts.value;
30229
- return scrollbarXOpts.visible;
30230
- }, () => {
30635
+ watch(computeScrollYVisible, () => {
30636
+ reScrollFlag.value++;
30231
30637
  reLayoutFlag.value++;
30232
30638
  });
30233
- watch(() => {
30234
- const scrollbarYOpts = computeScrollbarYOpts.value;
30235
- return scrollbarYOpts.visible;
30236
- }, () => {
30639
+ watch(computeScrollXHeight, () => {
30640
+ reScrollFlag.value++;
30237
30641
  reLayoutFlag.value++;
30238
30642
  });
30239
- watch(() => {
30240
- const cellOpts = computeCellOpts.value;
30241
- return cellOpts.height;
30242
- }, () => {
30643
+ watch(computeScrollYWidth, () => {
30644
+ reScrollFlag.value++;
30645
+ reLayoutFlag.value++;
30646
+ });
30647
+ watch(computeCellHeitht, () => {
30243
30648
  reLayoutFlag.value++;
30244
30649
  });
30245
30650
  watch(reLayoutFlag, () => {
30246
30651
  $xeTable.recalculate(true);
30247
30652
  });
30653
+ watch(reScrollFlag, () => {
30654
+ nextTick(() => {
30655
+ $xeTable.updateScrollbar();
30656
+ nextTick(() => {
30657
+ $xeTable.updateScrollbar();
30658
+ });
30659
+ });
30660
+ });
30248
30661
  const footFlag = ref(0);
30249
30662
  watch(() => props.footerData ? props.footerData.length : -1, () => {
30250
30663
  footFlag.value++;
@@ -30360,7 +30773,6 @@ var VxeTableComponent = defineVxeComponent({
30360
30773
  }
30361
30774
  });
30362
30775
  $xeTable.preventEvent(null, 'created', { $table: $xeTable });
30363
- let resizeObserver;
30364
30776
  onActivated(() => {
30365
30777
  $xeTable.recalculate().then(() => $xeTable.refreshScroll());
30366
30778
  $xeTable.preventEvent(null, 'activated', { $table: $xeTable });
@@ -30376,7 +30788,7 @@ var VxeTableComponent = defineVxeComponent({
30376
30788
  });
30377
30789
  onMounted(() => {
30378
30790
  const { editConfig, exportConfig, importConfig, treeConfig, minHeight, keepSource, areaConfig } = props;
30379
- const { scrollXStore, scrollYStore } = internalData;
30791
+ const { elemStore, scrollXStore, scrollYStore } = internalData;
30380
30792
  const columnOpts = computeColumnOpts.value;
30381
30793
  const columnDragOpts = computeColumnDragOpts.value;
30382
30794
  const aggregateOpts = computeAggregateOpts.value;
@@ -30398,6 +30810,7 @@ var VxeTableComponent = defineVxeComponent({
30398
30810
  const areaOpts = computeAreaOpts.value;
30399
30811
  const sortOpts = computeSortOpts.value;
30400
30812
  const filterOpts = computeFilterOpts.value;
30813
+ const scrollbarOpts = computeScrollbarOpts.value;
30401
30814
  const { groupFields } = aggregateOpts;
30402
30815
  if ($xeGantt) {
30403
30816
  const { refClassifyWrapperElem } = $xeGantt.getRefMaps();
@@ -30629,6 +31042,12 @@ var VxeTableComponent = defineVxeComponent({
30629
31042
  // if (hasEnableConf(printConfig, printOpts) || hasEnableConf(importConfig, importOpts) || hasEnableConf(exportConfig, exportOpts)) && !$xeTable.exportData) {
30630
31043
  // errLog('vxe.error.reqModule', ['Export'])
30631
31044
  // }
31045
+ if (scrollbarOpts.x) {
31046
+ warnLog$2('vxe.error.delProp', ['scrollbar-config.x', 'scrollbar-config.xConfig']);
31047
+ }
31048
+ if (scrollbarOpts.y) {
31049
+ warnLog$2('vxe.error.delProp', ['scrollbar-config.y', 'scrollbar-config.yConfig']);
31050
+ }
30632
31051
  Object.assign(scrollYStore, {
30633
31052
  startIndex: 0,
30634
31053
  endIndex: 0,
@@ -30642,12 +31061,26 @@ var VxeTableComponent = defineVxeComponent({
30642
31061
  handleUpdateRowGroup(groupFields);
30643
31062
  initData();
30644
31063
  nextTick(() => {
30645
- if (props.autoResize) {
30646
- const el = refElem.value;
31064
+ const { useScrollbar, autoResize } = props;
31065
+ const el = refElem.value;
31066
+ if (useScrollbar) {
31067
+ const viewInnerEl = getRefElem(elemStore['main-body-table']);
31068
+ const scrollObserver = globalResize.create(() => {
31069
+ reScrollFlag.value++;
31070
+ });
31071
+ if (el) {
31072
+ scrollObserver.observe(el);
31073
+ }
31074
+ if (viewInnerEl) {
31075
+ scrollObserver.observe(viewInnerEl);
31076
+ }
31077
+ internalData.scrollObserver = scrollObserver;
31078
+ }
31079
+ if (autoResize) {
30647
31080
  const parentEl = $xeTable.getParentElem();
30648
- resizeObserver = globalResize.create(() => {
31081
+ const resizeObserver = globalResize.create(() => {
30649
31082
  if (props.autoResize) {
30650
- layoutReFlag.value++;
31083
+ handleResizeEvent();
30651
31084
  }
30652
31085
  });
30653
31086
  if (el) {
@@ -30656,6 +31089,7 @@ var VxeTableComponent = defineVxeComponent({
30656
31089
  if (parentEl) {
30657
31090
  resizeObserver.observe(parentEl);
30658
31091
  }
31092
+ internalData.resizeObserver = resizeObserver;
30659
31093
  }
30660
31094
  });
30661
31095
  if (virtualYOpts.mode !== 'scroll') {
@@ -30677,7 +31111,7 @@ var VxeTableComponent = defineVxeComponent({
30677
31111
  $xeTable.preventEvent(null, 'mounted', { $table: $xeTable });
30678
31112
  });
30679
31113
  onBeforeUnmount(() => {
30680
- const { _sToTime } = internalData;
31114
+ const { resizeObserver, scrollObserver, _sToTime } = internalData;
30681
31115
  if (_sToTime) {
30682
31116
  clearTimeout(_sToTime);
30683
31117
  }
@@ -30688,6 +31122,9 @@ var VxeTableComponent = defineVxeComponent({
30688
31122
  internalData.cvCacheMaps = {};
30689
31123
  internalData.prevDragRow = null;
30690
31124
  internalData.prevDragCol = null;
31125
+ if (scrollObserver) {
31126
+ scrollObserver.disconnect();
31127
+ }
30691
31128
  if (resizeObserver) {
30692
31129
  resizeObserver.disconnect();
30693
31130
  }