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
1
  import { h, PropType, ref, Ref, computed, onBeforeUnmount, watch, reactive, nextTick, onActivated, onMounted, VNode } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
- import { VxeUI, useSize, createEvent, renderEmptyElement } from '../../ui'
4
+ import { VxeUI, createEvent, renderEmptyElement } from '../../ui'
5
5
  import { getCrossListDragRowInfo } from './store'
6
6
  import { isScale, removeClass, addClass, getTpImg, toCssUnit, hasClass } from '../../ui/src/dom'
7
7
  import { isEnableConf, getText, enModelValue, deModelValue, getDefaultConfig } from '../../ui/src/utils'
@@ -12,9 +12,7 @@ import VxeLoadingComponent from '../../loading'
12
12
 
13
13
  import type { VxeListConstructor, VxeListPropTypes, VxeListEmits, ListReactData, VxeListPrivateMethods, ListInternalData, VxeListDefines, ValueOf, ListMethods, ListPrivateMethods, ListPrivateRef, VxeComponentStyleType } from '../../../types'
14
14
 
15
- const { getConfig, getIcon, getI18n, domUtils, scrollbarUtils, menus, globalEvents, globalResize } = VxeUI
16
-
17
- const { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } = scrollbarUtils
15
+ const { getConfig, getIcon, getI18n, domUtils, useFns, menus, globalEvents, globalResize } = VxeUI
18
16
 
19
17
  const { warnLog, errLog } = createComponentLog('tree')
20
18
 
@@ -167,8 +165,6 @@ export default defineVxeComponent({
167
165
 
168
166
  const browseObj = XEUtils.browse()
169
167
 
170
- const { computeSize } = useSize(props)
171
-
172
168
  const reactData = reactive(createReactData())
173
169
 
174
170
  const internalData = createInternalData()
@@ -179,16 +175,15 @@ export default defineVxeComponent({
179
175
  const refHeaderElem = ref() as Ref<HTMLDivElement>
180
176
  const refFooterElem = ref() as Ref<HTMLDivElement>
181
177
  const refVirtualWrapper = ref() as Ref<HTMLDivElement>
178
+ const refVirtualSpaceElem = ref() as Ref<HTMLDivElement>
182
179
  const refVirtualBody = ref() as Ref<HTMLDivElement>
183
180
 
184
- const refTrackXElem = ref<HTMLDivElement>()
185
- const refTrackYElem = ref<HTMLDivElement>()
186
- const refThumbXElem = ref<HTMLDivElement>()
187
- const refThumbYElem = ref<HTMLDivElement>()
188
-
189
181
  const refDragRowLineElem = ref<HTMLDivElement>()
190
182
  const refDragTipElem = ref<HTMLDivElement>()
191
183
 
184
+ const { computeSize } = useFns.useSize(props)
185
+ const { computeIsVScrollbar } = useFns.useVScrollbar(props)
186
+
192
187
  const refMaps: ListPrivateRef = {
193
188
  refElem
194
189
  }
@@ -202,6 +197,22 @@ export default defineVxeComponent({
202
197
  getRefMaps: () => refMaps
203
198
  } as unknown as VxeListConstructor & VxeListPrivateMethods
204
199
 
200
+ const {
201
+ refTrackXElem,
202
+ refTrackYElem,
203
+ refThumbXElem,
204
+ refThumbYElem,
205
+ updateThumbSize,
206
+ updateThumbOffset,
207
+ clickTrackXEvent,
208
+ clickTrackYEvent,
209
+ pointerdownThumbXEvent,
210
+ pointermoveThumbXEvent,
211
+ cleatPointerThumbEvent,
212
+ pointerdownThumbYEvent,
213
+ pointermoveThumbYEvent
214
+ } = useFns.useInitVScrollbar($xeList)
215
+
205
216
  const computeRowOpts = computed(() => {
206
217
  return Object.assign({}, getConfig().list.rowConfig, props.rowConfig)
207
218
  })
@@ -521,7 +532,6 @@ export default defineVxeComponent({
521
532
  */
522
533
  const refreshScroll = () => {
523
534
  const { lastScrollLeft, lastScrollTop } = internalData
524
- updateScrollbar()
525
535
  return clearScroll().then(() => {
526
536
  if (lastScrollLeft || lastScrollTop) {
527
537
  internalData.lastScrollLeft = 0
@@ -532,8 +542,14 @@ export default defineVxeComponent({
532
542
  }
533
543
 
534
544
  const updateScrollbar = () => {
535
- updateThumbSize()
536
- updateThumbOffset()
545
+ const isVScrollbar = computeIsVScrollbar.value
546
+ if (isVScrollbar) {
547
+ return nextTick().then(() => {
548
+ updateThumbSize()
549
+ updateThumbOffset()
550
+ })
551
+ }
552
+ return Promise.resolve()
537
553
  }
538
554
 
539
555
  /**
@@ -553,10 +569,11 @@ export default defineVxeComponent({
553
569
  parentHeight = parentEl.clientHeight - Math.ceil(XEUtils.toNumber(parentStyle.paddingLeft) + XEUtils.toNumber(parentStyle.paddingRight))
554
570
  }
555
571
  reactData.parentHeight = parentHeight
556
- updateScrollbar()
557
572
  updateHeight()
558
573
  if (el.clientWidth && el.clientHeight) {
559
- return computeScrollLoad()
574
+ return computeScrollLoad().then(() => {
575
+ updateScrollbar()
576
+ })
560
577
  }
561
578
  }
562
579
  return nextTick()
@@ -565,7 +582,7 @@ export default defineVxeComponent({
565
582
  const loadYData = (evnt: Event) => {
566
583
  const { scrollYStore } = internalData
567
584
  const { startIndex, endIndex, visibleSize, offsetSize, rowHeight } = scrollYStore
568
- const scrollBodyElem = evnt.target as HTMLDivElement
585
+ const scrollBodyElem = evnt.currentTarget as HTMLDivElement
569
586
  const scrollTop = scrollBodyElem.scrollTop
570
587
  const toVisibleIndex = Math.floor(scrollTop / rowHeight)
571
588
  const offsetStartIndex = Math.max(0, toVisibleIndex - 1 - offsetSize)
@@ -580,7 +597,7 @@ export default defineVxeComponent({
580
597
  }
581
598
 
582
599
  const scrollEvent = (evnt: Event) => {
583
- const scrollBodyElem = evnt.target as HTMLDivElement
600
+ const scrollBodyElem = evnt.currentTarget as HTMLDivElement
584
601
  const scrollTop = scrollBodyElem.scrollTop
585
602
  const scrollLeft = scrollBodyElem.scrollLeft
586
603
  const isX = scrollLeft !== internalData.lastScrollLeft
@@ -1610,6 +1627,10 @@ export default defineVxeComponent({
1610
1627
 
1611
1628
  const listMethods: ListMethods = {
1612
1629
  dispatchEvent,
1630
+ getScrollViewElem () {
1631
+ const viewEl = refVirtualWrapper.value
1632
+ return viewEl || null
1633
+ },
1613
1634
  loadData,
1614
1635
  /**
1615
1636
  * 重新加载数据
@@ -1940,173 +1961,24 @@ export default defineVxeComponent({
1940
1961
  }
1941
1962
  }
1942
1963
 
1943
- const updateThumbSize = () => {
1944
- const viewEl = refVirtualWrapper.value
1945
- if (!viewEl) {
1946
- return
1947
- }
1948
- if (!viewEl.clientHeight || !viewEl.clientHeight) {
1949
- return
1950
- }
1951
- const trackXEl = refTrackXElem.value
1952
- const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
1953
- const thumbXElem = refThumbXElem.value
1954
- if (thumbXElem) {
1955
- thumbXElem.style.width = xThumbWidth + 'px'
1956
- }
1957
- reactData.xThumbWidth = xThumbWidth
1958
-
1959
- const trackYEl = refTrackYElem.value
1960
-
1961
- const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
1962
- const thumbYElem = refThumbYElem.value
1963
- if (thumbYElem) {
1964
- thumbYElem.style.height = yThumbHeight + 'px'
1965
- }
1966
- reactData.yThumbHeight = yThumbHeight
1967
- }
1968
-
1969
- const updateThumbOffset = () => {
1970
- const viewEl = refVirtualWrapper.value
1971
- if (!viewEl) {
1972
- return
1973
- }
1974
- if (!viewEl.clientHeight || !viewEl.clientHeight) {
1975
- return
1976
- }
1977
- const { xThumbWidth, yThumbHeight } = reactData
1978
- const trackXEl = refTrackXElem.value
1979
- const thumbXElem = refThumbXElem.value
1980
- const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
1981
- internalData.xThumbLeft = xThumbLeft
1982
- if (thumbXElem && xThumbWidth) {
1983
- thumbXElem.style.width = xThumbWidth + 'px'
1984
- thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
1985
- }
1986
-
1987
- const trackYEl = refTrackYElem.value
1988
- const thumbYElem = refThumbYElem.value
1989
- const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
1990
- internalData.yThumbTop = yThumbTop
1991
- if (thumbYElem && yThumbHeight) {
1992
- thumbYElem.style.height = yThumbHeight + 'px'
1993
- thumbYElem.style.transform = `translateY(${yThumbTop}px)`
1994
- }
1995
- }
1996
-
1997
- const clickTrackXEvent = (evnt: MouseEvent) => {
1998
- const trackEl = evnt.currentTarget as HTMLDivElement
1999
- if (trackEl !== evnt.target) {
2000
- return
2001
- }
2002
- const viewEl = refVirtualWrapper.value
2003
- if (!viewEl) {
2004
- return
2005
- }
2006
- const { xThumbWidth } = reactData
2007
- const trackRect = trackEl.getBoundingClientRect()
2008
- viewEl.scrollTo({
2009
- left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
2010
- behavior: 'auto'
2011
- })
2012
- }
2013
-
2014
- const clickTrackYEvent = (evnt: MouseEvent) => {
2015
- const trackEl = evnt.currentTarget as HTMLDivElement
2016
- if (trackEl !== evnt.target) {
2017
- return
2018
- }
2019
- const viewEl = refVirtualWrapper.value
2020
- if (!viewEl) {
2021
- return
2022
- }
2023
- const { yThumbHeight } = reactData
2024
- const trackRect = trackEl.getBoundingClientRect()
2025
- viewEl.scrollTo({
2026
- top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
2027
- behavior: 'auto'
2028
- })
2029
- }
2030
-
2031
- const pointerdownThumbXEvent = (evnt: PointerEvent) => {
2032
- const thumbEl = evnt.currentTarget as HTMLDivElement
2033
- internalData.isThumbDrag = true
2034
- thumbEl.setPointerCapture(evnt.pointerId)
2035
-
2036
- const viewEl = refVirtualWrapper.value
2037
- if (!viewEl) {
2038
- return
2039
- }
2040
- const { xThumbWidth } = reactData
2041
- const trackEl = thumbEl.parentElement as HTMLDivElement
2042
- const trackRect = trackEl.getBoundingClientRect()
2043
- const pointerPosition = evnt.clientX - trackRect.left
2044
- // 记录 thumb 的偏移
2045
- const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
2046
- internalData.thumbDragOffset = pointerPosition - thumbOffset
2047
- }
2048
-
2049
- const pointermoveThumbXEvent = (evnt: PointerEvent) => {
2050
- const thumbEl = evnt.currentTarget as HTMLDivElement
2051
- if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
2052
- return
2053
- }
2054
- const { isThumbDrag, thumbDragOffset } = internalData
2055
- if (isThumbDrag) {
2056
- const viewEl = refVirtualWrapper.value
2057
- if (!viewEl) {
2058
- return
2059
- }
2060
- const { xThumbWidth } = reactData
2061
- const thumbEl = evnt.currentTarget as HTMLDivElement
2062
- const trackEl = thumbEl.parentElement as HTMLDivElement
2063
- const trackRect = trackEl.getBoundingClientRect()
2064
- // 更新偏移
2065
- viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
2066
- }
2067
- }
2068
-
2069
- const cleatPointerThumbEvent = (evnt: PointerEvent) => {
2070
- const thumbEl = evnt.currentTarget as HTMLDivElement
2071
- thumbEl.releasePointerCapture(evnt.pointerId)
2072
- internalData.isThumbDrag = false
2073
- }
2074
-
2075
- const pointerdownThumbYEvent = (evnt: PointerEvent) => {
2076
- const thumbEl = evnt.currentTarget as HTMLDivElement
2077
- internalData.isThumbDrag = true
2078
- thumbEl.setPointerCapture(evnt.pointerId)
2079
-
2080
- const viewEl = refVirtualWrapper.value
2081
- if (!viewEl) {
2082
- return
2083
- }
2084
- const { yThumbHeight } = reactData
2085
- const trackEl = thumbEl.parentElement as HTMLDivElement
2086
- const trackRect = trackEl.getBoundingClientRect()
2087
- const pointerPosition = evnt.clientY - trackRect.top
2088
- // 记录 thumb 的偏移
2089
- const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
2090
- internalData.thumbDragOffset = pointerPosition - thumbOffset
2091
- }
2092
-
2093
- const pointermoveThumbYEvent = (evnt: PointerEvent) => {
2094
- const thumbEl = evnt.currentTarget as HTMLDivElement
2095
- if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
2096
- return
2097
- }
2098
- const { isThumbDrag, thumbDragOffset } = internalData
2099
- if (isThumbDrag) {
2100
- const viewEl = refVirtualWrapper.value
2101
- if (!viewEl) {
2102
- return
1964
+ const bindScrollbarResize = () => {
1965
+ const { scrollObserver } = internalData
1966
+ const isVScrollbar = computeIsVScrollbar.value
1967
+ if (isVScrollbar) {
1968
+ if (!scrollObserver) {
1969
+ const el = refElem.value
1970
+ const viewInnerEl = refVirtualSpaceElem.value
1971
+ const scrollObserver = globalResize.create(() => {
1972
+ reScrollFlag.value++
1973
+ })
1974
+ if (el) {
1975
+ scrollObserver.observe(el)
1976
+ }
1977
+ if (viewInnerEl) {
1978
+ scrollObserver.observe(viewInnerEl)
1979
+ }
1980
+ internalData.scrollObserver = scrollObserver
2103
1981
  }
2104
- const { yThumbHeight } = reactData
2105
- const thumbEl = evnt.currentTarget as HTMLDivElement
2106
- const trackEl = thumbEl.parentElement as HTMLDivElement
2107
- const trackRect = trackEl.getBoundingClientRect()
2108
- // 更新偏移
2109
- viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
2110
1982
  }
2111
1983
  }
2112
1984
 
@@ -2348,12 +2220,13 @@ export default defineVxeComponent({
2348
2220
  }
2349
2221
 
2350
2222
  const renderVN = () => {
2351
- const { showCheckbox, className, loading, useScrollbar } = props
2223
+ const { showCheckbox, className, loading } = props
2352
2224
  const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate, xThumbWidth, yThumbHeight } = reactData
2353
2225
  const defaultSlot = slots.default
2354
2226
  const headerSlot = slots.header
2355
2227
  const footerSlot = slots.footer
2356
2228
  const vSize = computeSize.value
2229
+ const isVScrollbar = computeIsVScrollbar.value
2357
2230
  const wrapperStyles = computeWrapperStyles.value
2358
2231
  const virtualStyles = computeVirtualStyles.value
2359
2232
  const radioOpts = computeRadioOpts.value
@@ -2384,17 +2257,17 @@ export default defineVxeComponent({
2384
2257
  ref: refElem,
2385
2258
  class: [
2386
2259
  'vxe-list',
2387
- useScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
2388
- useScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
2389
- useScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
2390
- useScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
2260
+ isVScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
2261
+ isVScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
2262
+ isVScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
2263
+ isVScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
2391
2264
  className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '',
2392
2265
  {
2393
2266
  [`size--${vSize}`]: vSize,
2394
- 'is--virtual-scrollbar': useScrollbar,
2395
- 'ov-padding': useScrollbar && scrollbarOpts.padding,
2396
- 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
2397
- 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
2267
+ 'is--virtual-scrollbar': isVScrollbar,
2268
+ 'ov-padding': isVScrollbar && scrollbarOpts.padding,
2269
+ 'ov-x--auto-hide': isVScrollbar && scrollXAutoHide,
2270
+ 'ov-y--auto-hide': isVScrollbar && scrollYAutoHide,
2398
2271
  'overflow-y': yThumbHeight,
2399
2272
  'overflow-x': xThumbWidth,
2400
2273
  'is--drag': isDrag,
@@ -2443,6 +2316,7 @@ export default defineVxeComponent({
2443
2316
  onScroll: scrollEvent
2444
2317
  }, [
2445
2318
  h('div', {
2319
+ ref: refVirtualSpaceElem,
2446
2320
  class: 'vxe-list--y-space',
2447
2321
  style: {
2448
2322
  height: bodyHeight ? `${bodyHeight}px` : ''
@@ -2471,7 +2345,7 @@ export default defineVxeComponent({
2471
2345
  /**
2472
2346
  * 滚动条
2473
2347
  */
2474
- useScrollbar
2348
+ isVScrollbar
2475
2349
  ? h('div', {
2476
2350
  class: scrollbarWrapperClss
2477
2351
  }, [
@@ -2536,44 +2410,56 @@ export default defineVxeComponent({
2536
2410
  loadData(props.data || [])
2537
2411
  })
2538
2412
 
2539
- const reFlag = ref(0)
2413
+ const reScrollFlag = ref(0)
2414
+ const reLayoutFlag = ref(0)
2540
2415
  watch(() => props.height, () => {
2541
- reFlag.value++
2416
+ reLayoutFlag.value++
2542
2417
  })
2543
2418
  watch(() => props.maxHeight, () => {
2544
- reFlag.value++
2419
+ reLayoutFlag.value++
2545
2420
  })
2546
2421
  watch(() => props.syncResize, () => {
2547
- reFlag.value++
2422
+ reLayoutFlag.value++
2548
2423
  })
2549
- watch(() => props.useScrollbar, () => {
2550
- reFlag.value++
2424
+ watch(computeIsVScrollbar, () => {
2425
+ nextTick(() => {
2426
+ bindScrollbarResize()
2427
+ nextTick(() => {
2428
+ reLayoutFlag.value++
2429
+ })
2430
+ })
2551
2431
  })
2552
2432
  watch(computeRowHeight, () => {
2553
- reFlag.value++
2433
+ reLayoutFlag.value++
2554
2434
  })
2555
2435
  watch(computeScrollYWidth, () => {
2556
- reFlag.value++
2436
+ reLayoutFlag.value++
2557
2437
  })
2558
2438
  watch(computeScrollXHeight, () => {
2559
- reFlag.value++
2439
+ reLayoutFlag.value++
2560
2440
  })
2561
2441
  watch(computeScrollXVisible, () => {
2562
2442
  nextTick(() => {
2563
- reFlag.value++
2443
+ reLayoutFlag.value++
2564
2444
  })
2565
2445
  })
2566
2446
  watch(computeScrollYVisible, () => {
2567
2447
  nextTick(() => {
2568
- reFlag.value++
2448
+ reLayoutFlag.value++
2569
2449
  })
2570
2450
  })
2571
- watch(reFlag, () => {
2451
+ watch(reLayoutFlag, () => {
2572
2452
  recalculate().then(() => {
2573
2453
  recalculate()
2574
2454
  })
2575
2455
  })
2576
2456
 
2457
+ watch(reScrollFlag, () => {
2458
+ updateScrollbar().then(() => {
2459
+ updateScrollbar()
2460
+ })
2461
+ })
2462
+
2577
2463
  watch(() => props.checkRowKey, () => {
2578
2464
  updateRadioModeValue()
2579
2465
  })
@@ -2600,7 +2486,7 @@ export default defineVxeComponent({
2600
2486
  })
2601
2487
 
2602
2488
  onMounted(() => {
2603
- const { showSeq, showRadio, showCheckbox, autoResize, useScrollbar } = props
2489
+ const { showSeq, showRadio, showCheckbox, autoResize } = props
2604
2490
  const rowOpts = computeRowOpts.value
2605
2491
  const { useKey } = rowOpts
2606
2492
 
@@ -2623,25 +2509,12 @@ export default defineVxeComponent({
2623
2509
  if (useKey && !keyField) {
2624
2510
  errLog('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField'])
2625
2511
  }
2626
- const el = refElem.value
2627
- if (useScrollbar) {
2628
- const viewInnerEl = refVirtualBody.value
2629
- const scrollObserver = globalResize.create(() => {
2630
- reFlag.value++
2631
- })
2632
- if (el) {
2633
- scrollObserver.observe(el)
2634
- }
2635
- if (viewInnerEl) {
2636
- scrollObserver.observe(viewInnerEl)
2637
- }
2638
- internalData.scrollObserver = scrollObserver
2639
- }
2640
2512
  if (autoResize) {
2513
+ const el = refElem.value
2641
2514
  const parentEl = getParentElem()
2642
2515
  const resizeObserver = globalResize.create(() => {
2643
2516
  if (props.autoResize) {
2644
- reFlag.value++
2517
+ reLayoutFlag.value++
2645
2518
  }
2646
2519
  })
2647
2520
  if (el) {
@@ -2652,9 +2525,10 @@ export default defineVxeComponent({
2652
2525
  }
2653
2526
  internalData.resizeObserver = resizeObserver
2654
2527
  }
2655
- reFlag.value++
2528
+ reLayoutFlag.value++
2529
+ bindScrollbarResize()
2656
2530
  globalEvents.on($xeList, 'resize', () => {
2657
- reFlag.value++
2531
+ reLayoutFlag.value++
2658
2532
  })
2659
2533
  })
2660
2534
 
@@ -1,7 +1,7 @@
1
1
  import { ref, h, reactive, Teleport, PropType, inject, resolveComponent, watch, VNode, computed, nextTick, onBeforeUnmount, onMounted } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
- import { VxeUI, createEvent, permission, useSize, globalEvents, renderEmptyElement } from '../../ui'
4
+ import { VxeUI, createEvent, permission, globalEvents, renderEmptyElement } from '../../ui'
5
5
  import { getPopupContainer, scrollToView, toCssUnit } from '../../ui/src/dom'
6
6
  import { getLastZIndex, nextZIndex, isEnableConf, getDefaultConfig } from '../../ui/src/utils'
7
7
  import { getSlotVNs } from '../../ui/src/vn'
@@ -13,7 +13,7 @@ import type { VxeMenuDefines, VxeMenuPropTypes, MenuInternalData, MenuReactData,
13
13
 
14
14
  const { errLog } = createComponentLog('menu')
15
15
 
16
- const { menus, getConfig, getIcon } = VxeUI
16
+ const { menus, useFns, getConfig, getIcon } = VxeUI
17
17
 
18
18
  function createInternalData (): MenuInternalData {
19
19
  return {
@@ -100,7 +100,8 @@ export default defineVxeComponent({
100
100
  const refCollapseBodyElem = ref<HTMLDivElement>()
101
101
  const refCollapseBodyScrollbar = ref<VxeScrollbarInstance>()
102
102
 
103
- const { computeSize } = useSize(props)
103
+ const { computeSize } = useFns.useSize(props)
104
+ const { computeIsVScrollbar } = useFns.useVScrollbar(props)
104
105
 
105
106
  const reactData = reactive(createReactData())
106
107
  const internalData = createInternalData()
@@ -701,9 +702,10 @@ export default defineVxeComponent({
701
702
  }
702
703
 
703
704
  const renderVN = () => {
704
- const { loading, collapseFixed, appendTo, useScrollbar } = props
705
+ const { loading, collapseFixed, appendTo } = props
705
706
  const { initialized, menuList, collapseStyle, isEnterCollapse } = reactData
706
707
  const vSize = computeSize.value
708
+ const isVScrollbar = computeIsVScrollbar.value
707
709
  const isCollapsed = computeIsCollapsed.value
708
710
  const currBorder = computeCurrBorder.value
709
711
  const varStyle = computeVarStyle.value
@@ -762,7 +764,7 @@ export default defineVxeComponent({
762
764
  class: 'vxe-menu--header'
763
765
  }, headerSlot(stParams))
764
766
  : renderEmptyElement($xeMenu),
765
- useScrollbar && isEnterCollapse
767
+ isVScrollbar && isEnterCollapse
766
768
  ? h(VxeScrollbarComponent, {
767
769
  ref: refCollapseBodyScrollbar,
768
770
  class: 'vxe-menu--scrollbar-body',
@@ -3,7 +3,7 @@ import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
4
  import { getEventTargetNode, getPopupContainer, getPopupWrapperElement, isScale, toCssUnit } from '../../ui/src/dom'
5
5
  import { getLastZIndex, nextZIndex, getSubLastZIndex, nextSubZIndex, getFuncText, handleBooleanDefaultValue, getDefaultConfig } from '../../ui/src/utils'
6
- import { VxeUI, getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useSize, renderEmptyElement } from '../../ui'
6
+ import { VxeUI, getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useFns, renderEmptyElement } from '../../ui'
7
7
  import { getSlotVNs } from '../../ui/src/vn'
8
8
  import { createComponentLog } from '../../ui/src/log'
9
9
  import { allActiveModals } from './store'
@@ -266,7 +266,8 @@ export default defineVxeComponent({
266
266
  const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
267
267
  const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods)| null>('$xeForm', null)
268
268
 
269
- const { computeSize } = useSize(props)
269
+ const { computeSize } = useFns.useSize(props)
270
+ const { computeIsVScrollbar } = useFns.useVScrollbar(props)
270
271
 
271
272
  const reactData = reactive(createReactData())
272
273
  const internalData = createInternalData()
@@ -1398,8 +1399,9 @@ export default defineVxeComponent({
1398
1399
  }
1399
1400
 
1400
1401
  const renderBody = () => {
1401
- const { slots: propSlots = {}, status, message, iconStatus, useScrollbar, useHtml } = props
1402
+ const { slots: propSlots = {}, status, message, iconStatus, useHtml } = props
1402
1403
  const content = props.content || message
1404
+ const isVScrollbar = computeIsVScrollbar.value
1403
1405
  const isMsg = computeIsMsg.value
1404
1406
  const scrollbarProps = computeScrollbarProps.value
1405
1407
  const defaultSlot = slots.default || propSlots.default
@@ -1420,7 +1422,7 @@ export default defineVxeComponent({
1420
1422
 
1421
1423
  if (useHtml && !defaultSlot) {
1422
1424
  contVNs.push(
1423
- useScrollbar
1425
+ isVScrollbar
1424
1426
  ? h(VxeScrollbarComponent, {
1425
1427
  key: 'shc',
1426
1428
  class: 'vxe-modal--scrollbar-content',
@@ -1443,7 +1445,7 @@ export default defineVxeComponent({
1443
1445
  )
1444
1446
  } else {
1445
1447
  contVNs.push(
1446
- useScrollbar
1448
+ isVScrollbar
1447
1449
  ? h(VxeScrollbarComponent, {
1448
1450
  key: 'sdc',
1449
1451
  class: 'vxe-modal--scrollbar-content',