vxe-pc-ui 4.19.7 → 4.20.0

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 (100) hide show
  1. package/dist/all.esm.js +2206 -1851
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/card/src/card.js +35 -12
  5. package/es/card/style.css +42 -44
  6. package/es/card/style.min.css +1 -1
  7. package/es/icon/style.css +1 -1
  8. package/es/list/src/list.js +323 -19
  9. package/es/list/style.css +26 -0
  10. package/es/list/style.min.css +1 -1
  11. package/es/scrollbar/src/scrollbar.js +9 -1
  12. package/es/scrollbar/style.css +6 -5
  13. package/es/scrollbar/style.min.css +1 -1
  14. package/es/style.css +1 -1
  15. package/es/style.min.css +1 -1
  16. package/es/tabs/src/tabs.js +27 -8
  17. package/es/tabs/style.css +4 -2
  18. package/es/tabs/style.min.css +1 -1
  19. package/es/tree/src/tree.js +6 -2
  20. package/es/ui/index.js +1 -1
  21. package/es/ui/src/log.js +1 -1
  22. package/es/ui/src/utils.js +9 -0
  23. package/es/vxe-card/style.css +42 -44
  24. package/es/vxe-card/style.min.css +1 -1
  25. package/es/vxe-list/style.css +26 -0
  26. package/es/vxe-list/style.min.css +1 -1
  27. package/es/vxe-scrollbar/style.css +6 -5
  28. package/es/vxe-scrollbar/style.min.css +1 -1
  29. package/es/vxe-tabs/style.css +4 -2
  30. package/es/vxe-tabs/style.min.css +1 -1
  31. package/lib/card/src/card.js +42 -6
  32. package/lib/card/src/card.min.js +1 -1
  33. package/lib/card/style/style.css +42 -44
  34. package/lib/card/style/style.min.css +1 -1
  35. package/lib/icon/style/style.css +1 -1
  36. package/lib/icon/style/style.min.css +1 -1
  37. package/lib/index.umd.js +2785 -2383
  38. package/lib/index.umd.min.js +1 -1
  39. package/lib/list/src/list.js +333 -20
  40. package/lib/list/src/list.min.js +1 -1
  41. package/lib/list/style/style.css +26 -0
  42. package/lib/list/style/style.min.css +1 -1
  43. package/lib/scrollbar/src/scrollbar.js +9 -1
  44. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  45. package/lib/scrollbar/style/style.css +6 -5
  46. package/lib/scrollbar/style/style.min.css +1 -1
  47. package/lib/style.css +1 -1
  48. package/lib/style.min.css +1 -1
  49. package/lib/tabs/src/tabs.js +40 -8
  50. package/lib/tabs/src/tabs.min.js +1 -1
  51. package/lib/tabs/style/style.css +4 -2
  52. package/lib/tabs/style/style.min.css +1 -1
  53. package/lib/tree/src/tree.js +5 -1
  54. package/lib/tree/src/tree.min.js +1 -1
  55. package/lib/ui/index.js +1 -1
  56. package/lib/ui/index.min.js +1 -1
  57. package/lib/ui/src/log.js +1 -1
  58. package/lib/ui/src/log.min.js +1 -1
  59. package/lib/ui/src/utils.js +10 -0
  60. package/lib/ui/src/utils.min.js +1 -1
  61. package/lib/vxe-card/style/style.css +42 -44
  62. package/lib/vxe-card/style/style.min.css +1 -1
  63. package/lib/vxe-list/style/style.css +26 -0
  64. package/lib/vxe-list/style/style.min.css +1 -1
  65. package/lib/vxe-scrollbar/style/style.css +6 -5
  66. package/lib/vxe-scrollbar/style/style.min.css +1 -1
  67. package/lib/vxe-tabs/style/style.css +4 -2
  68. package/lib/vxe-tabs/style/style.min.css +1 -1
  69. package/package.json +1 -1
  70. package/packages/card/src/card.ts +55 -12
  71. package/packages/list/src/list.ts +351 -19
  72. package/packages/scrollbar/src/scrollbar.ts +10 -1
  73. package/packages/tabs/src/tabs.ts +34 -8
  74. package/packages/tree/src/tree.ts +6 -2
  75. package/packages/ui/src/utils.ts +10 -0
  76. package/styles/components/card.scss +44 -58
  77. package/styles/components/list.scss +51 -0
  78. package/styles/components/scrollbar.scss +18 -11
  79. package/styles/components/tabs.scss +2 -1
  80. package/types/components/card.d.ts +11 -0
  81. package/types/components/grid.d.ts +37 -0
  82. package/types/components/layout-aside.d.ts +7 -1
  83. package/types/components/layout-body.d.ts +7 -1
  84. package/types/components/list.d.ts +24 -2
  85. package/types/components/menu.d.ts +6 -0
  86. package/types/components/table-plugins/extend-cell-area.d.ts +1 -1
  87. package/types/components/table.d.ts +25 -2
  88. package/types/components/tabs.d.ts +11 -0
  89. /package/es/icon/{iconfont.1791794447472.ttf → iconfont.1791880413927.ttf} +0 -0
  90. /package/es/icon/{iconfont.1791794447472.woff → iconfont.1791880413927.woff} +0 -0
  91. /package/es/icon/{iconfont.1791794447472.woff2 → iconfont.1791880413927.woff2} +0 -0
  92. /package/es/{iconfont.1791794447472.ttf → iconfont.1791880413927.ttf} +0 -0
  93. /package/es/{iconfont.1791794447472.woff → iconfont.1791880413927.woff} +0 -0
  94. /package/es/{iconfont.1791794447472.woff2 → iconfont.1791880413927.woff2} +0 -0
  95. /package/lib/icon/style/{iconfont.1791794447472.ttf → iconfont.1791880413927.ttf} +0 -0
  96. /package/lib/icon/style/{iconfont.1791794447472.woff → iconfont.1791880413927.woff} +0 -0
  97. /package/lib/icon/style/{iconfont.1791794447472.woff2 → iconfont.1791880413927.woff2} +0 -0
  98. /package/lib/{iconfont.1791794447472.ttf → iconfont.1791880413927.ttf} +0 -0
  99. /package/lib/{iconfont.1791794447472.woff → iconfont.1791880413927.woff} +0 -0
  100. /package/lib/{iconfont.1791794447472.woff2 → iconfont.1791880413927.woff2} +0 -0
@@ -13,7 +13,8 @@ var _dom = require("../../ui/src/dom");
13
13
  var _utils = require("../../ui/src/utils");
14
14
  var _log = require("../../ui/src/log");
15
15
  var _anime = require("../../ui/src/anime");
16
- var _util = require("./util");
16
+ var _util = require("../../scrollbar/src/util");
17
+ var _util2 = require("./util");
17
18
  var _loading = _interopRequireDefault(require("../../loading"));
18
19
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
20
  const {
@@ -46,6 +47,9 @@ function createReactData() {
46
47
  updateCheckboxFlag: 1,
47
48
  isAllChecked: false,
48
49
  isAllIndeterminate: false,
50
+ // 滚动条
51
+ yThumbHeight: 0,
52
+ xThumbWidth: 0,
49
53
  insertRowFlag: 1,
50
54
  removeRowFlag: 1,
51
55
  dragRow: null,
@@ -55,13 +59,18 @@ function createReactData() {
55
59
  }
56
60
  function createInternalData() {
57
61
  return {
58
- resizeObserver: undefined,
59
62
  fullData: [],
60
63
  afterList: [],
61
64
  fullKeyMaps: {},
62
65
  rowMaps: {},
63
- lastScrollLeft: 0,
66
+ // 滚动条
67
+ // resizeObserver: undefined,
68
+ // isThumbDrag: false,
69
+ thumbDragOffset: 0,
70
+ yThumbTop: 0,
71
+ xThumbLeft: 0,
64
72
  lastScrollTop: 0,
73
+ lastScrollLeft: 0,
65
74
  scrollYStore: {
66
75
  startIndex: 0,
67
76
  endIndex: 0,
@@ -115,7 +124,12 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
115
124
  dragConfig: Object,
116
125
  menuConfig: Object,
117
126
  virtualYConfig: Object,
118
- scrollY: Object
127
+ scrollY: Object,
128
+ useScrollbar: {
129
+ type: Boolean,
130
+ default: () => (0, _ui.getConfig)().list.useScrollbar
131
+ },
132
+ scrollbarConfig: Object
119
133
  },
120
134
  emits: ['update:checkRowKey', 'update:checkRowKeys', 'row-click', 'row-dblclick', 'current-change', 'radio-change', 'checkbox-change', 'checkbox-all', 'scroll', 'row-dragstart', 'row-dragover', 'row-dragend', 'row-remove-dragend', 'row-insert-dragend', 'row-menu', 'menu-click'],
121
135
  setup(props, context) {
@@ -136,6 +150,11 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
136
150
  const refFooterElem = (0, _vue.ref)();
137
151
  const refVirtualWrapper = (0, _vue.ref)();
138
152
  const refVirtualBody = (0, _vue.ref)();
153
+ const refViewInnerElem = (0, _vue.ref)();
154
+ const refTrackXElem = (0, _vue.ref)();
155
+ const refTrackYElem = (0, _vue.ref)();
156
+ const refThumbXElem = (0, _vue.ref)();
157
+ const refThumbYElem = (0, _vue.ref)();
139
158
  const refDragRowLineElem = (0, _vue.ref)();
140
159
  const refDragTipElem = (0, _vue.ref)();
141
160
  const refMaps = {
@@ -194,11 +213,19 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
194
213
  });
195
214
  const computeWrapperStyles = (0, _vue.computed)(() => {
196
215
  const rowHeight = computeRowHeight.value;
197
- const style = {};
216
+ const scrollbarXOpts = computeScrollbarXOpts.value;
217
+ const scrollbarYOpts = computeScrollbarYOpts.value;
218
+ const stys = {};
198
219
  if (rowHeight) {
199
- style['--vxe-ui-list-row-height'] = (0, _dom.toCssUnit)(rowHeight);
220
+ stys['--vxe-ui-list-row-height'] = (0, _dom.toCssUnit)(rowHeight);
200
221
  }
201
- return style;
222
+ if (scrollbarYOpts.width) {
223
+ stys['--vxe-ui-scrollbar-y-width'] = (0, _dom.toCssUnit)(scrollbarYOpts.width);
224
+ }
225
+ if (scrollbarXOpts.height) {
226
+ stys['--vxe-ui-scrollbar-x-height'] = (0, _dom.toCssUnit)(scrollbarXOpts.height);
227
+ }
228
+ return stys;
202
229
  });
203
230
  const computeVirtualStyles = (0, _vue.computed)(() => {
204
231
  const {
@@ -220,6 +247,46 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
220
247
  }
221
248
  return style;
222
249
  });
250
+ const computeScrollbarOpts = (0, _vue.computed)(() => {
251
+ return Object.assign({}, (0, _ui.getConfig)().list.scrollbarConfig, props.scrollbarConfig);
252
+ });
253
+ const computeScrollbarXOpts = (0, _vue.computed)(() => {
254
+ const scrollbarOpts = computeScrollbarOpts.value;
255
+ return Object.assign({}, (0, _ui.getConfig)().scrollbar.xConfig, scrollbarOpts.xConfig);
256
+ });
257
+ const computeScrollbarYOpts = (0, _vue.computed)(() => {
258
+ const scrollbarOpts = computeScrollbarOpts.value;
259
+ return Object.assign({}, (0, _ui.getConfig)().scrollbar.yConfig, scrollbarOpts.yConfig);
260
+ });
261
+ const computeScrollbarWrapperClss = (0, _vue.computed)(() => {
262
+ const scrollbarOpts = computeScrollbarOpts.value;
263
+ const {
264
+ padding
265
+ } = scrollbarOpts;
266
+ const {
267
+ yThumbHeight,
268
+ xThumbWidth
269
+ } = reactData;
270
+ const scrollbarXOpts = computeScrollbarXOpts.value;
271
+ const scrollbarYOpts = computeScrollbarYOpts.value;
272
+ const scrollbarXToTop = computeScrollbarXToTop.value;
273
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
274
+ return _ui.domUtils.buildClass(['vxe-scrollbar is--virtual', `ov-x--${scrollbarXOpts.visible || 'visible'}`, `ov-y--${scrollbarYOpts.visible || 'visible'}`, `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`], {
275
+ 'is--padding': padding,
276
+ 'ov-x--auto-hide': scrollbarXOpts.autoHide,
277
+ 'ov-y--auto-hide': scrollbarYOpts.autoHide,
278
+ 'overflow-y': yThumbHeight,
279
+ 'overflow-x': xThumbWidth
280
+ });
281
+ });
282
+ const computeScrollbarXToTop = (0, _vue.computed)(() => {
283
+ const scrollbarXOpts = computeScrollbarXOpts.value;
284
+ return scrollbarXOpts.position === 'top';
285
+ });
286
+ const computeScrollbarYToLeft = (0, _vue.computed)(() => {
287
+ const scrollbarYOpts = computeScrollbarYOpts.value;
288
+ return scrollbarYOpts.position === 'left';
289
+ });
223
290
  const dispatchEvent = (type, params, evnt) => {
224
291
  emit(type, (0, _ui.createEvent)(evnt, {
225
292
  $list: $xeList
@@ -397,6 +464,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
397
464
  lastScrollLeft,
398
465
  lastScrollTop
399
466
  } = internalData;
467
+ updateScrollbar();
400
468
  return clearScroll().then(() => {
401
469
  if (lastScrollLeft || lastScrollTop) {
402
470
  internalData.lastScrollLeft = 0;
@@ -405,19 +473,28 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
405
473
  }
406
474
  });
407
475
  };
476
+ const updateScrollbar = () => {
477
+ updateThumbSize();
478
+ updateThumbOffset();
479
+ };
408
480
  /**
409
481
  * 重新计算列表
410
482
  */
411
483
  const recalculate = () => {
412
484
  const el = refElem.value;
413
485
  if (el) {
414
- const parentEl = el.parentElement;
486
+ let parentEl = el.parentElement;
415
487
  let parentHeight = 0;
488
+ // 如果是虚拟滚动条
489
+ if (parentEl && (0, _dom.hasClass)(parentEl, 'vxe-scrollbar--view-inner')) {
490
+ parentEl = parentEl.parentElement;
491
+ }
416
492
  if (parentEl) {
417
493
  const parentStyle = getComputedStyle(parentEl);
418
494
  parentHeight = parentEl.clientHeight - Math.ceil(_xeUtils.default.toNumber(parentStyle.paddingLeft) + _xeUtils.default.toNumber(parentStyle.paddingRight));
419
495
  }
420
496
  reactData.parentHeight = parentHeight;
497
+ updateScrollbar();
421
498
  updateHeight();
422
499
  if (el.clientWidth && el.clientHeight) {
423
500
  return computeScrollLoad();
@@ -455,6 +532,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
455
532
  const scrollLeft = scrollBodyElem.scrollLeft;
456
533
  const isX = scrollLeft !== internalData.lastScrollLeft;
457
534
  const isY = scrollTop !== internalData.lastScrollTop;
535
+ updateThumbOffset();
458
536
  internalData.lastScrollTop = scrollTop;
459
537
  internalData.lastScrollLeft = scrollLeft;
460
538
  if (reactData.scrollYLoad) {
@@ -1442,7 +1520,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1442
1520
  const funcName = isAppend ? 'push' : 'unshift';
1443
1521
  newRecords.forEach(item => {
1444
1522
  const rowid = getRowIdByField(item, keyField);
1445
- const rowRest = (0, _util.getItemCacheObj)(item);
1523
+ const rowRest = (0, _util2.getItemCacheObj)(item);
1446
1524
  fullData[funcName](item);
1447
1525
  rowMaps[rowid] = rowRest;
1448
1526
  });
@@ -1489,7 +1567,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1489
1567
  if (rowIndex > -1) {
1490
1568
  newRecords.forEach(item => {
1491
1569
  const rowid = getRowIdByField(item, keyField);
1492
- const rowRest = (0, _util.getItemCacheObj)(item);
1570
+ const rowRest = (0, _util2.getItemCacheObj)(item);
1493
1571
  rowMaps[rowid] = rowRest;
1494
1572
  });
1495
1573
  let targetIndex = rowIndex;
@@ -1961,6 +2039,183 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1961
2039
  hideDropTip();
1962
2040
  }
1963
2041
  };
2042
+ const updateThumbSize = () => {
2043
+ const viewEl = refVirtualWrapper.value;
2044
+ if (!viewEl) {
2045
+ return;
2046
+ }
2047
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
2048
+ return;
2049
+ }
2050
+ const trackXEl = refTrackXElem.value;
2051
+ const xThumbWidth = trackXEl ? (0, _util.getThumbSize)(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
2052
+ const thumbXElem = refThumbXElem.value;
2053
+ if (thumbXElem) {
2054
+ thumbXElem.style.width = xThumbWidth + 'px';
2055
+ }
2056
+ reactData.xThumbWidth = xThumbWidth;
2057
+ const trackYEl = refTrackYElem.value;
2058
+ const yThumbHeight = trackYEl ? (0, _util.getThumbSize)(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
2059
+ const thumbYElem = refThumbYElem.value;
2060
+ if (thumbYElem) {
2061
+ thumbYElem.style.height = yThumbHeight + 'px';
2062
+ }
2063
+ reactData.yThumbHeight = yThumbHeight;
2064
+ };
2065
+ const updateThumbOffset = () => {
2066
+ const viewEl = refVirtualWrapper.value;
2067
+ if (!viewEl) {
2068
+ return;
2069
+ }
2070
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
2071
+ return;
2072
+ }
2073
+ const {
2074
+ xThumbWidth,
2075
+ yThumbHeight
2076
+ } = reactData;
2077
+ const trackXEl = refTrackXElem.value;
2078
+ const thumbXElem = refThumbXElem.value;
2079
+ const xThumbLeft = trackXEl && xThumbWidth ? (0, _util.getThumbOffsetSize)(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
2080
+ internalData.xThumbLeft = xThumbLeft;
2081
+ if (thumbXElem && xThumbWidth) {
2082
+ thumbXElem.style.width = xThumbWidth + 'px';
2083
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
2084
+ }
2085
+ const trackYEl = refTrackYElem.value;
2086
+ const thumbYElem = refThumbYElem.value;
2087
+ const yThumbTop = trackYEl && yThumbHeight ? (0, _util.getThumbOffsetSize)(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
2088
+ internalData.yThumbTop = yThumbTop;
2089
+ if (thumbYElem && yThumbHeight) {
2090
+ thumbYElem.style.height = yThumbHeight + 'px';
2091
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
2092
+ }
2093
+ };
2094
+ const clickTrackXEvent = evnt => {
2095
+ const trackEl = evnt.currentTarget;
2096
+ if (trackEl !== evnt.target) {
2097
+ return;
2098
+ }
2099
+ const viewEl = refVirtualWrapper.value;
2100
+ if (!viewEl) {
2101
+ return;
2102
+ }
2103
+ const {
2104
+ xThumbWidth
2105
+ } = reactData;
2106
+ const trackRect = trackEl.getBoundingClientRect();
2107
+ viewEl.scrollTo({
2108
+ left: (0, _util.getScrollFromClick)(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
2109
+ behavior: 'auto'
2110
+ });
2111
+ };
2112
+ const clickTrackYEvent = evnt => {
2113
+ const trackEl = evnt.currentTarget;
2114
+ if (trackEl !== evnt.target) {
2115
+ return;
2116
+ }
2117
+ const viewEl = refVirtualWrapper.value;
2118
+ if (!viewEl) {
2119
+ return;
2120
+ }
2121
+ const {
2122
+ yThumbHeight
2123
+ } = reactData;
2124
+ const trackRect = trackEl.getBoundingClientRect();
2125
+ viewEl.scrollTo({
2126
+ top: (0, _util.getScrollFromClick)(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
2127
+ behavior: 'auto'
2128
+ });
2129
+ };
2130
+ const pointerdownThumbXEvent = evnt => {
2131
+ const thumbEl = evnt.currentTarget;
2132
+ internalData.isThumbDrag = true;
2133
+ thumbEl.setPointerCapture(evnt.pointerId);
2134
+ const viewEl = refVirtualWrapper.value;
2135
+ if (!viewEl) {
2136
+ return;
2137
+ }
2138
+ const {
2139
+ xThumbWidth
2140
+ } = reactData;
2141
+ const trackEl = thumbEl.parentElement;
2142
+ const trackRect = trackEl.getBoundingClientRect();
2143
+ const pointerPosition = evnt.clientX - trackRect.left;
2144
+ // 记录 thumb 的偏移
2145
+ const thumbOffset = (0, _util.getThumbOffsetSize)(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
2146
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
2147
+ };
2148
+ const pointermoveThumbXEvent = evnt => {
2149
+ const thumbEl = evnt.currentTarget;
2150
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
2151
+ return;
2152
+ }
2153
+ const {
2154
+ isThumbDrag,
2155
+ thumbDragOffset
2156
+ } = internalData;
2157
+ if (isThumbDrag) {
2158
+ const viewEl = refVirtualWrapper.value;
2159
+ if (!viewEl) {
2160
+ return;
2161
+ }
2162
+ const {
2163
+ xThumbWidth
2164
+ } = reactData;
2165
+ const thumbEl = evnt.currentTarget;
2166
+ const trackEl = thumbEl.parentElement;
2167
+ const trackRect = trackEl.getBoundingClientRect();
2168
+ // 更新偏移
2169
+ viewEl.scrollLeft = (0, _util.getScrollFromDrag)(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
2170
+ }
2171
+ };
2172
+ const cleatPointerThumbEvent = evnt => {
2173
+ const thumbEl = evnt.currentTarget;
2174
+ thumbEl.releasePointerCapture(evnt.pointerId);
2175
+ internalData.isThumbDrag = false;
2176
+ };
2177
+ const pointerdownThumbYEvent = evnt => {
2178
+ const thumbEl = evnt.currentTarget;
2179
+ internalData.isThumbDrag = true;
2180
+ thumbEl.setPointerCapture(evnt.pointerId);
2181
+ const viewEl = refVirtualWrapper.value;
2182
+ if (!viewEl) {
2183
+ return;
2184
+ }
2185
+ const {
2186
+ yThumbHeight
2187
+ } = reactData;
2188
+ const trackEl = thumbEl.parentElement;
2189
+ const trackRect = trackEl.getBoundingClientRect();
2190
+ const pointerPosition = evnt.clientY - trackRect.top;
2191
+ // 记录 thumb 的偏移
2192
+ const thumbOffset = (0, _util.getThumbOffsetSize)(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
2193
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
2194
+ };
2195
+ const pointermoveThumbYEvent = evnt => {
2196
+ const thumbEl = evnt.currentTarget;
2197
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
2198
+ return;
2199
+ }
2200
+ const {
2201
+ isThumbDrag,
2202
+ thumbDragOffset
2203
+ } = internalData;
2204
+ if (isThumbDrag) {
2205
+ const viewEl = refVirtualWrapper.value;
2206
+ if (!viewEl) {
2207
+ return;
2208
+ }
2209
+ const {
2210
+ yThumbHeight
2211
+ } = reactData;
2212
+ const thumbEl = evnt.currentTarget;
2213
+ const trackEl = thumbEl.parentElement;
2214
+ const trackRect = trackEl.getBoundingClientRect();
2215
+ // 更新偏移
2216
+ viewEl.scrollTop = (0, _util.getScrollFromDrag)(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
2217
+ }
2218
+ };
1964
2219
  Object.assign($xeList, listMethods, listPrivateMethods);
1965
2220
  const renderDragTip = () => {
1966
2221
  const {
@@ -2193,7 +2448,8 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
2193
2448
  const {
2194
2449
  showCheckbox,
2195
2450
  className,
2196
- loading
2451
+ loading,
2452
+ useScrollbar
2197
2453
  } = props;
2198
2454
  const {
2199
2455
  bodyHeight,
@@ -2225,6 +2481,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
2225
2481
  padding
2226
2482
  } = rowOpts;
2227
2483
  const isDrag = computeIsDrag.value;
2484
+ const scrollbarXOpts = computeScrollbarXOpts.value;
2485
+ const scrollbarYOpts = computeScrollbarYOpts.value;
2486
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value;
2228
2487
  const showDefChekboxHead = showCheckbox && showHeader !== false;
2229
2488
  const leOns = {};
2230
2489
  if (isCrossListDrag && !rowList.length) {
@@ -2236,6 +2495,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
2236
2495
  $list: $xeList
2237
2496
  }) : className : '', {
2238
2497
  [`size--${vSize}`]: vSize,
2498
+ 'is--virtual-scrollbar': useScrollbar,
2499
+ 'ov-x--auto-hide': useScrollbar && scrollbarXOpts.autoHide,
2500
+ 'ov-y--auto-hide': useScrollbar && scrollbarYOpts.autoHide,
2239
2501
  'is--drag': isDrag,
2240
2502
  'is--loading': loading
2241
2503
  }],
@@ -2282,16 +2544,53 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
2282
2544
  style: {
2283
2545
  marginTop: topSpaceHeight ? `${topSpaceHeight}px` : ''
2284
2546
  }
2547
+ }, useScrollbar ? defaultSlot ? defaultSlot({
2548
+ items: rowList,
2549
+ $list: $xeList
2550
+ }) : rowList.map((row, i) => renderRow(row, i)) : [(0, _vue.h)('div', {
2551
+ key: 'vi',
2552
+ ref: refViewInnerElem,
2553
+ class: 'vxe-scrollbar--view-inner'
2285
2554
  }, defaultSlot ? defaultSlot({
2286
2555
  items: rowList,
2287
2556
  $list: $xeList
2288
- }) : rowList.map((row, i) => renderRow(row, i)))]), footerSlot ? (0, _vue.h)('div', {
2557
+ }) : rowList.map((row, i) => renderRow(row, i)))])]), footerSlot ? (0, _vue.h)('div', {
2289
2558
  ref: refFooterElem,
2290
2559
  class: 'vxe-list--footer-wrapper'
2291
2560
  }, footerSlot({
2292
2561
  items: rowList,
2293
2562
  $list: $xeList
2294
2563
  })) : (0, _ui.renderEmptyElement)($xeList),
2564
+ /**
2565
+ * 滚动条
2566
+ */
2567
+ useScrollbar ? (0, _vue.h)('div', {
2568
+ class: scrollbarWrapperClss
2569
+ }, [scrollbarXOpts.visible === 'hidden' ? (0, _ui.renderEmptyElement)($xeList) : (0, _vue.h)('div', {
2570
+ ref: refTrackXElem,
2571
+ class: 'vxe-scrollbar--track-x',
2572
+ onClick: clickTrackXEvent
2573
+ }, [(0, _vue.h)('div', {
2574
+ ref: refThumbXElem,
2575
+ class: 'vxe-scrollbar--thumb-x',
2576
+ onPointerdown: pointerdownThumbXEvent,
2577
+ onPointermove: pointermoveThumbXEvent,
2578
+ onPointerup: cleatPointerThumbEvent,
2579
+ onPointercancel: cleatPointerThumbEvent,
2580
+ onLostpointercapture: cleatPointerThumbEvent
2581
+ })]), scrollbarYOpts.visible === 'hidden' ? (0, _ui.renderEmptyElement)($xeList) : (0, _vue.h)('div', {
2582
+ ref: refTrackYElem,
2583
+ class: 'vxe-scrollbar--track-y',
2584
+ onClick: clickTrackYEvent
2585
+ }, [(0, _vue.h)('div', {
2586
+ ref: refThumbYElem,
2587
+ class: 'vxe-scrollbar--thumb-y',
2588
+ onPointerdown: pointerdownThumbYEvent,
2589
+ onPointermove: pointermoveThumbYEvent,
2590
+ onPointerup: cleatPointerThumbEvent,
2591
+ onPointercancel: cleatPointerThumbEvent,
2592
+ onLostpointercapture: cleatPointerThumbEvent
2593
+ })])]) : (0, _ui.renderEmptyElement)($xeList),
2295
2594
  /**
2296
2595
  * 拖拽提示
2297
2596
  */
@@ -2346,7 +2645,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
2346
2645
  updateCheckboxModeValue();
2347
2646
  });
2348
2647
  (0, _vue.onActivated)(() => {
2349
- recalculate().then(() => refreshScroll());
2648
+ recalculate().then(() => {
2649
+ refreshScroll();
2650
+ });
2350
2651
  });
2351
2652
  (0, _vue.nextTick)(() => {
2352
2653
  loadData(props.data || []);
@@ -2355,7 +2656,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
2355
2656
  const {
2356
2657
  showSeq,
2357
2658
  showRadio,
2358
- showCheckbox
2659
+ showCheckbox,
2660
+ autoResize,
2661
+ useScrollbar
2359
2662
  } = props;
2360
2663
  const rowOpts = computeRowOpts.value;
2361
2664
  const {
@@ -2380,17 +2683,27 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
2380
2683
  if (useKey && !keyField) {
2381
2684
  errLog('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField']);
2382
2685
  }
2383
- if (props.autoResize) {
2686
+ if (useScrollbar || autoResize) {
2384
2687
  const el = refElem.value;
2385
- const resizeObserver = _ui.globalResize.create(() => recalculate());
2688
+ const viewInnerEl = refViewInnerElem.value;
2689
+ const resizeObserver = _ui.globalResize.create(() => {
2690
+ reFlag.value++;
2691
+ });
2386
2692
  resizeObserver.observe(el);
2387
- if (el) {
2388
- resizeObserver.observe(el.parentElement);
2693
+ if (autoResize) {
2694
+ if (el) {
2695
+ resizeObserver.observe(el.parentElement);
2696
+ }
2697
+ }
2698
+ if (viewInnerEl) {
2699
+ resizeObserver.observe(viewInnerEl);
2389
2700
  }
2390
2701
  internalData.resizeObserver = resizeObserver;
2391
2702
  }
2392
- recalculate();
2393
- _ui.globalEvents.on($xeList, 'resize', recalculate);
2703
+ reFlag.value++;
2704
+ _ui.globalEvents.on($xeList, 'resize', () => {
2705
+ reFlag.value++;
2706
+ });
2394
2707
  });
2395
2708
  (0, _vue.onBeforeUnmount)(() => {
2396
2709
  const {