vxe-pc-ui 4.20.8 → 4.20.10

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 (144) hide show
  1. package/dist/all.esm.js +2041 -2125
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/card/src/card.js +8 -6
  5. package/es/date-panel/src/date-panel.js +58 -36
  6. package/es/date-panel/style.css +22 -20
  7. package/es/date-panel/style.min.css +1 -1
  8. package/es/drawer/src/drawer.js +7 -5
  9. package/es/icon/style.css +1 -1
  10. package/es/icon-picker/src/icon-picker.js +74 -38
  11. package/es/icon-picker/style.css +9 -3
  12. package/es/icon-picker/style.min.css +1 -1
  13. package/es/layout-aside/src/layout-aside.js +6 -4
  14. package/es/layout-body/src/layout-body.js +6 -4
  15. package/es/layout-container/src/layout-container.js +11 -3
  16. package/es/list/src/list.js +81 -208
  17. package/es/menu/src/menu.js +7 -5
  18. package/es/modal/src/modal.js +7 -5
  19. package/es/scrollbar/src/scrollbar.js +28 -173
  20. package/es/select/src/select.js +243 -8
  21. package/es/select/style.css +44 -0
  22. package/es/select/style.min.css +1 -1
  23. package/es/style.css +1 -1
  24. package/es/style.min.css +1 -1
  25. package/es/tabs/src/tabs.js +5 -4
  26. package/es/tooltip/src/tooltip.js +7 -5
  27. package/es/tooltip/style.css +2 -0
  28. package/es/tooltip/style.min.css +1 -1
  29. package/es/tree/src/tree.js +86 -212
  30. package/es/ui/index.js +1 -1
  31. package/es/ui/src/log.js +1 -1
  32. package/es/vxe-date-panel/style.css +22 -20
  33. package/es/vxe-date-panel/style.min.css +1 -1
  34. package/es/vxe-icon-picker/style.css +9 -3
  35. package/es/vxe-icon-picker/style.min.css +1 -1
  36. package/es/vxe-select/style.css +44 -0
  37. package/es/vxe-select/style.min.css +1 -1
  38. package/es/vxe-tooltip/style.css +2 -0
  39. package/es/vxe-tooltip/style.min.css +1 -1
  40. package/lib/card/src/card.js +9 -6
  41. package/lib/card/src/card.min.js +1 -1
  42. package/lib/date-panel/src/date-panel.js +56 -34
  43. package/lib/date-panel/src/date-panel.min.js +1 -1
  44. package/lib/date-panel/style/style.css +22 -20
  45. package/lib/date-panel/style/style.min.css +1 -1
  46. package/lib/drawer/src/drawer.js +7 -4
  47. package/lib/drawer/src/drawer.min.js +1 -1
  48. package/lib/icon/style/style.css +1 -1
  49. package/lib/icon/style/style.min.css +1 -1
  50. package/lib/icon-picker/src/icon-picker.js +101 -45
  51. package/lib/icon-picker/src/icon-picker.min.js +1 -1
  52. package/lib/icon-picker/style/style.css +9 -3
  53. package/lib/icon-picker/style/style.min.css +1 -1
  54. package/lib/index.umd.js +1049 -859
  55. package/lib/index.umd.min.js +1 -1
  56. package/lib/layout-aside/src/layout-aside.js +7 -4
  57. package/lib/layout-aside/src/layout-aside.min.js +1 -1
  58. package/lib/layout-body/src/layout-body.js +7 -4
  59. package/lib/layout-body/src/layout-body.min.js +1 -1
  60. package/lib/layout-container/src/layout-container.js +20 -4
  61. package/lib/layout-container/src/layout-container.min.js +1 -1
  62. package/lib/list/src/list.js +95 -232
  63. package/lib/list/src/list.min.js +1 -1
  64. package/lib/menu/src/menu.js +8 -4
  65. package/lib/menu/src/menu.min.js +1 -1
  66. package/lib/modal/src/modal.js +7 -4
  67. package/lib/modal/src/modal.min.js +1 -1
  68. package/lib/scrollbar/src/scrollbar.js +42 -199
  69. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  70. package/lib/select/src/select.js +315 -68
  71. package/lib/select/src/select.min.js +1 -1
  72. package/lib/select/style/style.css +44 -0
  73. package/lib/select/style/style.min.css +1 -1
  74. package/lib/style.css +1 -1
  75. package/lib/style.min.css +1 -1
  76. package/lib/tabs/src/tabs.js +6 -5
  77. package/lib/tabs/src/tabs.min.js +1 -1
  78. package/lib/tooltip/src/tooltip.js +7 -4
  79. package/lib/tooltip/src/tooltip.min.js +1 -1
  80. package/lib/tooltip/style/style.css +2 -0
  81. package/lib/tooltip/style/style.min.css +1 -1
  82. package/lib/tree/src/tree.js +101 -235
  83. package/lib/tree/src/tree.min.js +1 -1
  84. package/lib/ui/index.js +1 -1
  85. package/lib/ui/index.min.js +1 -1
  86. package/lib/ui/src/log.js +1 -1
  87. package/lib/ui/src/log.min.js +1 -1
  88. package/lib/vxe-date-panel/style/style.css +22 -20
  89. package/lib/vxe-date-panel/style/style.min.css +1 -1
  90. package/lib/vxe-icon-picker/style/style.css +9 -3
  91. package/lib/vxe-icon-picker/style/style.min.css +1 -1
  92. package/lib/vxe-select/style/style.css +44 -0
  93. package/lib/vxe-select/style/style.min.css +1 -1
  94. package/lib/vxe-tooltip/style/style.css +2 -0
  95. package/lib/vxe-tooltip/style/style.min.css +1 -1
  96. package/package.json +2 -2
  97. package/packages/card/src/card.ts +8 -6
  98. package/packages/date-panel/src/date-panel.ts +58 -36
  99. package/packages/drawer/src/drawer.ts +7 -5
  100. package/packages/icon-picker/src/icon-picker.ts +80 -38
  101. package/packages/layout-aside/src/layout-aside.ts +6 -4
  102. package/packages/layout-body/src/layout-body.ts +6 -4
  103. package/packages/layout-container/src/layout-container.ts +13 -3
  104. package/packages/list/src/list.ts +98 -224
  105. package/packages/menu/src/menu.ts +7 -5
  106. package/packages/modal/src/modal.ts +7 -5
  107. package/packages/scrollbar/src/scrollbar.ts +44 -189
  108. package/packages/select/src/select.ts +278 -8
  109. package/packages/tabs/src/tabs.ts +5 -4
  110. package/packages/tooltip/src/tooltip.ts +7 -5
  111. package/packages/tree/src/tree.ts +103 -228
  112. package/styles/components/date-panel.scss +31 -29
  113. package/styles/components/icon-picker.scss +9 -3
  114. package/styles/components/select.scss +77 -0
  115. package/styles/components/tooltip.scss +1 -0
  116. package/types/components/card.d.ts +2 -2
  117. package/types/components/drawer.d.ts +2 -2
  118. package/types/components/gantt-module/gantt-view.d.ts +7 -16
  119. package/types/components/grid.d.ts +3 -1
  120. package/types/components/icon-picker.d.ts +21 -1
  121. package/types/components/layout-aside.d.ts +2 -2
  122. package/types/components/layout-body.d.ts +2 -2
  123. package/types/components/layout-container.d.ts +3 -1
  124. package/types/components/list.d.ts +6 -2
  125. package/types/components/menu.d.ts +2 -2
  126. package/types/components/modal.d.ts +2 -2
  127. package/types/components/scrollbar.d.ts +17 -14
  128. package/types/components/select.d.ts +28 -3
  129. package/types/components/table.d.ts +28 -22
  130. package/types/components/tabs.d.ts +2 -2
  131. package/types/components/tooltip.d.ts +2 -2
  132. package/types/components/tree.d.ts +8 -17
  133. /package/es/icon/{iconfont.1792115566662.ttf → iconfont.1792219842406.ttf} +0 -0
  134. /package/es/icon/{iconfont.1792115566662.woff → iconfont.1792219842406.woff} +0 -0
  135. /package/es/icon/{iconfont.1792115566662.woff2 → iconfont.1792219842406.woff2} +0 -0
  136. /package/es/{iconfont.1792115566662.ttf → iconfont.1792219842406.ttf} +0 -0
  137. /package/es/{iconfont.1792115566662.woff → iconfont.1792219842406.woff} +0 -0
  138. /package/es/{iconfont.1792115566662.woff2 → iconfont.1792219842406.woff2} +0 -0
  139. /package/lib/icon/style/{iconfont.1792115566662.ttf → iconfont.1792219842406.ttf} +0 -0
  140. /package/lib/icon/style/{iconfont.1792115566662.woff → iconfont.1792219842406.woff} +0 -0
  141. /package/lib/icon/style/{iconfont.1792115566662.woff2 → iconfont.1792219842406.woff2} +0 -0
  142. /package/lib/{iconfont.1792115566662.ttf → iconfont.1792219842406.ttf} +0 -0
  143. /package/lib/{iconfont.1792115566662.woff → iconfont.1792219842406.woff} +0 -0
  144. /package/lib/{iconfont.1792115566662.woff2 → iconfont.1792219842406.woff2} +0 -0
@@ -1,7 +1,7 @@
1
- import { h, Teleport, PropType, ref, inject, computed, provide, onUnmounted, reactive, nextTick, watch, onMounted } from 'vue'
1
+ import { h, Teleport, PropType, ref, inject, computed, provide, onUnmounted, reactive, nextTick, watch, onMounted, onBeforeUnmount } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
- import { VxeUI, getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useSize, renderEmptyElement } from '../../ui'
4
+ import { VxeUI, useFns } from '../../ui'
5
5
  import { getEventTargetNode, getPopupContainer, toCssUnit, updatePanelPlacement } from '../../ui/src/dom'
6
6
  import { getLastZIndex, nextZIndex, getFuncText, eqEmptyValue } from '../../ui/src/utils'
7
7
  import { getSlotVNs } from '../../ui/src/vn'
@@ -12,6 +12,9 @@ import VxeButtonComponent from '../../button'
12
12
  import type { VxeSelectPropTypes, VxeSelectConstructor, SelectInternalData, SelectReactData, VxeSelectDefines, VxeButtonEvents, ValueOf, VxeSelectEmits, VxeComponentSlotType, VxeInputConstructor, SelectMethods, SelectPrivateRef, VxeSelectMethods, VxeOptionProps, VxeDrawerConstructor, VxeDrawerMethods, VxeFormDefines, VxeFormConstructor, VxeFormPrivateMethods, VxeModalConstructor, VxeModalMethods, VxeInputEvents, VxeComponentStyleType, VxeCardConstructor, VxeCardPrivateMethods } from '../../../types'
13
13
  import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
14
14
 
15
+ const { getConfig, getIcon, getI18n, baseUtils, domUtils, globalEvents, GLOBAL_EVENT_KEYS, globalResize, createEvent, renderEmptyElement } = VxeUI
16
+ const { getDefVal } = baseUtils
17
+
15
18
  const { errLog } = createComponentLog('select')
16
19
 
17
20
  function isOptionVisible (option: any) {
@@ -36,6 +39,10 @@ function createReactData (): SelectReactData {
36
39
  searchValue: '',
37
40
  searchLoading: false,
38
41
 
42
+ // 滚动条
43
+ yThumbHeight: 0,
44
+ xThumbWidth: 0,
45
+
39
46
  panelIndex: 0,
40
47
  panelStyle: {},
41
48
  panelPlacement: null,
@@ -57,8 +64,15 @@ function createInternalData (): SelectInternalData {
57
64
  optFullValMaps: {},
58
65
  remoteValMaps: {},
59
66
 
60
- lastScrollLeft: 0,
67
+ // 滚动条
68
+ // scrollObserver: undefined,
69
+ // isThumbDrag: false,
70
+ thumbDragOffset: 0,
71
+ yThumbTop: 0,
72
+ xThumbLeft: 0,
61
73
  lastScrollTop: 0,
74
+ lastScrollLeft: 0,
75
+
62
76
  scrollYStore: {
63
77
  startIndex: 0,
64
78
  endIndex: 0,
@@ -183,6 +197,11 @@ export default defineVxeComponent({
183
197
  popupConfig: Object as PropType<VxeSelectPropTypes.PopupConfig>,
184
198
  virtualYConfig: Object as PropType<VxeSelectPropTypes.VirtualYConfig>,
185
199
  scrollY: Object as PropType<VxeSelectPropTypes.ScrollY>,
200
+ useScrollbar: {
201
+ type: Boolean as PropType<VxeSelectPropTypes.UseScrollbar>,
202
+ default: () => getDefVal(getConfig().select.useScrollbar, getConfig().useScrollbar)
203
+ },
204
+ scrollbarConfig: Object as PropType<VxeSelectPropTypes.ScrollbarConfig>,
186
205
 
187
206
  /**
188
207
  * 已废弃,被 remote-config.queryMethod 替换
@@ -232,9 +251,11 @@ export default defineVxeComponent({
232
251
  const refInpSearch = ref<VxeInputConstructor>()
233
252
  const refVirtualWrapper = ref<HTMLDivElement>()
234
253
  const refOptionPanel = ref<HTMLDivElement>()
254
+ const refVirtualSpaceElem = ref<HTMLDivElement>()
235
255
  const refVirtualBody = ref<HTMLDivElement>()
236
256
 
237
- const { computeSize } = useSize(props)
257
+ const { computeSize } = useFns.useSize(props)
258
+ const { computeIsVScrollbar } = useFns.useVScrollbar(props)
238
259
 
239
260
  const reactData = reactive(createReactData())
240
261
 
@@ -253,6 +274,22 @@ export default defineVxeComponent({
253
274
  getRefMaps: () => refMaps
254
275
  } as unknown as VxeSelectConstructor & VxeSelectMethods
255
276
 
277
+ const {
278
+ refTrackXElem,
279
+ refTrackYElem,
280
+ refThumbXElem,
281
+ refThumbYElem,
282
+ updateThumbSize,
283
+ updateThumbOffset,
284
+ clickTrackXEvent,
285
+ clickTrackYEvent,
286
+ pointerdownThumbXEvent,
287
+ pointermoveThumbXEvent,
288
+ cleatPointerThumbEvent,
289
+ pointerdownThumbYEvent,
290
+ pointermoveThumbYEvent
291
+ } = useFns.useInitVScrollbar($xeSelect)
292
+
256
293
  const computeFormReadonly = computed(() => {
257
294
  const { readonly } = props
258
295
  if (readonly === null) {
@@ -438,6 +475,86 @@ export default defineVxeComponent({
438
475
  return labels.join(', ')
439
476
  })
440
477
 
478
+ const computeScrollbarOpts = computed(() => {
479
+ return Object.assign({}, getConfig().tree.scrollbarConfig, props.scrollbarConfig)
480
+ })
481
+
482
+ const computeScrollbarXOpts = computed(() => {
483
+ const scrollbarOpts = computeScrollbarOpts.value
484
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig, {
485
+ visible: false
486
+ })
487
+ })
488
+
489
+ const computeScrollbarYOpts = computed(() => {
490
+ const scrollbarOpts = computeScrollbarOpts.value
491
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig)
492
+ })
493
+
494
+ const computeScrollXHeight = computed(() => {
495
+ const scrollbarOpts = computeScrollbarOpts.value
496
+ const scrollbarXOpts = computeScrollbarXOpts.value
497
+ return getDefVal(getDefVal(scrollbarXOpts.height, scrollbarOpts.height), getConfig().scrollbar.height)
498
+ })
499
+
500
+ const computeScrollYWidth = computed(() => {
501
+ const scrollbarOpts = computeScrollbarOpts.value
502
+ const scrollbarYOpts = computeScrollbarYOpts.value
503
+ return getDefVal(getDefVal(scrollbarYOpts.width, scrollbarOpts.width), getConfig().scrollbar.width)
504
+ })
505
+
506
+ const computeScrollXVisible = computed(() => {
507
+ const scrollbarOpts = computeScrollbarOpts.value
508
+ const scrollbarXOpts = computeScrollbarXOpts.value
509
+ return getDefVal(scrollbarXOpts.visible, scrollbarOpts.visible)
510
+ })
511
+
512
+ const computeScrollYVisible = computed(() => {
513
+ const scrollbarOpts = computeScrollbarOpts.value
514
+ const scrollbarYOpts = computeScrollbarYOpts.value
515
+ return getDefVal(scrollbarYOpts.visible, scrollbarOpts.visible)
516
+ })
517
+
518
+ const computeScrollXAutoHide = computed(() => {
519
+ const scrollbarOpts = computeScrollbarOpts.value
520
+ const scrollbarXOpts = computeScrollbarXOpts.value
521
+ return getDefVal(getDefVal(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide)
522
+ })
523
+
524
+ const computeScrollYAutoHide = computed(() => {
525
+ const scrollbarOpts = computeScrollbarOpts.value
526
+ const scrollbarYOpts = computeScrollbarYOpts.value
527
+ return getDefVal(getDefVal(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide)
528
+ })
529
+
530
+ const computeScrollbarWrapperClss = computed(() => {
531
+ const { yThumbHeight, xThumbWidth } = reactData
532
+ const scrollbarXToTop = computeScrollbarXToTop.value
533
+ const scrollbarYToLeft = computeScrollbarYToLeft.value
534
+ const scrollXVisible = computeScrollXVisible.value
535
+ const scrollYVisible = computeScrollYVisible.value
536
+ return domUtils.buildClass([
537
+ 'vxe-scrollbar is--virtual',
538
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
539
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
540
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
541
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
542
+ ], {
543
+ 'overflow-y': yThumbHeight,
544
+ 'overflow-x': xThumbWidth
545
+ })
546
+ })
547
+
548
+ const computeScrollbarXToTop = computed(() => {
549
+ const scrollbarXOpts = computeScrollbarXOpts.value
550
+ return scrollbarXOpts.position === 'top'
551
+ })
552
+
553
+ const computeScrollbarYToLeft = computed(() => {
554
+ const scrollbarYOpts = computeScrollbarYOpts.value
555
+ return scrollbarYOpts.position === 'left'
556
+ })
557
+
441
558
  const callSlot = <T>(slotFunc: ((params: T) => VxeComponentSlotType | VxeComponentSlotType[]) | string | null, params: T) => {
442
559
  if (slotFunc) {
443
560
  if (XEUtils.isString(slotFunc)) {
@@ -1245,13 +1362,26 @@ export default defineVxeComponent({
1245
1362
  })
1246
1363
  }
1247
1364
 
1365
+ const updateScrollbar = () => {
1366
+ const isVScrollbar = computeIsVScrollbar.value
1367
+ if (isVScrollbar) {
1368
+ return nextTick().then(() => {
1369
+ updateThumbSize()
1370
+ updateThumbOffset()
1371
+ })
1372
+ }
1373
+ return Promise.resolve()
1374
+ }
1375
+
1248
1376
  /**
1249
1377
  * 重新计算列表
1250
1378
  */
1251
1379
  const recalculate = () => {
1252
1380
  const el = refElem.value
1253
1381
  if (el && el.clientWidth && el.clientHeight) {
1254
- return computeScrollLoad()
1382
+ return computeScrollLoad().then(() => {
1383
+ return updateScrollbar()
1384
+ })
1255
1385
  }
1256
1386
  return Promise.resolve()
1257
1387
  }
@@ -1286,6 +1416,7 @@ export default defineVxeComponent({
1286
1416
  const scrollLeft = scrollBodyElem.scrollLeft
1287
1417
  const isX = scrollLeft !== internalData.lastScrollLeft
1288
1418
  const isY = scrollTop !== internalData.lastScrollTop
1419
+ updateThumbOffset()
1289
1420
  internalData.lastScrollTop = scrollTop
1290
1421
  internalData.lastScrollLeft = scrollLeft
1291
1422
  if (reactData.scrollYLoad) {
@@ -1362,6 +1493,10 @@ export default defineVxeComponent({
1362
1493
 
1363
1494
  const selectMethods: SelectMethods = {
1364
1495
  dispatchEvent,
1496
+ getScrollViewElem () {
1497
+ const viewEl = refVirtualWrapper.value
1498
+ return viewEl || null
1499
+ },
1365
1500
  loadData,
1366
1501
  reloadData (datas) {
1367
1502
  internalData.isLoaded = false
@@ -1416,6 +1551,27 @@ export default defineVxeComponent({
1416
1551
  clearScroll
1417
1552
  }
1418
1553
 
1554
+ const bindScrollbarResize = () => {
1555
+ const isVScrollbar = computeIsVScrollbar.value
1556
+ const { scrollObserver } = internalData
1557
+ if (isVScrollbar) {
1558
+ if (!scrollObserver) {
1559
+ const el = refElem.value
1560
+ const viewInnerEl = refVirtualSpaceElem.value
1561
+ const scrollObserver = globalResize.create(() => {
1562
+ reScrollFlag.value++
1563
+ })
1564
+ if (el) {
1565
+ scrollObserver.observe(el)
1566
+ }
1567
+ if (viewInnerEl) {
1568
+ scrollObserver.observe(viewInnerEl)
1569
+ }
1570
+ internalData.scrollObserver = scrollObserver
1571
+ }
1572
+ }
1573
+ }
1574
+
1419
1575
  Object.assign($xeSelect, selectMethods)
1420
1576
 
1421
1577
  const renderRadio = (option: VxeOptionProps, isOptGroup: boolean, isChecked: boolean, isDisabled: boolean) => {
@@ -1620,8 +1776,9 @@ export default defineVxeComponent({
1620
1776
 
1621
1777
  const renderVN = () => {
1622
1778
  const { className, multiple, loading, filterable, showTotalButton, showCheckedButton, showClearButton, showCloseButton } = props
1623
- const { initialized, isActivated, isAniVisible, optList, visiblePanel, bodyHeight, topSpaceHeight } = reactData
1779
+ const { initialized, isActivated, isAniVisible, optList, visiblePanel, bodyHeight, topSpaceHeight, xThumbWidth, yThumbHeight } = reactData
1624
1780
  const vSize = computeSize.value
1781
+ const isVScrollbar = computeIsVScrollbar.value
1625
1782
  const isDisabled = computeIsDisabled.value
1626
1783
  const selectLabel = computeSelectLabel.value
1627
1784
  const fullLabel = computeFullLabel.value
@@ -1653,6 +1810,14 @@ export default defineVxeComponent({
1653
1810
  const prefixSlot = slots.prefix
1654
1811
  const { appendTo } = popupOpts
1655
1812
  const ppClassName = popupOpts.className || props.popupClassName
1813
+ const scrollbarOpts = computeScrollbarOpts.value
1814
+ const scrollXVisible = computeScrollXVisible.value
1815
+ const scrollYVisible = computeScrollYVisible.value
1816
+ const scrollbarXToTop = computeScrollbarXToTop.value
1817
+ const scrollbarYToLeft = computeScrollbarYToLeft.value
1818
+ const scrollXAutoHide = computeScrollXAutoHide.value
1819
+ const scrollYAutoHide = computeScrollYAutoHide.value
1820
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value
1656
1821
  return h('div', {
1657
1822
  ref: refElem,
1658
1823
  class: ['vxe-select', className ? (XEUtils.isFunction(className) ? className({ $select: $xeSelect }) : className) : '', {
@@ -1763,7 +1928,21 @@ export default defineVxeComponent({
1763
1928
  ])
1764
1929
  : renderEmptyElement($xeSelect),
1765
1930
  h('div', {
1766
- class: 'vxe-select--panel-body'
1931
+ class: [
1932
+ 'vxe-select--panel-body',
1933
+ isVScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
1934
+ isVScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
1935
+ isVScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
1936
+ isVScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
1937
+ {
1938
+ 'is--virtual-scrollbar': isVScrollbar,
1939
+ 'ov-padding': isVScrollbar && scrollbarOpts.padding,
1940
+ 'ov-x--auto-hide': isVScrollbar && scrollXAutoHide,
1941
+ 'ov-y--auto-hide': isVScrollbar && scrollYAutoHide,
1942
+ 'overflow-y': yThumbHeight,
1943
+ 'overflow-x': xThumbWidth
1944
+ }
1945
+ ]
1767
1946
  }, [
1768
1947
  h('div', {
1769
1948
  ref: refVirtualWrapper,
@@ -1771,6 +1950,7 @@ export default defineVxeComponent({
1771
1950
  onScroll: scrollEvent
1772
1951
  }, [
1773
1952
  h('div', {
1953
+ ref: refVirtualSpaceElem,
1774
1954
  class: 'vxe-select--y-space',
1775
1955
  style: {
1776
1956
  height: bodyHeight ? `${bodyHeight}px` : ''
@@ -1783,7 +1963,50 @@ export default defineVxeComponent({
1783
1963
  marginTop: `${topSpaceHeight}px`
1784
1964
  }
1785
1965
  }, renderOpts())
1786
- ])
1966
+ ]),
1967
+ /**
1968
+ * 滚动条
1969
+ */
1970
+ isVScrollbar
1971
+ ? h('div', {
1972
+ class: scrollbarWrapperClss
1973
+ }, [
1974
+ scrollXVisible === false
1975
+ ? renderEmptyElement($xeSelect)
1976
+ : h('div', {
1977
+ ref: refTrackXElem,
1978
+ class: 'vxe-scrollbar--track-x',
1979
+ onClick: clickTrackXEvent
1980
+ }, [
1981
+ h('div', {
1982
+ ref: refThumbXElem,
1983
+ class: 'vxe-scrollbar--thumb-x',
1984
+ onPointerdown: pointerdownThumbXEvent,
1985
+ onPointermove: pointermoveThumbXEvent,
1986
+ onPointerup: cleatPointerThumbEvent,
1987
+ onPointercancel: cleatPointerThumbEvent,
1988
+ onLostpointercapture: cleatPointerThumbEvent
1989
+ })
1990
+ ]),
1991
+ scrollYVisible === false
1992
+ ? renderEmptyElement($xeSelect)
1993
+ : h('div', {
1994
+ ref: refTrackYElem,
1995
+ class: 'vxe-scrollbar--track-y',
1996
+ onClick: clickTrackYEvent
1997
+ }, [
1998
+ h('div', {
1999
+ ref: refThumbYElem,
2000
+ class: 'vxe-scrollbar--thumb-y',
2001
+ onPointerdown: pointerdownThumbYEvent,
2002
+ onPointermove: pointermoveThumbYEvent,
2003
+ onPointerup: cleatPointerThumbEvent,
2004
+ onPointercancel: cleatPointerThumbEvent,
2005
+ onLostpointercapture: cleatPointerThumbEvent
2006
+ })
2007
+ ])
2008
+ ])
2009
+ : renderEmptyElement($xeSelect)
1787
2010
  ]),
1788
2011
  footerSlot || showTotalButton || (showCloseButton && multiple)
1789
2012
  ? h('div', {
@@ -1832,6 +2055,44 @@ export default defineVxeComponent({
1832
2055
  loadData(val || [])
1833
2056
  })
1834
2057
 
2058
+ const reScrollFlag = ref(0)
2059
+ const reLayoutFlag = ref(0)
2060
+ watch(computeIsVScrollbar, () => {
2061
+ nextTick(() => {
2062
+ bindScrollbarResize()
2063
+ nextTick(() => {
2064
+ reLayoutFlag.value++
2065
+ })
2066
+ })
2067
+ })
2068
+ watch(computeScrollYWidth, () => {
2069
+ reLayoutFlag.value++
2070
+ })
2071
+ watch(computeScrollXHeight, () => {
2072
+ reLayoutFlag.value++
2073
+ })
2074
+ watch(computeScrollXVisible, () => {
2075
+ nextTick(() => {
2076
+ reLayoutFlag.value++
2077
+ })
2078
+ })
2079
+ watch(computeScrollYVisible, () => {
2080
+ nextTick(() => {
2081
+ reLayoutFlag.value++
2082
+ })
2083
+ })
2084
+ watch(reLayoutFlag, () => {
2085
+ recalculate().then(() => {
2086
+ recalculate()
2087
+ })
2088
+ })
2089
+
2090
+ watch(reScrollFlag, () => {
2091
+ updateScrollbar().then(() => {
2092
+ updateScrollbar()
2093
+ })
2094
+ })
2095
+
1835
2096
  onMounted(() => {
1836
2097
  nextTick(() => {
1837
2098
  const { options, optionGroups } = props
@@ -1841,6 +2102,8 @@ export default defineVxeComponent({
1841
2102
  loadData(options)
1842
2103
  }
1843
2104
  })
2105
+ reLayoutFlag.value++
2106
+ bindScrollbarResize()
1844
2107
  globalEvents.on($xeSelect, 'mousedown', handleGlobalMousedownEvent)
1845
2108
  globalEvents.on($xeSelect, 'keydown', handleGlobalKeydownEvent)
1846
2109
  globalEvents.on($xeSelect, 'blur', handleGlobalBlurEvent)
@@ -1848,6 +2111,13 @@ export default defineVxeComponent({
1848
2111
  globalEvents.on($xeSelect, 'scroll', handleGlobalScrollEvent)
1849
2112
  })
1850
2113
 
2114
+ onBeforeUnmount(() => {
2115
+ const { scrollObserver } = internalData
2116
+ if (scrollObserver) {
2117
+ scrollObserver.disconnect()
2118
+ }
2119
+ })
2120
+
1851
2121
  onUnmounted(() => {
1852
2122
  globalEvents.off($xeSelect, 'mousedown')
1853
2123
  globalEvents.off($xeSelect, 'keydown')
@@ -1,6 +1,6 @@
1
1
  import { ref, h, reactive, inject, PropType, provide, computed, onUnmounted, watch, nextTick, onMounted } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
- import { VxeUI, useSize } from '../../ui'
3
+ import { VxeUI, useFns } from '../../ui'
4
4
  import { getSlotVNs } from '../../ui/src/vn'
5
5
  import { toCssUnit, addClass, removeClass } from '../../ui/src/dom'
6
6
  import { isEnableConf } from '../../ui/src/utils'
@@ -81,7 +81,8 @@ export default defineVxeComponent({
81
81
 
82
82
  const $xeParentTabs = inject<(VxeTabsConstructor & VxeTabsPrivateMethods) | null>('$xeTabs', null)
83
83
 
84
- const { computeSize } = useSize(props)
84
+ const { computeSize } = useFns.useSize(props)
85
+ const { computeIsVScrollbar } = useFns.useVScrollbar(props)
85
86
 
86
87
  const refElem = ref<HTMLDivElement>()
87
88
  const refHeadWrapperElem = ref<HTMLDivElement>()
@@ -791,13 +792,13 @@ export default defineVxeComponent({
791
792
  }
792
793
 
793
794
  const renderTabPane = (item: VxeTabPaneProps | VxeTabPaneDefines.TabConfig) => {
794
- const { useScrollbar } = props
795
795
  const { initNames, activeName } = reactData
796
796
  const { name, slots } = item
797
797
  const defaultSlot = slots ? slots.default : null
798
798
  const scrollbarProps = computeScrollbarProps.value
799
+ const isVScrollbar = computeIsVScrollbar.value
799
800
  if (name && initNames.includes(name)) {
800
- return useScrollbar
801
+ return isVScrollbar
801
802
  ? h(VxeScrollbarComponent, {
802
803
  key: `${name}`,
803
804
  class: ['vxe-tabs-pane--scrollbar-item', {
@@ -1,7 +1,7 @@
1
1
  import { h, ref, nextTick, onBeforeUnmount, onMounted, computed, reactive, watch, PropType, VNode } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
- import { VxeUI, useSize } from '../../ui'
4
+ import { VxeUI, useFns } from '../../ui'
5
5
  import { getLastZIndex, nextZIndex } from '../../ui/src/utils'
6
6
  import { getPopupAppendElement, toCssUnit, updatePanelPlacement } from '../../ui/src/dom'
7
7
  import { getSlotVNs } from '../../ui/src/vn'
@@ -137,7 +137,8 @@ export default defineVxeComponent({
137
137
 
138
138
  const xID = XEUtils.uniqueId()
139
139
 
140
- const { computeSize } = useSize(props)
140
+ const { computeSize } = useFns.useSize(props)
141
+ const { computeIsVScrollbar } = useFns.useVScrollbar(props)
141
142
 
142
143
  const reactData = reactive(createReactData())
143
144
 
@@ -434,8 +435,9 @@ export default defineVxeComponent({
434
435
  Object.assign($xeTooltip, tooltipMethods, tooltipPrivateMethods)
435
436
 
436
437
  const renderContent = () => {
437
- const { useScrollbar, theme, useHtml, useHTML } = props
438
+ const { theme, useHtml, useHTML } = props
438
439
  const { tipContent } = reactData
440
+ const isVScrollbar = computeIsVScrollbar.value
439
441
  const wrapperStyle = computeWrapperStyle.value
440
442
  const contentSlot = slots.content
441
443
  const contVNs: VNode[] = []
@@ -457,7 +459,7 @@ export default defineVxeComponent({
457
459
  key: 'cd'
458
460
  }, `${tipContent}`))
459
461
  }
460
- if (useScrollbar) {
462
+ if (isVScrollbar) {
461
463
  return h(VxeScrollbarComponent, {
462
464
  key: 5,
463
465
  ref: contentScrollbar,
@@ -541,7 +543,7 @@ export default defineVxeComponent({
541
543
  onMounted(() => {
542
544
  const $scrollbar = contentScrollbar.value
543
545
  if ($scrollbar) {
544
- const viewEl = $scrollbar.getViewElem()
546
+ const viewEl = $scrollbar.getScrollViewElem()
545
547
  if (viewEl) {
546
548
  viewEl.addEventListener('wheel', wheelEvent, { passive: false })
547
549
  internalData.scrollbarViewEl = viewEl