vxe-pc-ui 3.20.0 → 3.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 (91) hide show
  1. package/es/card/src/card.js +18 -3
  2. package/es/icon/style.css +1 -1
  3. package/es/language/fr-FR.js +29 -29
  4. package/es/layout-aside/src/layout-aside.js +8 -5
  5. package/es/layout-body/src/layout-body.js +22 -11
  6. package/es/list/src/list.js +86 -35
  7. package/es/list/style.css +25 -8
  8. package/es/list/style.min.css +1 -1
  9. package/es/scrollbar/src/scrollbar.js +69 -17
  10. package/es/style.css +1 -1
  11. package/es/style.min.css +1 -1
  12. package/es/tabs/src/tabs.js +19 -3
  13. package/es/tree/src/tree.js +439 -56
  14. package/es/tree/style.css +43 -0
  15. package/es/tree/style.min.css +1 -1
  16. package/es/ui/index.js +1 -1
  17. package/es/ui/src/log.js +1 -1
  18. package/es/ui/src/utils.js +3 -0
  19. package/es/vxe-list/style.css +25 -8
  20. package/es/vxe-list/style.min.css +1 -1
  21. package/es/vxe-tree/style.css +43 -0
  22. package/es/vxe-tree/style.min.css +1 -1
  23. package/lib/card/src/card.js +18 -3
  24. package/lib/card/src/card.min.js +1 -1
  25. package/lib/icon/style/style.css +1 -1
  26. package/lib/icon/style/style.min.css +1 -1
  27. package/lib/index.umd.js +640 -139
  28. package/lib/index.umd.min.js +1 -1
  29. package/lib/language/fr-FR.js +29 -29
  30. package/lib/language/fr-FR.min.js +1 -1
  31. package/lib/language/fr-FR.umd.js +29 -29
  32. package/lib/layout-aside/src/layout-aside.js +8 -8
  33. package/lib/layout-aside/src/layout-aside.min.js +1 -1
  34. package/lib/layout-body/src/layout-body.js +26 -19
  35. package/lib/layout-body/src/layout-body.min.js +1 -1
  36. package/lib/list/src/list.js +73 -32
  37. package/lib/list/src/list.min.js +1 -1
  38. package/lib/list/style/style.css +25 -8
  39. package/lib/list/style/style.min.css +1 -1
  40. package/lib/scrollbar/src/scrollbar.js +74 -15
  41. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  42. package/lib/style.css +1 -1
  43. package/lib/style.min.css +1 -1
  44. package/lib/tabs/src/tabs.js +20 -7
  45. package/lib/tabs/src/tabs.min.js +1 -1
  46. package/lib/tree/src/tree.js +416 -53
  47. package/lib/tree/src/tree.min.js +1 -1
  48. package/lib/tree/style/style.css +43 -0
  49. package/lib/tree/style/style.min.css +1 -1
  50. package/lib/ui/index.js +1 -1
  51. package/lib/ui/index.min.js +1 -1
  52. package/lib/ui/src/log.js +1 -1
  53. package/lib/ui/src/log.min.js +1 -1
  54. package/lib/ui/src/utils.js +4 -0
  55. package/lib/ui/src/utils.min.js +1 -1
  56. package/lib/vxe-list/style/style.css +25 -8
  57. package/lib/vxe-list/style/style.min.css +1 -1
  58. package/lib/vxe-tree/style/style.css +43 -0
  59. package/lib/vxe-tree/style/style.min.css +1 -1
  60. package/package.json +1 -1
  61. package/packages/card/src/card.ts +19 -3
  62. package/packages/language/fr-FR.ts +903 -903
  63. package/packages/layout-aside/src/layout-aside.ts +8 -5
  64. package/packages/layout-body/src/layout-body.ts +26 -14
  65. package/packages/list/src/list.ts +97 -41
  66. package/packages/scrollbar/src/scrollbar.ts +79 -17
  67. package/packages/tabs/src/tabs.ts +20 -7
  68. package/packages/tree/src/tree.ts +482 -67
  69. package/packages/ui/src/utils.ts +4 -0
  70. package/styles/components/list.scss +35 -10
  71. package/styles/components/tree.scss +76 -0
  72. package/types/components/card.d.ts +10 -1
  73. package/types/components/layout-aside.d.ts +10 -1
  74. package/types/components/layout-body.d.ts +10 -1
  75. package/types/components/list.d.ts +10 -1
  76. package/types/components/scrollbar.d.ts +16 -2
  77. package/types/components/table.d.ts +47 -4
  78. package/types/components/tabs.d.ts +10 -1
  79. package/types/components/tree.d.ts +33 -2
  80. /package/es/icon/{iconfont.1791880407207.ttf → iconfont.1791950618327.ttf} +0 -0
  81. /package/es/icon/{iconfont.1791880407207.woff → iconfont.1791950618327.woff} +0 -0
  82. /package/es/icon/{iconfont.1791880407207.woff2 → iconfont.1791950618327.woff2} +0 -0
  83. /package/es/{iconfont.1791880407207.ttf → iconfont.1791950618327.ttf} +0 -0
  84. /package/es/{iconfont.1791880407207.woff → iconfont.1791950618327.woff} +0 -0
  85. /package/es/{iconfont.1791880407207.woff2 → iconfont.1791950618327.woff2} +0 -0
  86. /package/lib/icon/style/{iconfont.1791880407207.ttf → iconfont.1791950618327.ttf} +0 -0
  87. /package/lib/icon/style/{iconfont.1791880407207.woff → iconfont.1791950618327.woff} +0 -0
  88. /package/lib/icon/style/{iconfont.1791880407207.woff2 → iconfont.1791950618327.woff2} +0 -0
  89. /package/lib/{iconfont.1791880407207.ttf → iconfont.1791950618327.ttf} +0 -0
  90. /package/lib/{iconfont.1791880407207.woff → iconfont.1791950618327.woff} +0 -0
  91. /package/lib/{iconfont.1791880407207.woff2 → iconfont.1791950618327.woff2} +0 -0
@@ -1,13 +1,14 @@
1
1
  import { defineVxeComponent } from '../../ui/src/comp';
2
2
  import XEUtils from 'xe-utils';
3
- import { VxeUI, createEvent, globalEvents, globalResize, renderEmptyElement, globalMixins } from '../../ui';
3
+ import { VxeUI, domUtils, createEvent, globalEvents, globalResize, renderEmptyElement, globalMixins } from '../../ui';
4
4
  import { calcTreeLine, getItemCacheObj } from './util';
5
5
  import { createComponentLog } from '../../ui/src/log';
6
6
  import { getSlotVNs } from '../../ui/src/vn';
7
7
  import { crossTreeDragNodeGlobal, getCrossTreeDragNodeInfo } from './store';
8
8
  import { toCssUnit, isScale, getPaddingTopBottomSize, addClass, removeClass, getTpImg, hasControlKey, getEventTargetNode, hasClass } from '../../ui/src/dom';
9
- import { isEnableConf, enModelValue, deModelValue, getText } from '../../ui/src/utils';
9
+ import { isEnableConf, enModelValue, deModelValue, getText, getDefaultConfig } from '../../ui/src/utils';
10
10
  import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime';
11
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from '../../scrollbar/src/util';
11
12
  import VxeLoadingComponent from '../../loading';
12
13
  import VxeTooltipComponent from '../../tooltip';
13
14
  const { warnLog, errLog } = createComponentLog('tree');
@@ -498,6 +499,34 @@ function insertTreeNode($xeTree, newRecords, isAppend) {
498
499
  nodeMaps[nodeid] = itemRest;
499
500
  });
500
501
  }
502
+ function createReactData() {
503
+ return {
504
+ parentHeight: 0,
505
+ customHeight: 0,
506
+ customMinHeight: 0,
507
+ customMaxHeight: 0,
508
+ currentNode: null,
509
+ scrollYLoad: false,
510
+ bodyHeight: 0,
511
+ topSpaceHeight: 0,
512
+ selectRadioKey: null,
513
+ treeList: [],
514
+ updateExpandedFlag: 1,
515
+ updateCheckboxFlag: 1,
516
+ // 滚动条
517
+ yThumbHeight: 0,
518
+ xThumbWidth: 0,
519
+ insertNodeFlag: 1,
520
+ removeNodeFlag: 1,
521
+ dragNode: null,
522
+ dragTipText: '',
523
+ isCrossDragNode: false,
524
+ tooltipStore: {
525
+ visible: false,
526
+ node: null
527
+ }
528
+ };
529
+ }
501
530
  function createInternalData() {
502
531
  return {
503
532
  // initialized: false,
@@ -510,8 +539,14 @@ function createInternalData() {
510
539
  indeterminateNodeMaps: {},
511
540
  treeExpandedMaps: {},
512
541
  treeExpandLazyLoadedMaps: {},
513
- lastScrollLeft: 0,
542
+ // 滚动条
543
+ // resizeObserver: undefined,
544
+ // isThumbDrag: false,
545
+ thumbDragOffset: 0,
546
+ yThumbTop: 0,
547
+ xThumbLeft: 0,
514
548
  lastScrollTop: 0,
549
+ lastScrollLeft: 0,
515
550
  scrollYStore: {
516
551
  startIndex: 0,
517
552
  endIndex: 0,
@@ -528,31 +563,6 @@ function createInternalData() {
528
563
  // hpTimeout: undefined
529
564
  };
530
565
  }
531
- function createReactData() {
532
- return {
533
- parentHeight: 0,
534
- customHeight: 0,
535
- customMinHeight: 0,
536
- customMaxHeight: 0,
537
- currentNode: null,
538
- scrollYLoad: false,
539
- bodyHeight: 0,
540
- topSpaceHeight: 0,
541
- selectRadioKey: null,
542
- treeList: [],
543
- updateExpandedFlag: 1,
544
- updateCheckboxFlag: 1,
545
- insertNodeFlag: 1,
546
- removeNodeFlag: 1,
547
- dragNode: null,
548
- dragTipText: '',
549
- isCrossDragNode: false,
550
- tooltipStore: {
551
- visible: false,
552
- node: null
553
- }
554
- };
555
- }
556
566
  export default {
557
567
  name: 'VxeTree',
558
568
  mixins: [
@@ -685,7 +695,12 @@ export default {
685
695
  type: String,
686
696
  default: () => getConfig().tree.size || getConfig().size
687
697
  },
688
- virtualYConfig: Object
698
+ virtualYConfig: Object,
699
+ useScrollbar: {
700
+ type: Boolean,
701
+ default: () => getConfig().tree.useScrollbar
702
+ },
703
+ scrollbarConfig: Object
689
704
  },
690
705
  provide() {
691
706
  const $xeTree = this;
@@ -697,7 +712,7 @@ export default {
697
712
  const xID = XEUtils.uniqueId();
698
713
  const reactData = createReactData();
699
714
  return Object.assign(Object.assign({}, {}), { xID,
700
- reactData, crossTreeDragNodeInfo: crossTreeDragNodeGlobal, hFlag: 0, dataFlag: 0 });
715
+ reactData, crossTreeDragNodeInfo: crossTreeDragNodeGlobal, reFlag: 0, dataFlag: 0 });
701
716
  },
702
717
  computed: Object.assign(Object.assign({}, {}), { computeTitleField() {
703
718
  const $xeTree = this;
@@ -795,6 +810,20 @@ export default {
795
810
  const props = $xeTree;
796
811
  return Object.assign({}, getConfig().tree.menuConfig, props.menuConfig);
797
812
  },
813
+ computeWrapperStyles() {
814
+ const $xeTree = this;
815
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
816
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts;
817
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts;
818
+ const barWidth = getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), getConfig().scrollbar.width);
819
+ const barHeight = getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), getConfig().scrollbar.height);
820
+ const stys = {};
821
+ if (barWidth || barHeight) {
822
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight);
823
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth);
824
+ }
825
+ return stys;
826
+ },
798
827
  computeTreeStyle() {
799
828
  const $xeTree = this;
800
829
  const props = $xeTree;
@@ -831,6 +860,83 @@ export default {
831
860
  const $xeTree = this;
832
861
  const props = $xeTree;
833
862
  return Object.assign({}, getConfig().tree.filterConfig, props.filterConfig);
863
+ },
864
+ computeScrollbarOpts() {
865
+ const $xeTree = this;
866
+ const props = $xeTree;
867
+ return Object.assign({}, getConfig().tree.scrollbarConfig, props.scrollbarConfig);
868
+ },
869
+ computeScrollbarXOpts() {
870
+ const $xeTree = this;
871
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
872
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig, {
873
+ visible: false
874
+ });
875
+ },
876
+ computeScrollbarYOpts() {
877
+ const $xeTree = this;
878
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
879
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig);
880
+ },
881
+ computeScrollXVisible() {
882
+ const $xeTree = this;
883
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
884
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts;
885
+ return getDefaultConfig(scrollbarXOpts.visible, scrollbarOpts.visible);
886
+ },
887
+ computeScrollYVisible() {
888
+ const $xeTree = this;
889
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
890
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts;
891
+ return getDefaultConfig(scrollbarYOpts.visible, scrollbarOpts.visible);
892
+ },
893
+ computeScrollXAutoHide() {
894
+ const $xeTree = this;
895
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
896
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts;
897
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
898
+ },
899
+ computeScrollYAutoHide() {
900
+ const $xeTree = this;
901
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
902
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts;
903
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
904
+ },
905
+ computeScrollbarWrapperClss() {
906
+ const $xeTree = this;
907
+ const reactData = $xeTree.reactData;
908
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
909
+ const { padding } = scrollbarOpts;
910
+ const { yThumbHeight, xThumbWidth } = reactData;
911
+ const scrollbarXToTop = $xeTree.computeScrollbarXToTop;
912
+ const scrollbarYToLeft = $xeTree.computeScrollbarYToLeft;
913
+ const scrollXVisible = $xeTree.computeScrollXVisible;
914
+ const scrollYVisible = $xeTree.computeScrollYVisible;
915
+ const scrollXAutoHide = $xeTree.computeScrollXAutoHide;
916
+ const scrollYAutoHide = $xeTree.computeScrollYAutoHide;
917
+ return domUtils.buildClass([
918
+ 'vxe-scrollbar is--virtual',
919
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
920
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
921
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
922
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
923
+ ], {
924
+ 'is--padding': padding,
925
+ 'ov-x--auto-hide': scrollXAutoHide,
926
+ 'ov-y--auto-hide': scrollYAutoHide,
927
+ 'overflow-y': yThumbHeight,
928
+ 'overflow-x': xThumbWidth
929
+ });
930
+ },
931
+ computeScrollbarXToTop() {
932
+ const $xeTree = this;
933
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts;
934
+ return scrollbarXOpts.position === 'top';
935
+ },
936
+ computeScrollbarYToLeft() {
937
+ const $xeTree = this;
938
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts;
939
+ return scrollbarYOpts.position === 'left';
834
940
  } }),
835
941
  methods: {
836
942
  //
@@ -1455,6 +1561,11 @@ export default {
1455
1561
  }
1456
1562
  });
1457
1563
  },
1564
+ updateScrollbar() {
1565
+ const $xeTree = this;
1566
+ $xeTree.updateThumbSize();
1567
+ $xeTree.updateThumbOffset();
1568
+ },
1458
1569
  /**
1459
1570
  * 重新计算列表
1460
1571
  */
@@ -1479,6 +1590,7 @@ export default {
1479
1590
  const parentPaddingSize = getPaddingTopBottomSize(parentEl);
1480
1591
  reactData.parentHeight = Math.max(headHeight + footHeight + rowHeight, parentEl.clientHeight - parentPaddingSize - headHeight - footHeight);
1481
1592
  }
1593
+ $xeTree.updateScrollbar();
1482
1594
  $xeTree.updateHeight();
1483
1595
  return $xeTree.computeScrollLoad().then(() => {
1484
1596
  $xeTree.updateHeight();
@@ -1523,6 +1635,7 @@ export default {
1523
1635
  const scrollLeft = scrollBodyElem.scrollLeft;
1524
1636
  const isX = scrollLeft !== internalData.lastScrollLeft;
1525
1637
  const isY = scrollTop !== internalData.lastScrollTop;
1638
+ $xeTree.updateThumbOffset();
1526
1639
  internalData.lastScrollTop = scrollTop;
1527
1640
  internalData.lastScrollLeft = scrollLeft;
1528
1641
  if (reactData.scrollYLoad) {
@@ -2397,14 +2510,6 @@ export default {
2397
2510
  $xeTree.emitRadioMode(value);
2398
2511
  $xeTree.dispatchEvent('radio-change', { node, value, checked: isChecked }, evnt);
2399
2512
  },
2400
- handleGlobalResizeEvent() {
2401
- const $xeTree = this;
2402
- const el = $xeTree.$refs.refElem;
2403
- if (!el || !el.clientWidth) {
2404
- return;
2405
- }
2406
- $xeTree.recalculate();
2407
- },
2408
2513
  reloadData(data) {
2409
2514
  const $xeTree = this;
2410
2515
  return $xeTree.loadData(data || []);
@@ -3165,6 +3270,186 @@ export default {
3165
3270
  }, evnt);
3166
3271
  }
3167
3272
  },
3273
+ // 滚动条
3274
+ updateThumbSize() {
3275
+ const $xeTree = this;
3276
+ const reactData = $xeTree.reactData;
3277
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3278
+ if (!viewEl) {
3279
+ return;
3280
+ }
3281
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3282
+ return;
3283
+ }
3284
+ const trackXEl = $xeTree.$refs.refTrackXElem;
3285
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
3286
+ const thumbXElem = $xeTree.$refs.refThumbXElem;
3287
+ if (thumbXElem) {
3288
+ thumbXElem.style.width = xThumbWidth + 'px';
3289
+ }
3290
+ reactData.xThumbWidth = xThumbWidth;
3291
+ const trackYEl = $xeTree.$refs.refTrackYElem;
3292
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
3293
+ const thumbYElem = $xeTree.$refs.refThumbYElem;
3294
+ if (thumbYElem) {
3295
+ thumbYElem.style.height = yThumbHeight + 'px';
3296
+ }
3297
+ reactData.yThumbHeight = yThumbHeight;
3298
+ },
3299
+ updateThumbOffset() {
3300
+ const $xeTree = this;
3301
+ const reactData = $xeTree.reactData;
3302
+ const internalData = $xeTree.internalData;
3303
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3304
+ if (!viewEl) {
3305
+ return;
3306
+ }
3307
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3308
+ return;
3309
+ }
3310
+ const { xThumbWidth, yThumbHeight } = reactData;
3311
+ const trackXEl = $xeTree.$refs.refTrackXElem;
3312
+ const thumbXElem = $xeTree.$refs.refThumbXElem;
3313
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
3314
+ internalData.xThumbLeft = xThumbLeft;
3315
+ if (thumbXElem && xThumbWidth) {
3316
+ thumbXElem.style.width = xThumbWidth + 'px';
3317
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
3318
+ }
3319
+ const trackYEl = $xeTree.$refs.refTrackYElem;
3320
+ const thumbYElem = $xeTree.$refs.refThumbYElem;
3321
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
3322
+ internalData.yThumbTop = yThumbTop;
3323
+ if (thumbYElem && yThumbHeight) {
3324
+ thumbYElem.style.height = yThumbHeight + 'px';
3325
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
3326
+ }
3327
+ },
3328
+ clickTrackXEvent(evnt) {
3329
+ const $xeTree = this;
3330
+ const reactData = $xeTree.reactData;
3331
+ const trackEl = evnt.currentTarget;
3332
+ if (trackEl !== evnt.target) {
3333
+ return;
3334
+ }
3335
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3336
+ if (!viewEl) {
3337
+ return;
3338
+ }
3339
+ const { xThumbWidth } = reactData;
3340
+ const trackRect = trackEl.getBoundingClientRect();
3341
+ viewEl.scrollTo({
3342
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
3343
+ behavior: 'auto'
3344
+ });
3345
+ },
3346
+ clickTrackYEvent(evnt) {
3347
+ const $xeTree = this;
3348
+ const reactData = $xeTree.reactData;
3349
+ const trackEl = evnt.currentTarget;
3350
+ if (trackEl !== evnt.target) {
3351
+ return;
3352
+ }
3353
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3354
+ if (!viewEl) {
3355
+ return;
3356
+ }
3357
+ const { yThumbHeight } = reactData;
3358
+ const trackRect = trackEl.getBoundingClientRect();
3359
+ viewEl.scrollTo({
3360
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
3361
+ behavior: 'auto'
3362
+ });
3363
+ },
3364
+ pointerdownThumbXEvent(evnt) {
3365
+ const $xeTree = this;
3366
+ const reactData = $xeTree.reactData;
3367
+ const internalData = $xeTree.internalData;
3368
+ const thumbEl = evnt.currentTarget;
3369
+ internalData.isThumbDrag = true;
3370
+ thumbEl.setPointerCapture(evnt.pointerId);
3371
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3372
+ if (!viewEl) {
3373
+ return;
3374
+ }
3375
+ const { xThumbWidth } = reactData;
3376
+ const trackEl = thumbEl.parentElement;
3377
+ const trackRect = trackEl.getBoundingClientRect();
3378
+ const pointerPosition = evnt.clientX - trackRect.left;
3379
+ // 记录 thumb 的偏移
3380
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
3381
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
3382
+ },
3383
+ pointermoveThumbXEvent(evnt) {
3384
+ const $xeTree = this;
3385
+ const reactData = $xeTree.reactData;
3386
+ const internalData = $xeTree.internalData;
3387
+ const thumbEl = evnt.currentTarget;
3388
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3389
+ return;
3390
+ }
3391
+ const { isThumbDrag, thumbDragOffset } = internalData;
3392
+ if (isThumbDrag) {
3393
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3394
+ if (!viewEl) {
3395
+ return;
3396
+ }
3397
+ const { xThumbWidth } = reactData;
3398
+ const thumbEl = evnt.currentTarget;
3399
+ const trackEl = thumbEl.parentElement;
3400
+ const trackRect = trackEl.getBoundingClientRect();
3401
+ // 更新偏移
3402
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
3403
+ }
3404
+ },
3405
+ cleatPointerThumbEvent(evnt) {
3406
+ const $xeTree = this;
3407
+ const internalData = $xeTree.internalData;
3408
+ const thumbEl = evnt.currentTarget;
3409
+ thumbEl.releasePointerCapture(evnt.pointerId);
3410
+ internalData.isThumbDrag = false;
3411
+ },
3412
+ pointerdownThumbYEvent(evnt) {
3413
+ const $xeTree = this;
3414
+ const reactData = $xeTree.reactData;
3415
+ const internalData = $xeTree.internalData;
3416
+ const thumbEl = evnt.currentTarget;
3417
+ internalData.isThumbDrag = true;
3418
+ thumbEl.setPointerCapture(evnt.pointerId);
3419
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3420
+ if (!viewEl) {
3421
+ return;
3422
+ }
3423
+ const { yThumbHeight } = reactData;
3424
+ const trackEl = thumbEl.parentElement;
3425
+ const trackRect = trackEl.getBoundingClientRect();
3426
+ const pointerPosition = evnt.clientY - trackRect.top;
3427
+ // 记录 thumb 的偏移
3428
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
3429
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
3430
+ },
3431
+ pointermoveThumbYEvent(evnt) {
3432
+ const $xeTree = this;
3433
+ const reactData = $xeTree.reactData;
3434
+ const internalData = $xeTree.internalData;
3435
+ const thumbEl = evnt.currentTarget;
3436
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3437
+ return;
3438
+ }
3439
+ const { isThumbDrag, thumbDragOffset } = internalData;
3440
+ if (isThumbDrag) {
3441
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3442
+ if (!viewEl) {
3443
+ return;
3444
+ }
3445
+ const { yThumbHeight } = reactData;
3446
+ const thumbEl = evnt.currentTarget;
3447
+ const trackEl = thumbEl.parentElement;
3448
+ const trackRect = trackEl.getBoundingClientRect();
3449
+ // 更新偏移
3450
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
3451
+ }
3452
+ },
3168
3453
  //
3169
3454
  // Render
3170
3455
  //
@@ -3505,13 +3790,14 @@ export default {
3505
3790
  const props = $xeTree;
3506
3791
  const slots = $xeTree.$scopedSlots;
3507
3792
  const reactData = $xeTree.reactData;
3508
- const { loading, trigger, showLine } = props;
3509
- const { bodyHeight, topSpaceHeight, treeList, tooltipStore } = reactData;
3793
+ const { loading, trigger, showLine, useScrollbar } = props;
3794
+ const { bodyHeight, topSpaceHeight, treeList, tooltipStore, xThumbWidth, yThumbHeight } = reactData;
3510
3795
  const vSize = $xeTree.computeSize;
3511
3796
  const radioOpts = $xeTree.computeRadioOpts;
3512
3797
  const checkboxOpts = $xeTree.computeCheckboxOpts;
3513
3798
  const loadingOpts = $xeTree.computeLoadingOpts;
3514
3799
  const isNodeHover = $xeTree.computeIsNodeHover;
3800
+ const wrapperStyles = $xeTree.computeWrapperStyles;
3515
3801
  const treeStyle = $xeTree.computeTreeStyle;
3516
3802
  const dragOpts = $xeTree.computeDragOpts;
3517
3803
  const tooltipOpts = $xeTree.computeTooltipOpts;
@@ -3519,21 +3805,43 @@ export default {
3519
3805
  const headerSlot = slots.header;
3520
3806
  const footerSlot = slots.footer;
3521
3807
  const tooltipSlot = slots.tooltip;
3808
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
3809
+ const scrollXVisible = $xeTree.computeScrollXVisible;
3810
+ const scrollYVisible = $xeTree.computeScrollYVisible;
3811
+ const scrollbarXToTop = $xeTree.computeScrollbarXToTop;
3812
+ const scrollbarYToLeft = $xeTree.computeScrollbarYToLeft;
3813
+ const scrollXAutoHide = $xeTree.computeScrollXAutoHide;
3814
+ const scrollYAutoHide = $xeTree.computeScrollYAutoHide;
3815
+ const scrollbarWrapperClss = $xeTree.computeScrollbarWrapperClss;
3522
3816
  const teOns = {};
3523
3817
  if (dragOpts.isCrossTreeDrag && !treeList.length) {
3524
3818
  teOns.dragover = $xeTree.handleCrossTreeNodeDragoverEmptyEvent;
3525
3819
  }
3526
3820
  return h('div', {
3527
3821
  ref: 'refElem',
3528
- class: ['vxe-tree', {
3822
+ class: [
3823
+ 'vxe-tree',
3824
+ useScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
3825
+ useScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
3826
+ useScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
3827
+ useScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
3828
+ {
3529
3829
  [`size--${vSize}`]: vSize,
3530
3830
  'show--line': showLine,
3831
+ 'is--virtual-scrollbar': useScrollbar,
3832
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
3833
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
3834
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
3835
+ 'overflow-y': yThumbHeight,
3836
+ 'overflow-x': xThumbWidth,
3531
3837
  'checkbox--highlight': checkboxOpts.highlight,
3532
3838
  'radio--highlight': radioOpts.highlight,
3533
3839
  'node--hover': isNodeHover,
3534
3840
  'node--trigger': trigger === 'node',
3535
3841
  'is--loading': loading
3536
- }],
3842
+ }
3843
+ ],
3844
+ style: wrapperStyles,
3537
3845
  on: teOns
3538
3846
  }, [
3539
3847
  headerSlot
@@ -3570,6 +3878,57 @@ export default {
3570
3878
  class: 'vxe-tree--footer-wrapper'
3571
3879
  }, footerSlot({ $tree: $xeTree }))
3572
3880
  : renderEmptyElement($xeTree),
3881
+ /**
3882
+ * 滚动条
3883
+ */
3884
+ useScrollbar
3885
+ ? h('div', {
3886
+ class: scrollbarWrapperClss
3887
+ }, [
3888
+ scrollXVisible === false
3889
+ ? renderEmptyElement($xeTree)
3890
+ : h('div', {
3891
+ ref: 'refTrackXElem',
3892
+ class: 'vxe-scrollbar--track-x',
3893
+ on: {
3894
+ click: $xeTree.clickTrackXEvent
3895
+ }
3896
+ }, [
3897
+ h('div', {
3898
+ ref: 'refThumbXElem',
3899
+ class: 'vxe-scrollbar--thumb-x',
3900
+ on: {
3901
+ pointerdown: $xeTree.pointerdownThumbXEvent,
3902
+ pointermove: $xeTree.pointermoveThumbXEvent,
3903
+ pointerup: $xeTree.cleatPointerThumbEvent,
3904
+ pointercancel: $xeTree.cleatPointerThumbEvent,
3905
+ lostpointercapture: $xeTree.cleatPointerThumbEvent
3906
+ }
3907
+ })
3908
+ ]),
3909
+ scrollYVisible === false
3910
+ ? renderEmptyElement($xeTree)
3911
+ : h('div', {
3912
+ ref: 'refTrackYElem',
3913
+ class: 'vxe-scrollbar--track-y',
3914
+ on: {
3915
+ click: $xeTree.clickTrackYEvent
3916
+ }
3917
+ }, [
3918
+ h('div', {
3919
+ ref: 'refThumbYElem',
3920
+ class: 'vxe-scrollbar--thumb-y',
3921
+ on: {
3922
+ pointerdown: $xeTree.pointerdownThumbYEvent,
3923
+ pointermove: $xeTree.pointermoveThumbYEvent,
3924
+ pointerup: $xeTree.cleatPointerThumbEvent,
3925
+ pointercancel: $xeTree.cleatPointerThumbEvent,
3926
+ lostpointercapture: $xeTree.cleatPointerThumbEvent
3927
+ }
3928
+ })
3929
+ ])
3930
+ ])
3931
+ : renderEmptyElement($xeTree),
3573
3932
  /**
3574
3933
  * 拖拽提示
3575
3934
  */
@@ -3659,19 +4018,37 @@ export default {
3659
4018
  },
3660
4019
  height() {
3661
4020
  const $xeTree = this;
3662
- $xeTree.hFlag++;
4021
+ $xeTree.reFlag++;
3663
4022
  },
3664
4023
  minHeight() {
3665
4024
  const $xeTree = this;
3666
- $xeTree.hFlag++;
4025
+ $xeTree.reFlag++;
3667
4026
  },
3668
4027
  maxHeight() {
3669
4028
  const $xeTree = this;
3670
- $xeTree.hFlag++;
4029
+ $xeTree.reFlag++;
3671
4030
  },
3672
- hFlag() {
4031
+ useScrollbar() {
3673
4032
  const $xeTree = this;
3674
- $xeTree.recalculate();
4033
+ $xeTree.reFlag++;
4034
+ },
4035
+ computeScrollXVisible() {
4036
+ const $xeTree = this;
4037
+ $xeTree.$nextTick(() => {
4038
+ $xeTree.reFlag++;
4039
+ });
4040
+ },
4041
+ computeScrollYVisible() {
4042
+ const $xeTree = this;
4043
+ $xeTree.$nextTick(() => {
4044
+ $xeTree.reFlag++;
4045
+ });
4046
+ },
4047
+ reFlag() {
4048
+ const $xeTree = this;
4049
+ $xeTree.recalculate().then(() => {
4050
+ $xeTree.recalculate();
4051
+ });
3675
4052
  }
3676
4053
  },
3677
4054
  created() {
@@ -3686,7 +4063,7 @@ export default {
3686
4063
  const $xeTree = this;
3687
4064
  const props = $xeTree;
3688
4065
  const internalData = $xeTree.internalData;
3689
- const { transform, drag, menuConfig, showOverflow, lazy, loadMethod } = props;
4066
+ const { transform, drag, menuConfig, showOverflow, lazy, loadMethod, autoResize, useScrollbar } = props;
3690
4067
  const dragOpts = $xeTree.computeDragOpts;
3691
4068
  if (!showOverflow) {
3692
4069
  errLog('vxe.error.errProp', ['show-overflow=false', 'show-overflow=true']);
@@ -3707,24 +4084,30 @@ export default {
3707
4084
  if (menuConfig && !VxeUIContextMenu) {
3708
4085
  errLog('vxe.error.reqComp', ['vxe-context-menu']);
3709
4086
  }
3710
- if (props.autoResize) {
4087
+ if (useScrollbar || autoResize) {
3711
4088
  const el = $xeTree.$refs.refElem;
4089
+ const viewInnerEl = $xeTree.$refs.refVirtualBody;
3712
4090
  const parentEl = $xeTree.getParentElem();
3713
4091
  const resizeObserver = globalResize.create(() => {
3714
- if (props.autoResize) {
3715
- $xeTree.recalculate();
3716
- }
4092
+ $xeTree.reFlag++;
3717
4093
  });
3718
4094
  if (el) {
3719
4095
  resizeObserver.observe(el);
4096
+ if (autoResize) {
4097
+ if (parentEl) {
4098
+ resizeObserver.observe(parentEl);
4099
+ }
4100
+ }
3720
4101
  }
3721
- if (parentEl) {
3722
- resizeObserver.observe(parentEl);
4102
+ if (viewInnerEl) {
4103
+ resizeObserver.observe(viewInnerEl);
3723
4104
  }
3724
4105
  internalData.resizeObserver = resizeObserver;
3725
4106
  }
3726
- $xeTree.recalculate();
3727
- globalEvents.on($xeTree, 'resize', $xeTree.handleGlobalResizeEvent);
4107
+ $xeTree.reFlag++;
4108
+ globalEvents.on($xeTree, 'resize', () => {
4109
+ $xeTree.reFlag++;
4110
+ });
3728
4111
  },
3729
4112
  beforeDestroy() {
3730
4113
  const $xeTree = this;