vxe-pc-ui 4.19.8 → 4.20.1

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 +878 -115
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/card/src/card.js +17 -3
  5. package/es/icon/style.css +1 -1
  6. package/es/language/fr-FR.js +29 -29
  7. package/es/layout-aside/src/layout-aside.js +8 -5
  8. package/es/layout-body/src/layout-body.js +19 -11
  9. package/es/list/src/list.js +364 -21
  10. package/es/list/style.css +43 -0
  11. package/es/list/style.min.css +1 -1
  12. package/es/scrollbar/src/scrollbar.js +59 -17
  13. package/es/scrollbar/style.css +1 -0
  14. package/es/style.css +1 -1
  15. package/es/style.min.css +1 -1
  16. package/es/tabs/src/tabs.js +19 -4
  17. package/es/tree/src/tree.js +393 -55
  18. package/es/tree/style.css +43 -0
  19. package/es/tree/style.min.css +1 -1
  20. package/es/ui/index.js +1 -1
  21. package/es/ui/src/log.js +1 -1
  22. package/es/ui/src/utils.js +12 -0
  23. package/es/vxe-list/style.css +43 -0
  24. package/es/vxe-list/style.min.css +1 -1
  25. package/es/vxe-scrollbar/style.css +1 -0
  26. package/es/vxe-tree/style.css +43 -0
  27. package/es/vxe-tree/style.min.css +1 -1
  28. package/lib/card/src/card.js +17 -3
  29. package/lib/card/src/card.min.js +1 -1
  30. package/lib/icon/style/style.css +1 -1
  31. package/lib/icon/style/style.min.css +1 -1
  32. package/lib/index.umd.js +914 -126
  33. package/lib/index.umd.min.js +1 -1
  34. package/lib/language/fr-FR.js +29 -29
  35. package/lib/language/fr-FR.min.js +1 -1
  36. package/lib/language/fr-FR.umd.js +29 -29
  37. package/lib/layout-aside/src/layout-aside.js +7 -7
  38. package/lib/layout-aside/src/layout-aside.min.js +1 -1
  39. package/lib/layout-body/src/layout-body.js +27 -21
  40. package/lib/layout-body/src/layout-body.min.js +1 -1
  41. package/lib/list/src/list.js +368 -21
  42. package/lib/list/src/list.min.js +1 -1
  43. package/lib/list/style/style.css +43 -0
  44. package/lib/list/style/style.min.css +1 -1
  45. package/lib/scrollbar/src/scrollbar.js +67 -15
  46. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  47. package/lib/scrollbar/style/style.css +1 -0
  48. package/lib/style.css +1 -1
  49. package/lib/style.min.css +1 -1
  50. package/lib/tabs/src/tabs.js +22 -10
  51. package/lib/tabs/src/tabs.min.js +1 -1
  52. package/lib/tree/src/tree.js +397 -53
  53. package/lib/tree/src/tree.min.js +1 -1
  54. package/lib/tree/style/style.css +43 -0
  55. package/lib/tree/style/style.min.css +1 -1
  56. package/lib/ui/index.js +1 -1
  57. package/lib/ui/index.min.js +1 -1
  58. package/lib/ui/src/log.js +1 -1
  59. package/lib/ui/src/log.min.js +1 -1
  60. package/lib/ui/src/utils.js +14 -0
  61. package/lib/ui/src/utils.min.js +1 -1
  62. package/lib/vxe-list/style/style.css +43 -0
  63. package/lib/vxe-list/style/style.min.css +1 -1
  64. package/lib/vxe-scrollbar/style/style.css +1 -0
  65. package/lib/vxe-tree/style/style.css +43 -0
  66. package/lib/vxe-tree/style/style.min.css +1 -1
  67. package/package.json +1 -1
  68. package/packages/card/src/card.ts +18 -3
  69. package/packages/language/fr-FR.ts +903 -903
  70. package/packages/layout-aside/src/layout-aside.ts +8 -5
  71. package/packages/layout-body/src/layout-body.ts +23 -14
  72. package/packages/list/src/list.ts +397 -24
  73. package/packages/scrollbar/src/scrollbar.ts +63 -16
  74. package/packages/tabs/src/tabs.ts +19 -5
  75. package/packages/tree/src/tree.ts +432 -64
  76. package/packages/ui/src/utils.ts +14 -0
  77. package/styles/components/list.scss +76 -0
  78. package/styles/components/scrollbar.scss +3 -0
  79. package/styles/components/tree.scss +76 -0
  80. package/types/components/card.d.ts +10 -1
  81. package/types/components/layout-aside.d.ts +10 -1
  82. package/types/components/layout-body.d.ts +10 -1
  83. package/types/components/list.d.ts +33 -2
  84. package/types/components/scrollbar.d.ts +17 -2
  85. package/types/components/table-plugins/extend-cell-area.d.ts +1 -1
  86. package/types/components/table.d.ts +71 -4
  87. package/types/components/tabs.d.ts +10 -1
  88. package/types/components/tree.d.ts +33 -2
  89. /package/es/icon/{iconfont.1791862962954.ttf → iconfont.1791950625324.ttf} +0 -0
  90. /package/es/icon/{iconfont.1791862962954.woff → iconfont.1791950625324.woff} +0 -0
  91. /package/es/icon/{iconfont.1791862962954.woff2 → iconfont.1791950625324.woff2} +0 -0
  92. /package/es/{iconfont.1791862962954.ttf → iconfont.1791950625324.ttf} +0 -0
  93. /package/es/{iconfont.1791862962954.woff → iconfont.1791950625324.woff} +0 -0
  94. /package/es/{iconfont.1791862962954.woff2 → iconfont.1791950625324.woff2} +0 -0
  95. /package/lib/icon/style/{iconfont.1791862962954.ttf → iconfont.1791950625324.ttf} +0 -0
  96. /package/lib/icon/style/{iconfont.1791862962954.woff → iconfont.1791950625324.woff} +0 -0
  97. /package/lib/icon/style/{iconfont.1791862962954.woff2 → iconfont.1791950625324.woff2} +0 -0
  98. /package/lib/{iconfont.1791862962954.ttf → iconfont.1791950625324.ttf} +0 -0
  99. /package/lib/{iconfont.1791862962954.woff → iconfont.1791950625324.woff} +0 -0
  100. /package/lib/{iconfont.1791862962954.woff2 → iconfont.1791950625324.woff2} +0 -0
@@ -15,6 +15,7 @@ var _vn = require("../../ui/src/vn");
15
15
  var _dom = require("../../ui/src/dom");
16
16
  var _utils = require("../../ui/src/utils");
17
17
  var _anime = require("../../ui/src/anime");
18
+ var _util2 = require("../../scrollbar/src/util");
18
19
  var _loading = _interopRequireDefault(require("../../loading"));
19
20
  var _tooltip = _interopRequireDefault(require("../../tooltip"));
20
21
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -34,6 +35,34 @@ const {
34
35
  function getNodeUniqueId() {
35
36
  return _xeUtils.default.uniqueId('node_');
36
37
  }
38
+ function createReactData() {
39
+ return {
40
+ parentHeight: 0,
41
+ customHeight: 0,
42
+ customMinHeight: 0,
43
+ customMaxHeight: 0,
44
+ currentNode: null,
45
+ scrollYLoad: false,
46
+ bodyHeight: 0,
47
+ topSpaceHeight: 0,
48
+ selectRadioKey: null,
49
+ treeList: [],
50
+ updateExpandedFlag: 1,
51
+ updateCheckboxFlag: 1,
52
+ // 滚动条
53
+ yThumbHeight: 0,
54
+ xThumbWidth: 0,
55
+ insertNodeFlag: 1,
56
+ removeNodeFlag: 1,
57
+ dragNode: null,
58
+ dragTipText: '',
59
+ isCrossDragNode: false,
60
+ tooltipStore: {
61
+ visible: false,
62
+ node: null
63
+ }
64
+ };
65
+ }
37
66
  function createInternalData() {
38
67
  return {
39
68
  // initialized: false,
@@ -46,8 +75,14 @@ function createInternalData() {
46
75
  indeterminateNodeMaps: {},
47
76
  treeExpandedMaps: {},
48
77
  treeExpandLazyLoadedMaps: {},
49
- lastScrollLeft: 0,
78
+ // 滚动条
79
+ // resizeObserver: undefined,
80
+ // isThumbDrag: false,
81
+ thumbDragOffset: 0,
82
+ yThumbTop: 0,
83
+ xThumbLeft: 0,
50
84
  lastScrollTop: 0,
85
+ lastScrollLeft: 0,
51
86
  scrollYStore: {
52
87
  startIndex: 0,
53
88
  endIndex: 0,
@@ -64,31 +99,6 @@ function createInternalData() {
64
99
  // hpTimeout: undefined
65
100
  };
66
101
  }
67
- function createReactData() {
68
- return {
69
- parentHeight: 0,
70
- customHeight: 0,
71
- customMinHeight: 0,
72
- customMaxHeight: 0,
73
- currentNode: null,
74
- scrollYLoad: false,
75
- bodyHeight: 0,
76
- topSpaceHeight: 0,
77
- selectRadioKey: null,
78
- treeList: [],
79
- updateExpandedFlag: 1,
80
- updateCheckboxFlag: 1,
81
- insertNodeFlag: 1,
82
- removeNodeFlag: 1,
83
- dragNode: null,
84
- dragTipText: '',
85
- isCrossDragNode: false,
86
- tooltipStore: {
87
- visible: false,
88
- node: null
89
- }
90
- };
91
- }
92
102
  let crossTreeDragNodeObj = null;
93
103
  var _default = exports.default = (0, _comp.defineVxeComponent)({
94
104
  name: 'VxeTree',
@@ -219,7 +229,12 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
219
229
  type: String,
220
230
  default: () => getConfig().tree.size || getConfig().size
221
231
  },
222
- virtualYConfig: Object
232
+ virtualYConfig: Object,
233
+ useScrollbar: {
234
+ type: Boolean,
235
+ default: () => getConfig().tree.useScrollbar
236
+ },
237
+ scrollbarConfig: Object
223
238
  },
224
239
  emits: ['update:modelValue', 'update:checkNodeKey', 'update:checkNodeKeys', 'node-click', 'node-dblclick', 'current-change', 'radio-change', 'checkbox-change', 'load-success', 'load-error', 'scroll', 'node-dragstart', 'node-dragover', 'node-dragend', 'node-remove-dragend', 'node-insert-dragend', 'node-expand', 'node-menu', 'menu-click'],
225
240
  setup(props, context) {
@@ -236,6 +251,10 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
236
251
  const refFooterWrapperElem = (0, _vue.ref)();
237
252
  const refVirtualWrapper = (0, _vue.ref)();
238
253
  const refVirtualBody = (0, _vue.ref)();
254
+ const refTrackXElem = (0, _vue.ref)();
255
+ const refTrackYElem = (0, _vue.ref)();
256
+ const refThumbXElem = (0, _vue.ref)();
257
+ const refThumbYElem = (0, _vue.ref)();
239
258
  const refDragNodeLineElem = (0, _vue.ref)();
240
259
  const refDragTipElem = (0, _vue.ref)();
241
260
  const refTooltip = (0, _vue.ref)();
@@ -315,6 +334,19 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
315
334
  const computeMenuOpts = (0, _vue.computed)(() => {
316
335
  return Object.assign({}, getConfig().tree.menuConfig, props.menuConfig);
317
336
  });
337
+ const computeWrapperStyles = (0, _vue.computed)(() => {
338
+ const scrollbarOpts = computeScrollbarOpts.value;
339
+ const scrollbarXOpts = computeScrollbarXOpts.value;
340
+ const scrollbarYOpts = computeScrollbarYOpts.value;
341
+ const barWidth = (0, _utils.getDefaultConfig)((0, _utils.getDefaultConfig)(scrollbarYOpts.width, scrollbarOpts.width), getConfig().scrollbar.width);
342
+ const barHeight = (0, _utils.getDefaultConfig)((0, _utils.getDefaultConfig)(scrollbarXOpts.height, scrollbarOpts.height), getConfig().scrollbar.height);
343
+ const stys = {};
344
+ if (barWidth || barHeight) {
345
+ stys['--vxe-ui-scrollbar-y-width'] = (0, _dom.toCssUnit)(barWidth || barHeight);
346
+ stys['--vxe-ui-scrollbar-x-height'] = (0, _dom.toCssUnit)(barHeight || barWidth);
347
+ }
348
+ return stys;
349
+ });
318
350
  const computeTreeStyle = (0, _vue.computed)(() => {
319
351
  const {
320
352
  indent
@@ -358,6 +390,70 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
358
390
  const computeFilterOpts = (0, _vue.computed)(() => {
359
391
  return Object.assign({}, getConfig().tree.filterConfig, props.filterConfig);
360
392
  });
393
+ const computeScrollbarOpts = (0, _vue.computed)(() => {
394
+ return Object.assign({}, getConfig().tree.scrollbarConfig, props.scrollbarConfig);
395
+ });
396
+ const computeScrollbarXOpts = (0, _vue.computed)(() => {
397
+ const scrollbarOpts = computeScrollbarOpts.value;
398
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig, {
399
+ visible: false
400
+ });
401
+ });
402
+ const computeScrollbarYOpts = (0, _vue.computed)(() => {
403
+ const scrollbarOpts = computeScrollbarOpts.value;
404
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig);
405
+ });
406
+ const computeScrollXVisible = (0, _vue.computed)(() => {
407
+ const scrollbarOpts = computeScrollbarOpts.value;
408
+ const scrollbarXOpts = computeScrollbarXOpts.value;
409
+ return (0, _utils.getDefaultConfig)(scrollbarXOpts.visible, scrollbarOpts.visible);
410
+ });
411
+ const computeScrollYVisible = (0, _vue.computed)(() => {
412
+ const scrollbarOpts = computeScrollbarOpts.value;
413
+ const scrollbarYOpts = computeScrollbarYOpts.value;
414
+ return (0, _utils.getDefaultConfig)(scrollbarYOpts.visible, scrollbarOpts.visible);
415
+ });
416
+ const computeScrollXAutoHide = (0, _vue.computed)(() => {
417
+ const scrollbarOpts = computeScrollbarOpts.value;
418
+ const scrollbarXOpts = computeScrollbarXOpts.value;
419
+ return (0, _utils.getDefaultConfig)((0, _utils.getDefaultConfig)(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
420
+ });
421
+ const computeScrollYAutoHide = (0, _vue.computed)(() => {
422
+ const scrollbarOpts = computeScrollbarOpts.value;
423
+ const scrollbarYOpts = computeScrollbarYOpts.value;
424
+ return (0, _utils.getDefaultConfig)((0, _utils.getDefaultConfig)(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
425
+ });
426
+ const computeScrollbarWrapperClss = (0, _vue.computed)(() => {
427
+ const scrollbarOpts = computeScrollbarOpts.value;
428
+ const {
429
+ padding
430
+ } = scrollbarOpts;
431
+ const {
432
+ yThumbHeight,
433
+ xThumbWidth
434
+ } = reactData;
435
+ const scrollbarXToTop = computeScrollbarXToTop.value;
436
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
437
+ const scrollXVisible = computeScrollXVisible.value;
438
+ const scrollYVisible = computeScrollYVisible.value;
439
+ const scrollXAutoHide = computeScrollXAutoHide.value;
440
+ const scrollYAutoHide = computeScrollYAutoHide.value;
441
+ return _ui.domUtils.buildClass(['vxe-scrollbar is--virtual', `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`, `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`, `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`], {
442
+ 'is--padding': padding,
443
+ 'ov-x--auto-hide': scrollXAutoHide,
444
+ 'ov-y--auto-hide': scrollYAutoHide,
445
+ 'overflow-y': yThumbHeight,
446
+ 'overflow-x': xThumbWidth
447
+ });
448
+ });
449
+ const computeScrollbarXToTop = (0, _vue.computed)(() => {
450
+ const scrollbarXOpts = computeScrollbarXOpts.value;
451
+ return scrollbarXOpts.position === 'top';
452
+ });
453
+ const computeScrollbarYToLeft = (0, _vue.computed)(() => {
454
+ const scrollbarYOpts = computeScrollbarYOpts.value;
455
+ return scrollbarYOpts.position === 'left';
456
+ });
361
457
  const computeMaps = {
362
458
  computeKeyField,
363
459
  computeParentField,
@@ -952,6 +1048,10 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
952
1048
  }
953
1049
  });
954
1050
  };
1051
+ const updateScrollbar = () => {
1052
+ updateThumbSize();
1053
+ updateThumbOffset();
1054
+ };
955
1055
  /**
956
1056
  * 重新计算列表
957
1057
  */
@@ -977,6 +1077,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
977
1077
  const parentPaddingSize = (0, _dom.getPaddingTopBottomSize)(parentEl);
978
1078
  reactData.parentHeight = Math.max(headHeight + footHeight + rowHeight, parentEl.clientHeight - parentPaddingSize - headHeight - footHeight);
979
1079
  }
1080
+ updateScrollbar();
980
1081
  updateHeight();
981
1082
  return computeScrollLoad().then(() => {
982
1083
  updateHeight();
@@ -1018,6 +1119,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1018
1119
  const scrollLeft = scrollBodyElem.scrollLeft;
1019
1120
  const isX = scrollLeft !== internalData.lastScrollLeft;
1020
1121
  const isY = scrollTop !== internalData.lastScrollTop;
1122
+ updateThumbOffset();
1021
1123
  internalData.lastScrollTop = scrollTop;
1022
1124
  internalData.lastScrollLeft = scrollLeft;
1023
1125
  if (reactData.scrollYLoad) {
@@ -1693,13 +1795,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1693
1795
  checked: isChecked
1694
1796
  }, evnt);
1695
1797
  };
1696
- const handleGlobalResizeEvent = () => {
1697
- const el = refElem.value;
1698
- if (!el || !el.clientWidth) {
1699
- return;
1700
- }
1701
- recalculate();
1702
- };
1703
1798
  const insertTreeNode = (newRecords, isAppend) => {
1704
1799
  const {
1705
1800
  treeFullData,
@@ -3362,6 +3457,183 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
3362
3457
  hideDropTip();
3363
3458
  }
3364
3459
  };
3460
+ const updateThumbSize = () => {
3461
+ const viewEl = refVirtualWrapper.value;
3462
+ if (!viewEl) {
3463
+ return;
3464
+ }
3465
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3466
+ return;
3467
+ }
3468
+ const trackXEl = refTrackXElem.value;
3469
+ const xThumbWidth = trackXEl ? (0, _util2.getThumbSize)(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
3470
+ const thumbXElem = refThumbXElem.value;
3471
+ if (thumbXElem) {
3472
+ thumbXElem.style.width = xThumbWidth + 'px';
3473
+ }
3474
+ reactData.xThumbWidth = xThumbWidth;
3475
+ const trackYEl = refTrackYElem.value;
3476
+ const yThumbHeight = trackYEl ? (0, _util2.getThumbSize)(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
3477
+ const thumbYElem = refThumbYElem.value;
3478
+ if (thumbYElem) {
3479
+ thumbYElem.style.height = yThumbHeight + 'px';
3480
+ }
3481
+ reactData.yThumbHeight = yThumbHeight;
3482
+ };
3483
+ const updateThumbOffset = () => {
3484
+ const viewEl = refVirtualWrapper.value;
3485
+ if (!viewEl) {
3486
+ return;
3487
+ }
3488
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3489
+ return;
3490
+ }
3491
+ const {
3492
+ xThumbWidth,
3493
+ yThumbHeight
3494
+ } = reactData;
3495
+ const trackXEl = refTrackXElem.value;
3496
+ const thumbXElem = refThumbXElem.value;
3497
+ const xThumbLeft = trackXEl && xThumbWidth ? (0, _util2.getThumbOffsetSize)(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
3498
+ internalData.xThumbLeft = xThumbLeft;
3499
+ if (thumbXElem && xThumbWidth) {
3500
+ thumbXElem.style.width = xThumbWidth + 'px';
3501
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
3502
+ }
3503
+ const trackYEl = refTrackYElem.value;
3504
+ const thumbYElem = refThumbYElem.value;
3505
+ const yThumbTop = trackYEl && yThumbHeight ? (0, _util2.getThumbOffsetSize)(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
3506
+ internalData.yThumbTop = yThumbTop;
3507
+ if (thumbYElem && yThumbHeight) {
3508
+ thumbYElem.style.height = yThumbHeight + 'px';
3509
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
3510
+ }
3511
+ };
3512
+ const clickTrackXEvent = evnt => {
3513
+ const trackEl = evnt.currentTarget;
3514
+ if (trackEl !== evnt.target) {
3515
+ return;
3516
+ }
3517
+ const viewEl = refVirtualWrapper.value;
3518
+ if (!viewEl) {
3519
+ return;
3520
+ }
3521
+ const {
3522
+ xThumbWidth
3523
+ } = reactData;
3524
+ const trackRect = trackEl.getBoundingClientRect();
3525
+ viewEl.scrollTo({
3526
+ left: (0, _util2.getScrollFromClick)(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
3527
+ behavior: 'auto'
3528
+ });
3529
+ };
3530
+ const clickTrackYEvent = evnt => {
3531
+ const trackEl = evnt.currentTarget;
3532
+ if (trackEl !== evnt.target) {
3533
+ return;
3534
+ }
3535
+ const viewEl = refVirtualWrapper.value;
3536
+ if (!viewEl) {
3537
+ return;
3538
+ }
3539
+ const {
3540
+ yThumbHeight
3541
+ } = reactData;
3542
+ const trackRect = trackEl.getBoundingClientRect();
3543
+ viewEl.scrollTo({
3544
+ top: (0, _util2.getScrollFromClick)(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
3545
+ behavior: 'auto'
3546
+ });
3547
+ };
3548
+ const pointerdownThumbXEvent = evnt => {
3549
+ const thumbEl = evnt.currentTarget;
3550
+ internalData.isThumbDrag = true;
3551
+ thumbEl.setPointerCapture(evnt.pointerId);
3552
+ const viewEl = refVirtualWrapper.value;
3553
+ if (!viewEl) {
3554
+ return;
3555
+ }
3556
+ const {
3557
+ xThumbWidth
3558
+ } = reactData;
3559
+ const trackEl = thumbEl.parentElement;
3560
+ const trackRect = trackEl.getBoundingClientRect();
3561
+ const pointerPosition = evnt.clientX - trackRect.left;
3562
+ // 记录 thumb 的偏移
3563
+ const thumbOffset = (0, _util2.getThumbOffsetSize)(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
3564
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
3565
+ };
3566
+ const pointermoveThumbXEvent = evnt => {
3567
+ const thumbEl = evnt.currentTarget;
3568
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3569
+ return;
3570
+ }
3571
+ const {
3572
+ isThumbDrag,
3573
+ thumbDragOffset
3574
+ } = internalData;
3575
+ if (isThumbDrag) {
3576
+ const viewEl = refVirtualWrapper.value;
3577
+ if (!viewEl) {
3578
+ return;
3579
+ }
3580
+ const {
3581
+ xThumbWidth
3582
+ } = reactData;
3583
+ const thumbEl = evnt.currentTarget;
3584
+ const trackEl = thumbEl.parentElement;
3585
+ const trackRect = trackEl.getBoundingClientRect();
3586
+ // 更新偏移
3587
+ viewEl.scrollLeft = (0, _util2.getScrollFromDrag)(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
3588
+ }
3589
+ };
3590
+ const cleatPointerThumbEvent = evnt => {
3591
+ const thumbEl = evnt.currentTarget;
3592
+ thumbEl.releasePointerCapture(evnt.pointerId);
3593
+ internalData.isThumbDrag = false;
3594
+ };
3595
+ const pointerdownThumbYEvent = evnt => {
3596
+ const thumbEl = evnt.currentTarget;
3597
+ internalData.isThumbDrag = true;
3598
+ thumbEl.setPointerCapture(evnt.pointerId);
3599
+ const viewEl = refVirtualWrapper.value;
3600
+ if (!viewEl) {
3601
+ return;
3602
+ }
3603
+ const {
3604
+ yThumbHeight
3605
+ } = reactData;
3606
+ const trackEl = thumbEl.parentElement;
3607
+ const trackRect = trackEl.getBoundingClientRect();
3608
+ const pointerPosition = evnt.clientY - trackRect.top;
3609
+ // 记录 thumb 的偏移
3610
+ const thumbOffset = (0, _util2.getThumbOffsetSize)(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
3611
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
3612
+ };
3613
+ const pointermoveThumbYEvent = evnt => {
3614
+ const thumbEl = evnt.currentTarget;
3615
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3616
+ return;
3617
+ }
3618
+ const {
3619
+ isThumbDrag,
3620
+ thumbDragOffset
3621
+ } = internalData;
3622
+ if (isThumbDrag) {
3623
+ const viewEl = refVirtualWrapper.value;
3624
+ if (!viewEl) {
3625
+ return;
3626
+ }
3627
+ const {
3628
+ yThumbHeight
3629
+ } = reactData;
3630
+ const thumbEl = evnt.currentTarget;
3631
+ const trackEl = thumbEl.parentElement;
3632
+ const trackRect = trackEl.getBoundingClientRect();
3633
+ // 更新偏移
3634
+ viewEl.scrollTop = (0, _util2.getScrollFromDrag)(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
3635
+ }
3636
+ };
3365
3637
  Object.assign($xeTree, treeMethods, treePrivateMethods);
3366
3638
  const renderDragIcon = (node, nodeid) => {
3367
3639
  const {
@@ -3704,19 +3976,23 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
3704
3976
  const {
3705
3977
  loading,
3706
3978
  trigger,
3707
- showLine
3979
+ showLine,
3980
+ useScrollbar
3708
3981
  } = props;
3709
3982
  const {
3710
3983
  bodyHeight,
3711
3984
  topSpaceHeight,
3712
3985
  treeList,
3713
- tooltipStore
3986
+ tooltipStore,
3987
+ xThumbWidth,
3988
+ yThumbHeight
3714
3989
  } = reactData;
3715
3990
  const vSize = computeSize.value;
3716
3991
  const radioOpts = computeRadioOpts.value;
3717
3992
  const checkboxOpts = computeCheckboxOpts.value;
3718
3993
  const loadingOpts = computeLoadingOpts.value;
3719
3994
  const isNodeHover = computeIsNodeHover.value;
3995
+ const wrapperStyles = computeWrapperStyles.value;
3720
3996
  const treeStyle = computeTreeStyle.value;
3721
3997
  const dragOpts = computeDragOpts.value;
3722
3998
  const tooltipOpts = computeTooltipOpts.value;
@@ -3724,21 +4000,36 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
3724
4000
  const headerSlot = slots.header;
3725
4001
  const footerSlot = slots.footer;
3726
4002
  const tooltipSlot = slots.tooltip;
4003
+ const scrollbarOpts = computeScrollbarOpts.value;
4004
+ const scrollXVisible = computeScrollXVisible.value;
4005
+ const scrollYVisible = computeScrollYVisible.value;
4006
+ const scrollbarXToTop = computeScrollbarXToTop.value;
4007
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
4008
+ const scrollXAutoHide = computeScrollXAutoHide.value;
4009
+ const scrollYAutoHide = computeScrollYAutoHide.value;
4010
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value;
3727
4011
  const teOns = {};
3728
4012
  if (dragOpts.isCrossTreeDrag && !treeList.length) {
3729
4013
  teOns.onDragover = $xeTree.handleCrossTreeNodeDragoverEmptyEvent;
3730
4014
  }
3731
4015
  return (0, _vue.h)('div', Object.assign({
3732
4016
  ref: refElem,
3733
- class: ['vxe-tree', {
4017
+ class: ['vxe-tree', useScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '', useScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '', useScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '', useScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '', {
3734
4018
  [`size--${vSize}`]: vSize,
3735
4019
  'show--line': showLine,
4020
+ 'is--virtual-scrollbar': useScrollbar,
4021
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
4022
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
4023
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
4024
+ 'overflow-y': yThumbHeight,
4025
+ 'overflow-x': xThumbWidth,
3736
4026
  'checkbox--highlight': checkboxOpts.highlight,
3737
4027
  'radio--highlight': radioOpts.highlight,
3738
4028
  'node--hover': isNodeHover,
3739
4029
  'node--trigger': trigger === 'node',
3740
4030
  'is--loading': loading
3741
- }]
4031
+ }],
4032
+ style: wrapperStyles
3742
4033
  }, teOns), [headerSlot ? (0, _vue.h)('div', {
3743
4034
  ref: refHeaderWrapperElem,
3744
4035
  class: 'vxe-tree--header-wrapper'
@@ -3766,6 +4057,36 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
3766
4057
  }, footerSlot({
3767
4058
  $tree: $xeTree
3768
4059
  })) : (0, _ui.renderEmptyElement)($xeTree),
4060
+ /**
4061
+ * 滚动条
4062
+ */
4063
+ useScrollbar ? (0, _vue.h)('div', {
4064
+ class: scrollbarWrapperClss
4065
+ }, [scrollXVisible === false ? (0, _ui.renderEmptyElement)($xeTree) : (0, _vue.h)('div', {
4066
+ ref: refTrackXElem,
4067
+ class: 'vxe-scrollbar--track-x',
4068
+ onClick: clickTrackXEvent
4069
+ }, [(0, _vue.h)('div', {
4070
+ ref: refThumbXElem,
4071
+ class: 'vxe-scrollbar--thumb-x',
4072
+ onPointerdown: pointerdownThumbXEvent,
4073
+ onPointermove: pointermoveThumbXEvent,
4074
+ onPointerup: cleatPointerThumbEvent,
4075
+ onPointercancel: cleatPointerThumbEvent,
4076
+ onLostpointercapture: cleatPointerThumbEvent
4077
+ })]), scrollYVisible === false ? (0, _ui.renderEmptyElement)($xeTree) : (0, _vue.h)('div', {
4078
+ ref: refTrackYElem,
4079
+ class: 'vxe-scrollbar--track-y',
4080
+ onClick: clickTrackYEvent
4081
+ }, [(0, _vue.h)('div', {
4082
+ ref: refThumbYElem,
4083
+ class: 'vxe-scrollbar--thumb-y',
4084
+ onPointerdown: pointerdownThumbYEvent,
4085
+ onPointermove: pointermoveThumbYEvent,
4086
+ onPointerup: cleatPointerThumbEvent,
4087
+ onPointercancel: cleatPointerThumbEvent,
4088
+ onLostpointercapture: cleatPointerThumbEvent
4089
+ })])]) : (0, _ui.renderEmptyElement)($xeTree),
3769
4090
  /**
3770
4091
  * 拖拽提示
3771
4092
  */
@@ -3849,18 +4170,33 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
3849
4170
  (0, _vue.watch)(() => props.filterValue, () => {
3850
4171
  triggerSearchEvent(new Event('filter'));
3851
4172
  });
3852
- const hFlag = (0, _vue.ref)(0);
4173
+ const reFlag = (0, _vue.ref)(0);
3853
4174
  (0, _vue.watch)(() => props.height, () => {
3854
- hFlag.value++;
4175
+ reFlag.value++;
3855
4176
  });
3856
4177
  (0, _vue.watch)(() => props.minHeight, () => {
3857
- hFlag.value++;
4178
+ reFlag.value++;
3858
4179
  });
3859
4180
  (0, _vue.watch)(() => props.maxHeight, () => {
3860
- hFlag.value++;
4181
+ reFlag.value++;
3861
4182
  });
3862
- (0, _vue.watch)(hFlag, () => {
3863
- recalculate();
4183
+ (0, _vue.watch)(() => props.useScrollbar, () => {
4184
+ reFlag.value++;
4185
+ });
4186
+ (0, _vue.watch)(computeScrollXVisible, () => {
4187
+ (0, _vue.nextTick)(() => {
4188
+ reFlag.value++;
4189
+ });
4190
+ });
4191
+ (0, _vue.watch)(computeScrollYVisible, () => {
4192
+ (0, _vue.nextTick)(() => {
4193
+ reFlag.value++;
4194
+ });
4195
+ });
4196
+ (0, _vue.watch)(reFlag, () => {
4197
+ recalculate().then(() => {
4198
+ recalculate();
4199
+ });
3864
4200
  });
3865
4201
  (0, _vue.onMounted)(() => {
3866
4202
  const {
@@ -3869,7 +4205,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
3869
4205
  menuConfig,
3870
4206
  showOverflow,
3871
4207
  lazy,
3872
- loadMethod
4208
+ loadMethod,
4209
+ autoResize,
4210
+ useScrollbar
3873
4211
  } = props;
3874
4212
  const dragOpts = computeDragOpts.value;
3875
4213
  if (!showOverflow) {
@@ -3891,24 +4229,30 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
3891
4229
  if (menuConfig && !VxeUIContextMenu) {
3892
4230
  errLog('vxe.error.reqComp', ['vxe-context-menu']);
3893
4231
  }
3894
- if (props.autoResize) {
4232
+ if (useScrollbar || autoResize) {
3895
4233
  const el = refElem.value;
4234
+ const viewInnerEl = refVirtualBody.value;
3896
4235
  const parentEl = getParentElem();
3897
4236
  const resizeObserver = _ui.globalResize.create(() => {
3898
- if (props.autoResize) {
3899
- recalculate();
3900
- }
4237
+ reFlag.value++;
3901
4238
  });
3902
4239
  if (el) {
3903
4240
  resizeObserver.observe(el);
4241
+ if (autoResize) {
4242
+ if (parentEl) {
4243
+ resizeObserver.observe(parentEl);
4244
+ }
4245
+ }
3904
4246
  }
3905
- if (parentEl) {
3906
- resizeObserver.observe(parentEl);
4247
+ if (viewInnerEl) {
4248
+ resizeObserver.observe(viewInnerEl);
3907
4249
  }
3908
4250
  internalData.resizeObserver = resizeObserver;
3909
4251
  }
3910
- recalculate();
3911
- _ui.globalEvents.on($xeTree, 'resize', handleGlobalResizeEvent);
4252
+ reFlag.value++;
4253
+ _ui.globalEvents.on($xeTree, 'resize', () => {
4254
+ reFlag.value++;
4255
+ });
3912
4256
  });
3913
4257
  (0, _vue.onBeforeUnmount)(() => {
3914
4258
  const {