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
@@ -2,11 +2,12 @@ import { h, ComponentPublicInstance, reactive, ref, Ref, provide, inject, nextTi
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
4
  import { initTpImg, getTpImg, isPx, isScale, hasClass, addClass, removeClass, wheelScrollTopTo, wheelScrollLeftTo, getEventTargetNode, getPaddingTopBottomSize, setScrollTop, setScrollLeft, toCssUnit, hasControlKey, checkTargetElement, hasAxternalInputTarget } from '../../ui/src/dom'
5
- import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue, hasEnableConf } from '../../ui/src/utils'
5
+ import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue, hasEnableConf, getDefaultConfig } from '../../ui/src/utils'
6
6
  import { VxeUI } from '../../ui'
7
7
  import { createReactData, createInternalData, getRowUniqueId, createRowId, clearTableAllStatus, getColumnList, toFilters, hasDeepKey, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleRowidOrRow, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getRefElem, getColReMinWidth, getColReMaxWidth, createHandleUpdateRowId, createHandleGetRowId, getCalcHeight, getCellRestHeight, getLastChildColumn, getRowMaxHeight, handleCustomStoreConfig, encodeRowid } from './util'
8
8
  import { getSlotVNs } from '../../ui/src/vn'
9
9
  import { moveRowAnimateToTb, clearRowAnimate, moveColAnimateToLr, clearColAnimate } from '../../ui/src/anime'
10
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from './scrollbar'
10
11
  import { createComponentLog } from '../../ui/src/log'
11
12
  import { getCrossTableDragRowInfo } from './store'
12
13
  import Cell from './cell'
@@ -35,7 +36,7 @@ import type { VxeGridConstructor, VxeGridPrivateMethods, VxeTableConstructor, Vx
35
36
 
36
37
  const { warnLog, errLog } = createComponentLog('table')
37
38
 
38
- const { getConfig, getIcon, getI18n, renderer, formats, createEvent, globalResize, interceptor, hooks, globalEvents, GLOBAL_EVENT_KEYS, useFns, renderEmptyElement } = VxeUI
39
+ const { getConfig, getIcon, getI18n, renderer, formats, createEvent, globalResize, interceptor, hooks, domUtils, globalEvents, GLOBAL_EVENT_KEYS, useFns, renderEmptyElement } = VxeUI
39
40
 
40
41
  const supportMaxRow = 5e6
41
42
  const customStorageKey = 'VXE_CUSTOM_STORE'
@@ -60,6 +61,8 @@ export default defineVxeComponent({
60
61
 
61
62
  const browseObj = XEUtils.browse()
62
63
 
64
+ const scrollDefaultConf = Object.assign({}, getConfig().scrollbar)
65
+
63
66
  // 使用已安装的组件,如果未安装则不渲染
64
67
  const VxeUILoadingComponent = VxeUI.getComponent('VxeLoading')
65
68
  const VxeUITooltipComponent = VxeUI.getComponent('VxeTooltip')
@@ -133,6 +136,11 @@ export default defineVxeComponent({
133
136
  const refScrollXSpaceElem = ref<HTMLDivElement>()
134
137
  const refScrollYSpaceElem = ref<HTMLDivElement>()
135
138
 
139
+ const refTrackXElem = ref<HTMLDivElement>()
140
+ const refTrackYElem = ref<HTMLDivElement>()
141
+ const refThumbXElem = ref<HTMLDivElement>()
142
+ const refThumbYElem = ref<HTMLDivElement>()
143
+
136
144
  let $xeToolbar: VxeToolbarConstructor
137
145
 
138
146
  const computeTableId = computed(() => {
@@ -227,12 +235,48 @@ export default defineVxeComponent({
227
235
 
228
236
  const computeScrollbarXOpts = computed(() => {
229
237
  const scrollbarOpts = computeScrollbarOpts.value
230
- return Object.assign({}, scrollbarOpts.x, props.scrollbarConfig?.x || {})
238
+ return scrollbarOpts.x ? Object.assign({}, scrollbarOpts.x, scrollbarOpts.xConfig) : (scrollbarOpts.xConfig || {})
231
239
  })
232
240
 
233
241
  const computeScrollbarYOpts = computed(() => {
234
242
  const scrollbarOpts = computeScrollbarOpts.value
235
- return Object.assign({}, scrollbarOpts.y, props.scrollbarConfig?.y || {})
243
+ return scrollbarOpts.y ? Object.assign({}, scrollbarOpts.y, scrollbarOpts.yConfig) : (scrollbarOpts.yConfig || {})
244
+ })
245
+
246
+ const computeScrollXHeight = computed(() => {
247
+ const scrollbarOpts = computeScrollbarOpts.value
248
+ const scrollbarXOpts = computeScrollbarXOpts.value
249
+ return XEUtils.toNumber(getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), scrollDefaultConf.height))
250
+ })
251
+
252
+ const computeScrollYWidth = computed(() => {
253
+ const scrollbarOpts = computeScrollbarOpts.value
254
+ const scrollbarYOpts = computeScrollbarYOpts.value
255
+ return XEUtils.toNumber(getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), scrollDefaultConf.width))
256
+ })
257
+
258
+ const computeScrollXVisible = computed(() => {
259
+ const scrollbarOpts = computeScrollbarOpts.value
260
+ const scrollbarXOpts = computeScrollbarXOpts.value
261
+ return getDefaultConfig(scrollbarXOpts.visible, scrollbarOpts.visible)
262
+ })
263
+
264
+ const computeScrollYVisible = computed(() => {
265
+ const scrollbarOpts = computeScrollbarOpts.value
266
+ const scrollbarYOpts = computeScrollbarYOpts.value
267
+ return getDefaultConfig(scrollbarYOpts.visible, scrollbarOpts.visible)
268
+ })
269
+
270
+ const computeScrollXAutoHide = computed(() => {
271
+ const scrollbarOpts = computeScrollbarOpts.value
272
+ const scrollbarXOpts = computeScrollbarXOpts.value
273
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), scrollDefaultConf.autoHide)
274
+ })
275
+
276
+ const computeScrollYAutoHide = computed(() => {
277
+ const scrollbarOpts = computeScrollbarOpts.value
278
+ const scrollbarYOpts = computeScrollbarYOpts.value
279
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), scrollDefaultConf.autoHide)
236
280
  })
237
281
 
238
282
  const computeScrollbarXToTop = computed(() => {
@@ -245,6 +289,24 @@ export default defineVxeComponent({
245
289
  return scrollbarYOpts.position === 'left'
246
290
  })
247
291
 
292
+ const computeScrollbarWrapperClss = computed(() => {
293
+ const { yThumbHeight, xThumbWidth } = reactData
294
+ const scrollbarXToTop = computeScrollbarXToTop.value
295
+ const scrollbarYToLeft = computeScrollbarYToLeft.value
296
+ const scrollXVisible = computeScrollXVisible.value
297
+ const scrollYVisible = computeScrollYVisible.value
298
+ return domUtils.buildClass([
299
+ 'vxe-scrollbar is--virtual',
300
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
301
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
302
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
303
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
304
+ ], {
305
+ 'overflow-y': yThumbHeight,
306
+ 'overflow-x': xThumbWidth
307
+ })
308
+ })
309
+
248
310
  const computeScrollYThreshold = computed(() => {
249
311
  const virtualYOpts = computeVirtualYOpts.value
250
312
  const { threshold } = virtualYOpts
@@ -280,6 +342,11 @@ export default defineVxeComponent({
280
342
  return cellOpts
281
343
  })
282
344
 
345
+ const computeCellHeitht = computed(() => {
346
+ const cellOpts = computeCellOpts.value
347
+ return cellOpts.height
348
+ })
349
+
283
350
  const computeHeaderCellOpts = computed(() => {
284
351
  const headerCellOpts = Object.assign({}, getConfig().table.headerCellConfig, props.headerCellConfig)
285
352
  const defaultRowHeight = computeDefaultRowHeight.value
@@ -637,16 +704,16 @@ export default defineVxeComponent({
637
704
  })
638
705
 
639
706
  const computeTableStyle = computed(() => {
640
- const scrollbarOpts = computeScrollbarOpts.value
641
- const { width, height } = scrollbarOpts
642
- const tStys: VxeComponentStyleType = {}
643
- if (width) {
644
- tStys['--vxe-ui-table-view-scrollbar-width'] = toCssUnit(width)
707
+ const barWidth = computeScrollYWidth.value
708
+ const barHeight = computeScrollXHeight.value
709
+ const stys: VxeComponentStyleType = {}
710
+ if (barWidth || barHeight) {
711
+ stys['--vxe-ui-table-view-scrollbar-width'] = toCssUnit(barWidth || barHeight)
712
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight)
713
+ stys['--vxe-ui-table-view-scrollbar-height'] = toCssUnit(barHeight || barWidth)
714
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth)
645
715
  }
646
- if (height) {
647
- tStys['--vxe-ui-table-view-scrollbar-height'] = toCssUnit(height)
648
- }
649
- return tStys
716
+ return stys
650
717
  })
651
718
 
652
719
  const computeTableRowExpandedList = computed(() => {
@@ -854,8 +921,15 @@ export default defineVxeComponent({
854
921
  computeScrollbarOpts,
855
922
  computeScrollbarXOpts,
856
923
  computeScrollbarYOpts,
924
+ computeScrollXHeight,
925
+ computeScrollYWidth,
926
+ computeScrollXVisible,
927
+ computeScrollYVisible,
928
+ computeScrollXAutoHide,
929
+ computeScrollYAutoHide,
857
930
  computeScrollbarXToTop,
858
931
  computeScrollbarYToLeft,
932
+ computeScrollbarWrapperClss,
859
933
  computeColumnOpts,
860
934
  computeCurrentColumnOpts,
861
935
  computeScrollXThreshold,
@@ -2000,14 +2074,6 @@ export default defineVxeComponent({
2000
2074
  if (!bodyWrapperElem) {
2001
2075
  return
2002
2076
  }
2003
- const yHandleEl = refScrollYHandleElem.value
2004
- if (!yHandleEl) {
2005
- return
2006
- }
2007
- const xHandleEl = refScrollXHandleElem.value
2008
- if (!xHandleEl) {
2009
- return
2010
- }
2011
2077
  const columnOpts = computeColumnOpts.value
2012
2078
  let tWidth = 0
2013
2079
  const minCellWidth = 40 // 列宽最少限制 40px
@@ -2600,7 +2666,6 @@ export default defineVxeComponent({
2600
2666
  const isHeaderRenderOptimize = computeIsHeaderRenderOptimize.value
2601
2667
  const isBodyRenderOptimize = computeIsBodyRenderOptimize.value
2602
2668
  const isFooterRenderOptimize = computeIsFooterRenderOptimize.value
2603
- const scrollbarOpts = computeScrollbarOpts.value
2604
2669
  const mouseOpts = computeMouseOpts.value
2605
2670
  const bodyWrapperElem = getRefElem(elemStore['main-body-wrapper'])
2606
2671
  const bodyTableElem = getRefElem(elemStore['main-body-table'])
@@ -2609,24 +2674,26 @@ export default defineVxeComponent({
2609
2674
  emptyPlaceholderElem.style.height = bodyWrapperElem ? `${bodyWrapperElem.offsetHeight - osbHeight}px` : ''
2610
2675
  }
2611
2676
 
2612
- const scrollbarXConf = scrollbarOpts.x || {}
2613
- const scrollbarYConf = scrollbarOpts.y || {}
2677
+ const scrollXVisible = computeScrollXVisible.value
2678
+ const scrollYVisible = computeScrollYVisible.value
2614
2679
  const scrollbarYToLeft = computeScrollbarYToLeft.value
2615
2680
 
2616
2681
  let xScrollbarVisible = overflowX ? 'visible' : 'hidden'
2617
- if (scrollbarXConf.visible === 'visible' || $xeGanttView) {
2682
+ const hideXScroll = scrollXVisible === false || scrollXVisible === 'hidden'
2683
+ if (scrollXVisible === 'visible' || $xeGanttView) {
2618
2684
  osbHeight = scrollbarHeight
2619
2685
  xScrollbarVisible = 'visible'
2620
- } else if (scrollbarXConf.visible === 'hidden' || scrollbarXConf.visible === false) {
2686
+ } else if (hideXScroll) {
2621
2687
  osbHeight = 0
2622
2688
  xScrollbarVisible = 'hidden'
2623
2689
  }
2624
2690
 
2625
2691
  let yScrollbarVisible = overflowY ? 'visible' : 'hidden'
2626
- if ((scrollbarYConf.visible === 'hidden' || scrollbarYConf.visible === false) || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
2692
+ const hideYScroll = scrollYVisible === false || scrollYVisible === 'hidden'
2693
+ if (hideYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
2627
2694
  osbWidth = 0
2628
2695
  yScrollbarVisible = 'hidden'
2629
- } else if (scrollbarYConf.visible === 'visible') {
2696
+ } else if (scrollYVisible === 'visible') {
2630
2697
  osbWidth = scrollbarWidth
2631
2698
  yScrollbarVisible = 'visible'
2632
2699
  }
@@ -3456,7 +3523,6 @@ export default defineVxeComponent({
3456
3523
  const calcScrollbar = () => {
3457
3524
  const { scrollXWidth, scrollYHeight } = reactData
3458
3525
  const { elemStore } = internalData
3459
- const scrollbarOpts = computeScrollbarOpts.value
3460
3526
  const el = refElem.value
3461
3527
  if (!el || !el.clientWidth) {
3462
3528
  return
@@ -3466,18 +3532,29 @@ export default defineVxeComponent({
3466
3532
  const footerTableElem = getRefElem(elemStore['main-footer-table'])
3467
3533
  const xHandleEl = refScrollXHandleElem.value
3468
3534
  const yHandleEl = refScrollYHandleElem.value
3535
+ const thumbXElem = refThumbXElem.value
3536
+ const thumbYElem = refThumbYElem.value
3469
3537
  let overflowY = false
3470
3538
  let overflowX = false
3471
3539
  if (bodyWrapperElem) {
3540
+ const scrollbarOpts = computeScrollbarOpts.value
3541
+ const barWidth = computeScrollYWidth.value
3542
+ const barHeight = computeScrollXHeight.value
3472
3543
  overflowY = scrollYHeight > bodyWrapperElem.clientHeight
3473
- if (yHandleEl) {
3474
- reactData.scrollbarWidth = scrollbarOpts.width || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14
3544
+ // 如果是虚拟滚动条
3545
+ if (thumbYElem) {
3546
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbYElem.offsetWidth : 0
3547
+ } else if (yHandleEl) {
3548
+ reactData.scrollbarWidth = (barWidth || barHeight) || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14
3475
3549
  }
3476
3550
  reactData.overflowY = overflowY
3477
3551
 
3478
3552
  overflowX = scrollXWidth > bodyWrapperElem.clientWidth
3479
- if (xHandleEl) {
3480
- reactData.scrollbarHeight = scrollbarOpts.height || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14
3553
+ // 如果是虚拟滚动条
3554
+ if (thumbXElem) {
3555
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbXElem.offsetHeight : 0
3556
+ } else if (xHandleEl) {
3557
+ reactData.scrollbarHeight = (barHeight || barWidth) || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14
3481
3558
  }
3482
3559
 
3483
3560
  const hHeight = headerTableElem ? headerTableElem.clientHeight : 0
@@ -3546,6 +3623,11 @@ export default defineVxeComponent({
3546
3623
  })
3547
3624
  }
3548
3625
 
3626
+ const updateScrollbar = () => {
3627
+ updateThumbSize()
3628
+ updateThumbOffset()
3629
+ }
3630
+
3549
3631
  const defaultMinRunDelay = 50
3550
3632
 
3551
3633
  const handleLazyRecalculate = (reFull: boolean, reWidth: boolean, reHeight: boolean, options?: {
@@ -3568,6 +3650,7 @@ export default defineVxeComponent({
3568
3650
  const refreshDelay = resizeOpts.refreshDelay || 30
3569
3651
  const reDelay = rceDelay + refreshDelay
3570
3652
  const el = refElem.value
3653
+ updateScrollbar()
3571
3654
  if (el && el.clientWidth) {
3572
3655
  autoCellWidth()
3573
3656
  updateRowExpandStyle()
@@ -11565,6 +11648,18 @@ export default defineVxeComponent({
11565
11648
  }
11566
11649
  return nextTick()
11567
11650
  },
11651
+ /**
11652
+ * @private
11653
+ */
11654
+ updateScrollbar () {
11655
+ return updateScrollbar()
11656
+ },
11657
+ /**
11658
+ * @private
11659
+ */
11660
+ updateThumbOffset () {
11661
+ return updateThumbOffset()
11662
+ },
11568
11663
  /**
11569
11664
  * 表头单元格按下事件
11570
11665
  */
@@ -12739,19 +12834,18 @@ export default defineVxeComponent({
12739
12834
  },
12740
12835
  handleScrollEvent (evnt, isRollY, isRollX, scrollTop, scrollLeft, params) {
12741
12836
  const { highlightHoverRow } = props
12742
- const { lastScrollLeft, lastScrollTop } = internalData
12743
- const xHandleEl = refScrollXHandleElem.value
12744
- const yHandleEl = refScrollYHandleElem.value
12745
- if (!xHandleEl || !yHandleEl) {
12837
+ const { elemStore, lastScrollLeft, lastScrollTop } = internalData
12838
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
12839
+ if (!bodyScrollElem) {
12746
12840
  return
12747
12841
  }
12748
12842
  const rowOpts = computeRowOpts.value
12749
12843
  const validTip = refValidTooltip.value
12750
12844
  const tooltip = refTooltip.value
12751
- const bodyHeight = yHandleEl.clientHeight
12752
- const bodyWidth = xHandleEl.clientWidth
12753
- const scrollHeight = yHandleEl.scrollHeight
12754
- const scrollWidth = xHandleEl.scrollWidth
12845
+ const bodyHeight = bodyScrollElem.clientHeight
12846
+ const bodyWidth = bodyScrollElem.clientWidth
12847
+ const scrollHeight = bodyScrollElem.scrollHeight
12848
+ const scrollWidth = bodyScrollElem.scrollWidth
12755
12849
  let isTop = false
12756
12850
  let isBottom = false
12757
12851
  let isLeft = false
@@ -12818,6 +12912,7 @@ export default defineVxeComponent({
12818
12912
  direction,
12819
12913
  ...params
12820
12914
  }
12915
+ updateThumbOffset()
12821
12916
  updateRowExpandStyle()
12822
12917
  checkLastSyncScroll(isRollX, isRollY)
12823
12918
  if (isRollX) {
@@ -12860,6 +12955,7 @@ export default defineVxeComponent({
12860
12955
  }
12861
12956
  },
12862
12957
  triggerBodyScrollEvent (evnt, fixedType) {
12958
+ const { useScrollbar } = props
12863
12959
  const { scrollYLoad, scrollXLoad } = reactData
12864
12960
  const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData
12865
12961
  if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
@@ -12879,20 +12975,21 @@ export default defineVxeComponent({
12879
12975
  if (!bodyScrollElem) {
12880
12976
  return
12881
12977
  }
12882
- if (!xHandleEl) {
12883
- return
12884
- }
12885
- if (!yHandleEl) {
12886
- return
12978
+ if (!useScrollbar) {
12979
+ if (!xHandleEl) {
12980
+ return
12981
+ }
12982
+ if (!yHandleEl) {
12983
+ return
12984
+ }
12887
12985
  }
12888
12986
  if (inBodyScroll) {
12889
12987
  if (scrollRenderType !== fixedType) {
12890
12988
  return
12891
12989
  }
12892
12990
  }
12893
-
12894
- let scrollTop = yHandleEl.scrollTop
12895
- let scrollLeft = xHandleEl.scrollLeft
12991
+ let scrollTop = 0
12992
+ let scrollLeft = 0
12896
12993
  if (leftScrollElem && fixedType === 'left') {
12897
12994
  scrollTop = leftScrollElem.scrollTop
12898
12995
  } else if (rightScrollElem && fixedType === 'right') {
@@ -13031,8 +13128,8 @@ export default defineVxeComponent({
13031
13128
 
13032
13129
  const { elemStore, lastScrollTop, lastScrollLeft } = internalData
13033
13130
  const rowOpts = computeRowOpts.value
13034
- const scrollbarXOpts = computeScrollbarXOpts.value
13035
- const scrollbarYOpts = computeScrollbarYOpts.value
13131
+ const scrollXVisible = computeScrollXVisible.value
13132
+ const scrollYVisible = computeScrollYVisible.value
13036
13133
  const xHandleEl = refScrollXHandleElem.value
13037
13134
  const yHandleEl = refScrollYHandleElem.value
13038
13135
  const leftScrollElem = getRefElem(elemStore['left-body-scroll'])
@@ -13059,14 +13156,14 @@ export default defineVxeComponent({
13059
13156
 
13060
13157
  if (isRollX) {
13061
13158
  // 如果禁用滚动
13062
- if (scrollbarXOpts.visible === 'hidden') {
13159
+ if (scrollXVisible === false || scrollXVisible === 'hidden') {
13063
13160
  evnt.preventDefault()
13064
13161
  return
13065
13162
  }
13066
13163
  }
13067
13164
  if (isRollY) {
13068
13165
  // 如果禁用滚动
13069
- if (scrollbarYOpts.visible === 'hidden') {
13166
+ if (scrollYVisible === false || scrollYVisible === 'hidden') {
13070
13167
  evnt.preventDefault()
13071
13168
  return
13072
13169
  }
@@ -13640,6 +13737,188 @@ export default defineVxeComponent({
13640
13737
  }
13641
13738
  }
13642
13739
 
13740
+ const updateThumbSize = () => {
13741
+ const { elemStore } = internalData
13742
+
13743
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
13744
+ if (!viewEl) {
13745
+ return
13746
+ }
13747
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
13748
+ return
13749
+ }
13750
+ const trackXEl = refTrackXElem.value
13751
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
13752
+ const thumbXElem = refThumbXElem.value
13753
+ if (thumbXElem) {
13754
+ thumbXElem.style.width = xThumbWidth + 'px'
13755
+ }
13756
+ reactData.xThumbWidth = xThumbWidth
13757
+
13758
+ const trackYEl = refTrackYElem.value
13759
+
13760
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
13761
+ const thumbYElem = refThumbYElem.value
13762
+ if (thumbYElem) {
13763
+ thumbYElem.style.height = yThumbHeight + 'px'
13764
+ }
13765
+ reactData.yThumbHeight = yThumbHeight
13766
+ }
13767
+
13768
+ const updateThumbOffset = () => {
13769
+ const { elemStore } = internalData
13770
+
13771
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
13772
+ if (!viewEl) {
13773
+ return
13774
+ }
13775
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
13776
+ return
13777
+ }
13778
+ const { xThumbWidth, yThumbHeight } = reactData
13779
+ const trackXEl = refTrackXElem.value
13780
+ const thumbXElem = refThumbXElem.value
13781
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
13782
+ internalData.xThumbLeft = xThumbLeft
13783
+ if (thumbXElem && xThumbWidth) {
13784
+ thumbXElem.style.width = xThumbWidth + 'px'
13785
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
13786
+ }
13787
+
13788
+ const trackYEl = refTrackYElem.value
13789
+ const thumbYElem = refThumbYElem.value
13790
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
13791
+ internalData.yThumbTop = yThumbTop
13792
+ if (thumbYElem && yThumbHeight) {
13793
+ thumbYElem.style.height = yThumbHeight + 'px'
13794
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`
13795
+ }
13796
+ }
13797
+
13798
+ const clickTrackXEvent = (evnt: MouseEvent) => {
13799
+ const { elemStore } = internalData
13800
+
13801
+ const trackEl = evnt.currentTarget as HTMLDivElement
13802
+ if (trackEl !== evnt.target) {
13803
+ return
13804
+ }
13805
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
13806
+ if (!viewEl) {
13807
+ return
13808
+ }
13809
+ const { xThumbWidth } = reactData
13810
+ const trackRect = trackEl.getBoundingClientRect()
13811
+ viewEl.scrollTo({
13812
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
13813
+ behavior: 'auto'
13814
+ })
13815
+ }
13816
+
13817
+ const clickTrackYEvent = (evnt: MouseEvent) => {
13818
+ const { elemStore } = internalData
13819
+
13820
+ const trackEl = evnt.currentTarget as HTMLDivElement
13821
+ if (trackEl !== evnt.target) {
13822
+ return
13823
+ }
13824
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
13825
+ if (!viewEl) {
13826
+ return
13827
+ }
13828
+ const { yThumbHeight } = reactData
13829
+ const trackRect = trackEl.getBoundingClientRect()
13830
+ viewEl.scrollTo({
13831
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
13832
+ behavior: 'auto'
13833
+ })
13834
+ }
13835
+
13836
+ const pointerdownThumbXEvent = (evnt: PointerEvent) => {
13837
+ const { elemStore } = internalData
13838
+
13839
+ const thumbEl = evnt.currentTarget as HTMLDivElement
13840
+ internalData.isThumbDrag = true
13841
+ thumbEl.setPointerCapture(evnt.pointerId)
13842
+
13843
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
13844
+ if (!viewEl) {
13845
+ return
13846
+ }
13847
+ const { xThumbWidth } = reactData
13848
+ const trackEl = thumbEl.parentElement as HTMLDivElement
13849
+ const trackRect = trackEl.getBoundingClientRect()
13850
+ const pointerPosition = evnt.clientX - trackRect.left
13851
+ // 记录 thumb 的偏移
13852
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
13853
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
13854
+ }
13855
+
13856
+ const pointermoveThumbXEvent = (evnt: PointerEvent) => {
13857
+ const thumbEl = evnt.currentTarget as HTMLDivElement
13858
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
13859
+ return
13860
+ }
13861
+ const { elemStore, isThumbDrag, thumbDragOffset } = internalData
13862
+ if (isThumbDrag) {
13863
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
13864
+ if (!viewEl) {
13865
+ return
13866
+ }
13867
+ const { xThumbWidth } = reactData
13868
+ const thumbEl = evnt.currentTarget as HTMLDivElement
13869
+ const trackEl = thumbEl.parentElement as HTMLDivElement
13870
+ const trackRect = trackEl.getBoundingClientRect()
13871
+ // 更新偏移
13872
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
13873
+ }
13874
+ }
13875
+
13876
+ const cleatPointerThumbEvent = (evnt: PointerEvent) => {
13877
+ const thumbEl = evnt.currentTarget as HTMLDivElement
13878
+ thumbEl.releasePointerCapture(evnt.pointerId)
13879
+ internalData.isThumbDrag = false
13880
+ }
13881
+
13882
+ const pointerdownThumbYEvent = (evnt: PointerEvent) => {
13883
+ const { elemStore } = internalData
13884
+
13885
+ const thumbEl = evnt.currentTarget as HTMLDivElement
13886
+ internalData.isThumbDrag = true
13887
+ thumbEl.setPointerCapture(evnt.pointerId)
13888
+
13889
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
13890
+ if (!viewEl) {
13891
+ return
13892
+ }
13893
+ const { yThumbHeight } = reactData
13894
+ const trackEl = thumbEl.parentElement as HTMLDivElement
13895
+ const trackRect = trackEl.getBoundingClientRect()
13896
+ const pointerPosition = evnt.clientY - trackRect.top
13897
+ // 记录 thumb 的偏移
13898
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
13899
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
13900
+ }
13901
+
13902
+ const pointermoveThumbYEvent = (evnt: PointerEvent) => {
13903
+ const thumbEl = evnt.currentTarget as HTMLDivElement
13904
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
13905
+ return
13906
+ }
13907
+ const { elemStore, isThumbDrag, thumbDragOffset } = internalData
13908
+ if (isThumbDrag) {
13909
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
13910
+ if (!viewEl) {
13911
+ return
13912
+ }
13913
+ const { yThumbHeight } = reactData
13914
+ const thumbEl = evnt.currentTarget as HTMLDivElement
13915
+ const trackEl = thumbEl.parentElement as HTMLDivElement
13916
+ const trackRect = trackEl.getBoundingClientRect()
13917
+ // 更新偏移
13918
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
13919
+ }
13920
+ }
13921
+
13643
13922
  // 检测对应模块是否安装
13644
13923
  // 'openExport,openPrint,exportData,openImport,importData,saveFile,readFile,importByFile,print'.split(',').forEach(name => {
13645
13924
  // ($xeTable as any)[name] = function () {
@@ -13666,6 +13945,8 @@ export default defineVxeComponent({
13666
13945
  const scrollbarOpts = computeScrollbarOpts.value
13667
13946
  const scrollbarXOpts = computeScrollbarXOpts.value
13668
13947
  const scrollbarYOpts = computeScrollbarYOpts.value
13948
+ const scrollXVisible = computeScrollXVisible.value
13949
+ const scrollYVisible = computeScrollYVisible.value
13669
13950
  const { overscrollBehavior: overscrollXBehavior } = scrollbarXOpts
13670
13951
  const { overscrollBehavior: overscrollYBehavior } = scrollbarYOpts
13671
13952
  const isFixedLeft = fixedType === 'left'
@@ -13674,10 +13955,15 @@ export default defineVxeComponent({
13674
13955
  const osYBehavior = XEUtils.eqNull(overscrollYBehavior) ? scrollbarOpts.overscrollBehavior : overscrollYBehavior
13675
13956
  return h('div', {
13676
13957
  ref: isFixedLeft ? refLeftContainer : refRightContainer,
13677
- class: [`vxe-table--fixed-${fixedType}-wrapper`, `sx--${scrollbarXOpts.visible}`, `sy--${scrollbarYOpts.visible}`, {
13678
- [`x-ob--${osXBehavior}`]: osXBehavior,
13679
- [`y-ob--${osYBehavior}`]: osYBehavior
13680
- }]
13958
+ class: [
13959
+ `vxe-table--fixed-${fixedType}-wrapper`,
13960
+ `sx--${(scrollXVisible === false || scrollXVisible === 'hidden') ? 'hidden' : 'visible'}`,
13961
+ `sy--${(scrollYVisible === false || scrollYVisible === 'hidden') ? 'hidden' : 'visible'}`,
13962
+ {
13963
+ [`x-ob--${osXBehavior}`]: osXBehavior,
13964
+ [`y-ob--${osYBehavior}`]: osYBehavior
13965
+ }
13966
+ ]
13681
13967
  }, [
13682
13968
  showHeader
13683
13969
  ? h(TableHeaderComponent, {
@@ -13945,6 +14231,7 @@ export default defineVxeComponent({
13945
14231
 
13946
14232
  const renderScrollY = () => {
13947
14233
  return h('div', {
14234
+ key: 'vsy',
13948
14235
  ref: refScrollYVirtualElem,
13949
14236
  class: 'vxe-table--scroll-y-virtual'
13950
14237
  }, [
@@ -13983,6 +14270,8 @@ export default defineVxeComponent({
13983
14270
  const scrollbarOpts = computeScrollbarOpts.value
13984
14271
  const scrollbarXOpts = computeScrollbarXOpts.value
13985
14272
  const scrollbarYOpts = computeScrollbarYOpts.value
14273
+ const scrollXVisible = computeScrollXVisible.value
14274
+ const scrollYVisible = computeScrollYVisible.value
13986
14275
  const { overscrollBehavior: overscrollXBehavior } = scrollbarXOpts
13987
14276
  const { overscrollBehavior: overscrollYBehavior } = scrollbarYOpts
13988
14277
  const { leftList, rightList } = columnStore
@@ -13990,6 +14279,7 @@ export default defineVxeComponent({
13990
14279
  const osYBehavior = XEUtils.eqNull(overscrollYBehavior) ? scrollbarOpts.overscrollBehavior : overscrollYBehavior
13991
14280
 
13992
14281
  return h('div', {
14282
+ key: 'tvw',
13993
14283
  ref: refTableViewportElem,
13994
14284
  class: ['vxe-table--viewport-wrapper', {
13995
14285
  [`x-ob--${osXBehavior}`]: osXBehavior,
@@ -13997,7 +14287,11 @@ export default defineVxeComponent({
13997
14287
  }]
13998
14288
  }, [
13999
14289
  h('div', {
14000
- class: ['vxe-table--main-wrapper', `sx--${scrollbarXOpts.visible}`, `sy--${scrollbarYOpts.visible}`]
14290
+ class: [
14291
+ 'vxe-table--main-wrapper',
14292
+ `sx--${(scrollXVisible === false || scrollXVisible === 'hidden') ? 'hidden' : 'visible'}`,
14293
+ `sy--${(scrollYVisible === false || scrollYVisible === 'hidden') ? 'hidden' : 'visible'}`
14294
+ ]
14001
14295
  }, [
14002
14296
  /**
14003
14297
  * 表头
@@ -14039,9 +14333,10 @@ export default defineVxeComponent({
14039
14333
  ])
14040
14334
  }
14041
14335
 
14042
- const renderBody = () => {
14336
+ const renderNativeBody = () => {
14043
14337
  const scrollbarYToLeft = computeScrollbarYToLeft.value
14044
14338
  return h('div', {
14339
+ key: 'lnb',
14045
14340
  class: 'vxe-table--layout-wrapper'
14046
14341
  }, scrollbarYToLeft
14047
14342
  ? [
@@ -14054,8 +14349,77 @@ export default defineVxeComponent({
14054
14349
  ])
14055
14350
  }
14056
14351
 
14352
+ const renderVirtualBody = () => {
14353
+ const $xeGanttView = internalData.xeGanttView
14354
+
14355
+ const { useScrollbar } = props
14356
+ const { xThumbWidth, yThumbHeight } = reactData
14357
+ const scrollbarOpts = computeScrollbarOpts.value
14358
+ const scrollXAutoHide = computeScrollXAutoHide.value
14359
+ const scrollYAutoHide = computeScrollYAutoHide.value
14360
+ const scrollXVisible = computeScrollXVisible.value
14361
+ const scrollYVisible = computeScrollYVisible.value
14362
+ const scrollbarXToTop = computeScrollbarXToTop.value
14363
+ const scrollbarYToLeft = computeScrollbarYToLeft.value
14364
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value
14365
+ const hideXScroll = scrollXVisible === false || scrollXVisible === 'hidden'
14366
+ const hideYScroll = scrollYVisible === false || scrollYVisible === 'hidden'
14367
+
14368
+ return h('div', {
14369
+ key: 'lvb',
14370
+ class: ['vxe-table--layout-wrapper', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
14371
+ 'is--virtual-scrollbar': useScrollbar,
14372
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
14373
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
14374
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
14375
+ 'overflow-y': yThumbHeight,
14376
+ 'overflow-x': xThumbWidth
14377
+ }]
14378
+ }, [
14379
+ renderViewport(),
14380
+ h('div', {
14381
+ class: scrollbarWrapperClss
14382
+ }, [
14383
+ hideXScroll
14384
+ ? renderEmptyElement($xeTable)
14385
+ : h('div', {
14386
+ ref: refTrackXElem,
14387
+ class: 'vxe-scrollbar--track-x',
14388
+ onClick: clickTrackXEvent
14389
+ }, [
14390
+ h('div', {
14391
+ ref: refThumbXElem,
14392
+ class: 'vxe-scrollbar--thumb-x',
14393
+ onPointerdown: pointerdownThumbXEvent,
14394
+ onPointermove: pointermoveThumbXEvent,
14395
+ onPointerup: cleatPointerThumbEvent,
14396
+ onPointercancel: cleatPointerThumbEvent,
14397
+ onLostpointercapture: cleatPointerThumbEvent
14398
+ })
14399
+ ]),
14400
+ hideYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)
14401
+ ? renderEmptyElement($xeTable)
14402
+ : h('div', {
14403
+ ref: refTrackYElem,
14404
+ class: 'vxe-scrollbar--track-y',
14405
+ onClick: clickTrackYEvent
14406
+ }, [
14407
+ h('div', {
14408
+ ref: refThumbYElem,
14409
+ class: 'vxe-scrollbar--thumb-y',
14410
+ onPointerdown: pointerdownThumbYEvent,
14411
+ onPointermove: pointermoveThumbYEvent,
14412
+ onPointerup: cleatPointerThumbEvent,
14413
+ onPointercancel: cleatPointerThumbEvent,
14414
+ onLostpointercapture: cleatPointerThumbEvent
14415
+ })
14416
+ ])
14417
+ ])
14418
+ ])
14419
+ }
14420
+
14057
14421
  const renderVN = () => {
14058
- const { loading, stripe, showHeader, height, treeConfig, mouseConfig, showFooter, highlightCell, highlightHoverRow, highlightHoverColumn, editConfig, editRules, importConfig, exportConfig, printConfig } = props
14422
+ const { loading, stripe, useScrollbar, showHeader, height, treeConfig, mouseConfig, showFooter, highlightCell, highlightHoverRow, highlightHoverColumn, editConfig, editRules, importConfig, exportConfig, printConfig } = props
14059
14423
  const { isGroup, overflowX, overflowY, scrollXLoad, scrollYLoad, tableData, initStore, isRowGroupStatus, columnStore, filterStore, customStore, tooltipStore } = reactData
14060
14424
  const { teleportToWrapperElem, popupToWrapperElem, customPopupToElem } = internalData
14061
14425
  const { leftList, rightList } = columnStore
@@ -14104,7 +14468,7 @@ export default defineVxeComponent({
14104
14468
  }
14105
14469
  return h('div', {
14106
14470
  ref: refElem,
14107
- class: ['vxe-table', 'vxe-table--render-default', `tid_${xID}`, `border--${tableBorder}`, `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
14471
+ 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'}`, {
14108
14472
  [`size--${vSize}`]: vSize,
14109
14473
  [`valid-msg--${validOpts.msgMode}`]: !!editRules,
14110
14474
  'vxe-editable': !!editConfig,
@@ -14169,15 +14533,17 @@ export default defineVxeComponent({
14169
14533
  h('div', {
14170
14534
  key: 'tw',
14171
14535
  class: 'vxe-table--render-wrapper'
14172
- }, scrollbarXToTop
14173
- ? [
14174
- renderScrollX(),
14175
- renderBody()
14176
- ]
14177
- : [
14178
- renderBody(),
14179
- renderScrollX()
14180
- ]),
14536
+ }, useScrollbar
14537
+ ? [renderVirtualBody()]
14538
+ : (scrollbarXToTop
14539
+ ? [
14540
+ renderScrollX(),
14541
+ renderNativeBody()
14542
+ ]
14543
+ : [
14544
+ renderNativeBody(),
14545
+ renderScrollX()
14546
+ ])),
14181
14547
  /**
14182
14548
  * 空数据
14183
14549
  */
@@ -14490,6 +14856,7 @@ export default defineVxeComponent({
14490
14856
  })
14491
14857
  })
14492
14858
 
14859
+ const reScrollFlag = ref(0)
14493
14860
  const reLayoutFlag = ref(0)
14494
14861
  watch(computeSize, () => {
14495
14862
  reLayoutFlag.value++
@@ -14522,37 +14889,49 @@ export default defineVxeComponent({
14522
14889
  watch(() => props.maxHeight, () => {
14523
14890
  reLayoutFlag.value++
14524
14891
  })
14892
+ watch(() => VxeUI.getLanguage(), () => {
14893
+ reLayoutFlag.value++
14894
+ })
14525
14895
  watch(computeScrollbarXToTop, () => {
14896
+ reScrollFlag.value++
14526
14897
  reLayoutFlag.value++
14527
14898
  })
14528
14899
  watch(computeScrollbarYToLeft, () => {
14900
+ reScrollFlag.value++
14529
14901
  reLayoutFlag.value++
14530
14902
  })
14531
- watch(() => VxeUI.getLanguage(), () => {
14903
+ watch(computeScrollXVisible, () => {
14904
+ reScrollFlag.value++
14532
14905
  reLayoutFlag.value++
14533
14906
  })
14534
- watch(() => {
14535
- const scrollbarXOpts = computeScrollbarXOpts.value
14536
- return scrollbarXOpts.visible
14537
- }, () => {
14907
+ watch(computeScrollYVisible, () => {
14908
+ reScrollFlag.value++
14538
14909
  reLayoutFlag.value++
14539
14910
  })
14540
- watch(() => {
14541
- const scrollbarYOpts = computeScrollbarYOpts.value
14542
- return scrollbarYOpts.visible
14543
- }, () => {
14911
+ watch(computeScrollXHeight, () => {
14912
+ reScrollFlag.value++
14544
14913
  reLayoutFlag.value++
14545
14914
  })
14546
- watch(() => {
14547
- const cellOpts = computeCellOpts.value
14548
- return cellOpts.height
14549
- }, () => {
14915
+ watch(computeScrollYWidth, () => {
14916
+ reScrollFlag.value++
14917
+ reLayoutFlag.value++
14918
+ })
14919
+ watch(computeCellHeitht, () => {
14550
14920
  reLayoutFlag.value++
14551
14921
  })
14552
14922
  watch(reLayoutFlag, () => {
14553
14923
  $xeTable.recalculate(true)
14554
14924
  })
14555
14925
 
14926
+ watch(reScrollFlag, () => {
14927
+ nextTick(() => {
14928
+ $xeTable.updateScrollbar()
14929
+ nextTick(() => {
14930
+ $xeTable.updateScrollbar()
14931
+ })
14932
+ })
14933
+ })
14934
+
14556
14935
  const footFlag = ref(0)
14557
14936
  watch(() => props.footerData ? props.footerData.length : -1, () => {
14558
14937
  footFlag.value++
@@ -14681,8 +15060,6 @@ export default defineVxeComponent({
14681
15060
 
14682
15061
  $xeTable.preventEvent(null, 'created', { $table: $xeTable })
14683
15062
 
14684
- let resizeObserver: ResizeObserver
14685
-
14686
15063
  onActivated(() => {
14687
15064
  $xeTable.recalculate().then(() => $xeTable.refreshScroll())
14688
15065
  $xeTable.preventEvent(null, 'activated', { $table: $xeTable })
@@ -14700,7 +15077,7 @@ export default defineVxeComponent({
14700
15077
 
14701
15078
  onMounted(() => {
14702
15079
  const { editConfig, exportConfig, importConfig, treeConfig, minHeight, keepSource, areaConfig } = props
14703
- const { scrollXStore, scrollYStore } = internalData
15080
+ const { elemStore, scrollXStore, scrollYStore } = internalData
14704
15081
  const columnOpts = computeColumnOpts.value
14705
15082
  const columnDragOpts = computeColumnDragOpts.value
14706
15083
  const aggregateOpts = computeAggregateOpts.value
@@ -14722,6 +15099,7 @@ export default defineVxeComponent({
14722
15099
  const areaOpts = computeAreaOpts.value
14723
15100
  const sortOpts = computeSortOpts.value
14724
15101
  const filterOpts = computeFilterOpts.value
15102
+ const scrollbarOpts = computeScrollbarOpts.value
14725
15103
  const { groupFields } = aggregateOpts
14726
15104
 
14727
15105
  if ($xeGantt) {
@@ -14963,6 +15341,13 @@ export default defineVxeComponent({
14963
15341
  // errLog('vxe.error.reqModule', ['Export'])
14964
15342
  // }
14965
15343
 
15344
+ if (scrollbarOpts.x) {
15345
+ warnLog('vxe.error.delProp', ['scrollbar-config.x', 'scrollbar-config.xConfig'])
15346
+ }
15347
+ if (scrollbarOpts.y) {
15348
+ warnLog('vxe.error.delProp', ['scrollbar-config.y', 'scrollbar-config.yConfig'])
15349
+ }
15350
+
14966
15351
  Object.assign(scrollYStore, {
14967
15352
  startIndex: 0,
14968
15353
  endIndex: 0,
@@ -14979,12 +15364,26 @@ export default defineVxeComponent({
14979
15364
  initData()
14980
15365
 
14981
15366
  nextTick(() => {
14982
- if (props.autoResize) {
14983
- const el = refElem.value
15367
+ const { useScrollbar, autoResize } = props
15368
+ const el = refElem.value
15369
+ if (useScrollbar) {
15370
+ const viewInnerEl = getRefElem(elemStore['main-body-table'])
15371
+ const scrollObserver = globalResize.create(() => {
15372
+ reScrollFlag.value++
15373
+ })
15374
+ if (el) {
15375
+ scrollObserver.observe(el)
15376
+ }
15377
+ if (viewInnerEl) {
15378
+ scrollObserver.observe(viewInnerEl)
15379
+ }
15380
+ internalData.scrollObserver = scrollObserver
15381
+ }
15382
+ if (autoResize) {
14984
15383
  const parentEl = $xeTable.getParentElem()
14985
- resizeObserver = globalResize.create(() => {
15384
+ const resizeObserver = globalResize.create(() => {
14986
15385
  if (props.autoResize) {
14987
- layoutReFlag.value++
15386
+ handleResizeEvent()
14988
15387
  }
14989
15388
  })
14990
15389
  if (el) {
@@ -14993,6 +15392,7 @@ export default defineVxeComponent({
14993
15392
  if (parentEl) {
14994
15393
  resizeObserver.observe(parentEl)
14995
15394
  }
15395
+ internalData.resizeObserver = resizeObserver
14996
15396
  }
14997
15397
  })
14998
15398
 
@@ -15017,7 +15417,7 @@ export default defineVxeComponent({
15017
15417
  })
15018
15418
 
15019
15419
  onBeforeUnmount(() => {
15020
- const { _sToTime } = internalData
15420
+ const { resizeObserver, scrollObserver, _sToTime } = internalData
15021
15421
  if (_sToTime) {
15022
15422
  clearTimeout(_sToTime)
15023
15423
  }
@@ -15031,6 +15431,9 @@ export default defineVxeComponent({
15031
15431
  internalData.prevDragRow = null
15032
15432
  internalData.prevDragCol = null
15033
15433
 
15434
+ if (scrollObserver) {
15435
+ scrollObserver.disconnect()
15436
+ }
15034
15437
  if (resizeObserver) {
15035
15438
  resizeObserver.disconnect()
15036
15439
  }