@vxe-ui/core 4.4.35 → 4.4.36

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.
package/lib/src/useFns.js CHANGED
@@ -3,16 +3,27 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useFns = void 0;
6
+ exports.useInitVScrollbar = exports.useFns = void 0;
7
7
  exports.usePermission = usePermission;
8
8
  exports.useSize = useSize;
9
9
  exports.useVScrollbar = useVScrollbar;
10
10
  var _xeUtils = _interopRequireDefault(require("xe-utils"));
11
11
  var _vue = require("vue");
12
12
  var _permission = require("./permission");
13
+ var _scrollbarUtils = require("./scrollbar-utils");
13
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ const {
16
+ getThumbOffsetSize,
17
+ getThumbSize,
18
+ getScrollFromClick,
19
+ getScrollFromDrag
20
+ } = _scrollbarUtils.scrollbarUtils;
21
+ /**
22
+ * 组件尺寸上下文
23
+ * @param props
24
+ * @returns
25
+ */
14
26
  function useSize(props) {
15
- // 组件尺寸上下文
16
27
  const xeSizeInfo = (0, _vue.inject)('xeSizeInfo', null);
17
28
  const computeSize = (0, _vue.computed)(() => {
18
29
  const {
@@ -25,8 +36,25 @@ function useSize(props) {
25
36
  computeSize
26
37
  };
27
38
  }
39
+ /**
40
+ * 权限码处理
41
+ * @param props
42
+ * @returns
43
+ */
44
+ function usePermission(props) {
45
+ const computePermissionInfo = (0, _vue.computed)(() => {
46
+ return (0, _permission.handleCheckInfo)(props.permissionCode, props.permissionMethod);
47
+ });
48
+ return {
49
+ computePermissionInfo
50
+ };
51
+ }
52
+ /**
53
+ * 虚拟滚动条是否启用
54
+ * @param props
55
+ * @returns
56
+ */
28
57
  function useVScrollbar(props) {
29
- // 组件虚拟滚动条
30
58
  const xeScrollbarInfo = (0, _vue.inject)('xeScrollbarInfo', null);
31
59
  const computeIsVScrollbar = (0, _vue.computed)(() => {
32
60
  const {
@@ -39,16 +67,219 @@ function useVScrollbar(props) {
39
67
  computeIsVScrollbar
40
68
  };
41
69
  }
42
- function usePermission(props) {
43
- const computePermissionInfo = (0, _vue.computed)(() => {
44
- return (0, _permission.handleCheckInfo)(props.permissionCode, props.permissionMethod);
45
- });
70
+ /**
71
+ * 初始化虚拟滚动条
72
+ * @param reactData
73
+ * @param internalData
74
+ * @param refViewElem
75
+ * @returns
76
+ */
77
+ const useInitVScrollbar = $xeVM => {
78
+ const {
79
+ reactData,
80
+ internalData
81
+ } = $xeVM;
82
+ const refTrackXElem = (0, _vue.ref)();
83
+ const refTrackYElem = (0, _vue.ref)();
84
+ const refThumbXElem = (0, _vue.ref)();
85
+ const refThumbYElem = (0, _vue.ref)();
86
+ const updateThumbSize = () => {
87
+ const viewEl = $xeVM.getScrollViewElem();
88
+ if (!viewEl) {
89
+ return;
90
+ }
91
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
92
+ return;
93
+ }
94
+ const trackXEl = refTrackXElem.value;
95
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
96
+ const thumbXElem = refThumbXElem.value;
97
+ if (thumbXElem) {
98
+ thumbXElem.style.width = xThumbWidth + 'px';
99
+ }
100
+ reactData.xThumbWidth = xThumbWidth;
101
+ const trackYEl = refTrackYElem.value;
102
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
103
+ const thumbYElem = refThumbYElem.value;
104
+ if (thumbYElem) {
105
+ thumbYElem.style.height = yThumbHeight + 'px';
106
+ }
107
+ reactData.yThumbHeight = yThumbHeight;
108
+ };
109
+ const updateThumbOffset = () => {
110
+ const viewEl = $xeVM.getScrollViewElem();
111
+ if (!viewEl) {
112
+ return;
113
+ }
114
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
115
+ return;
116
+ }
117
+ const {
118
+ xThumbWidth,
119
+ yThumbHeight
120
+ } = reactData;
121
+ const trackXEl = refTrackXElem.value;
122
+ const thumbXElem = refThumbXElem.value;
123
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
124
+ internalData.xThumbLeft = xThumbLeft;
125
+ if (thumbXElem && xThumbWidth) {
126
+ thumbXElem.style.width = xThumbWidth + 'px';
127
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
128
+ }
129
+ const trackYEl = refTrackYElem.value;
130
+ const thumbYElem = refThumbYElem.value;
131
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
132
+ internalData.yThumbTop = yThumbTop;
133
+ if (thumbYElem && yThumbHeight) {
134
+ thumbYElem.style.height = yThumbHeight + 'px';
135
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
136
+ }
137
+ };
138
+ const clickTrackXEvent = evnt => {
139
+ const trackEl = evnt.currentTarget;
140
+ if (trackEl !== evnt.target) {
141
+ return;
142
+ }
143
+ const viewEl = $xeVM.getScrollViewElem();
144
+ if (!viewEl) {
145
+ return;
146
+ }
147
+ const {
148
+ xThumbWidth
149
+ } = reactData;
150
+ const trackRect = trackEl.getBoundingClientRect();
151
+ viewEl.scrollTo({
152
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
153
+ behavior: 'auto'
154
+ });
155
+ };
156
+ const clickTrackYEvent = evnt => {
157
+ const trackEl = evnt.currentTarget;
158
+ if (trackEl !== evnt.target) {
159
+ return;
160
+ }
161
+ const viewEl = $xeVM.getScrollViewElem();
162
+ if (!viewEl) {
163
+ return;
164
+ }
165
+ const {
166
+ yThumbHeight
167
+ } = reactData;
168
+ const trackRect = trackEl.getBoundingClientRect();
169
+ viewEl.scrollTo({
170
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
171
+ behavior: 'auto'
172
+ });
173
+ };
174
+ const pointerdownThumbXEvent = evnt => {
175
+ const thumbEl = evnt.currentTarget;
176
+ internalData.isThumbDrag = true;
177
+ thumbEl.setPointerCapture(evnt.pointerId);
178
+ const viewEl = $xeVM.getScrollViewElem();
179
+ if (!viewEl) {
180
+ return;
181
+ }
182
+ const {
183
+ xThumbWidth
184
+ } = reactData;
185
+ const trackEl = thumbEl.parentElement;
186
+ const trackRect = trackEl.getBoundingClientRect();
187
+ const pointerPosition = evnt.clientX - trackRect.left;
188
+ // 记录 thumb 的偏移
189
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
190
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
191
+ };
192
+ const pointermoveThumbXEvent = evnt => {
193
+ const thumbEl = evnt.currentTarget;
194
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
195
+ return;
196
+ }
197
+ const {
198
+ isThumbDrag,
199
+ thumbDragOffset
200
+ } = internalData;
201
+ if (isThumbDrag) {
202
+ const viewEl = $xeVM.getScrollViewElem();
203
+ if (!viewEl) {
204
+ return;
205
+ }
206
+ const {
207
+ xThumbWidth
208
+ } = reactData;
209
+ const thumbEl = evnt.currentTarget;
210
+ const trackEl = thumbEl.parentElement;
211
+ const trackRect = trackEl.getBoundingClientRect();
212
+ // 更新偏移
213
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
214
+ }
215
+ };
216
+ const cleatPointerThumbEvent = evnt => {
217
+ const thumbEl = evnt.currentTarget;
218
+ thumbEl.releasePointerCapture(evnt.pointerId);
219
+ internalData.isThumbDrag = false;
220
+ };
221
+ const pointerdownThumbYEvent = evnt => {
222
+ const thumbEl = evnt.currentTarget;
223
+ internalData.isThumbDrag = true;
224
+ thumbEl.setPointerCapture(evnt.pointerId);
225
+ const viewEl = $xeVM.getScrollViewElem();
226
+ if (!viewEl) {
227
+ return;
228
+ }
229
+ const {
230
+ yThumbHeight
231
+ } = reactData;
232
+ const trackEl = thumbEl.parentElement;
233
+ const trackRect = trackEl.getBoundingClientRect();
234
+ const pointerPosition = evnt.clientY - trackRect.top;
235
+ // 记录 thumb 的偏移
236
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
237
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
238
+ };
239
+ const pointermoveThumbYEvent = evnt => {
240
+ const thumbEl = evnt.currentTarget;
241
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
242
+ return;
243
+ }
244
+ const {
245
+ isThumbDrag,
246
+ thumbDragOffset
247
+ } = internalData;
248
+ if (isThumbDrag) {
249
+ const viewEl = $xeVM.getScrollViewElem();
250
+ if (!viewEl) {
251
+ return;
252
+ }
253
+ const {
254
+ yThumbHeight
255
+ } = reactData;
256
+ const thumbEl = evnt.currentTarget;
257
+ const trackEl = thumbEl.parentElement;
258
+ const trackRect = trackEl.getBoundingClientRect();
259
+ // 更新偏移
260
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
261
+ }
262
+ };
46
263
  return {
47
- computePermissionInfo
264
+ refTrackXElem,
265
+ refTrackYElem,
266
+ refThumbXElem,
267
+ refThumbYElem,
268
+ updateThumbSize,
269
+ updateThumbOffset,
270
+ clickTrackXEvent,
271
+ clickTrackYEvent,
272
+ pointerdownThumbXEvent,
273
+ pointermoveThumbXEvent,
274
+ cleatPointerThumbEvent,
275
+ pointerdownThumbYEvent,
276
+ pointermoveThumbYEvent
48
277
  };
49
- }
278
+ };
279
+ exports.useInitVScrollbar = useInitVScrollbar;
50
280
  const useFns = exports.useFns = {
51
281
  useSize,
52
282
  useVScrollbar,
53
- usePermission
283
+ usePermission,
284
+ useInitVScrollbar
54
285
  };
@@ -1 +1 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.useFns=void 0,exports.usePermission=usePermission,exports.useSize=useSize,exports.useVScrollbar=useVScrollbar;var _xeUtils=_interopRequireDefault(require("xe-utils")),_vue=require("vue"),_permission=require("./permission");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function useSize(r){let u=(0,_vue.inject)("xeSizeInfo",null);var e=(0,_vue.computed)(()=>{var e=r.size;return e||(u?u.value:null)});return(0,_vue.provide)("xeSizeInfo",e),{computeSize:e}}function useVScrollbar(r){let u=(0,_vue.inject)("xeScrollbarInfo",null);var e=(0,_vue.computed)(()=>{var e=r.useScrollbar;return _xeUtils.default.isBoolean(e)?e:u?u.value:null});return(0,_vue.provide)("xeScrollbarInfo",e),{computeIsVScrollbar:e}}function usePermission(e){return{computePermissionInfo:(0,_vue.computed)(()=>(0,_permission.handleCheckInfo)(e.permissionCode,e.permissionMethod))}}let useFns=exports.useFns={useSize:useSize,useVScrollbar:useVScrollbar,usePermission:usePermission};
1
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.useInitVScrollbar=exports.useFns=void 0,exports.usePermission=usePermission,exports.useSize=useSize,exports.useVScrollbar=useVScrollbar;var _xeUtils=_interopRequireDefault(require("xe-utils")),_vue=require("vue"),_permission=require("./permission"),_scrollbarUtils=require("./scrollbar-utils");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}let{getThumbOffsetSize,getThumbSize,getScrollFromClick,getScrollFromDrag}=_scrollbarUtils.scrollbarUtils;function useSize(t){let r=(0,_vue.inject)("xeSizeInfo",null);var e=(0,_vue.computed)(()=>{var e=t.size;return e||(r?r.value:null)});return(0,_vue.provide)("xeSizeInfo",e),{computeSize:e}}function usePermission(e){return{computePermissionInfo:(0,_vue.computed)(()=>(0,_permission.handleCheckInfo)(e.permissionCode,e.permissionMethod))}}function useVScrollbar(t){let r=(0,_vue.inject)("xeScrollbarInfo",null);var e=(0,_vue.computed)(()=>{var e=t.useScrollbar;return _xeUtils.default.isBoolean(e)?e:r?r.value:null});return(0,_vue.provide)("xeScrollbarInfo",e),{computeIsVScrollbar:e}}let useInitVScrollbar=o=>{let{reactData:s,internalData:c}=o,u=(0,_vue.ref)(),n=(0,_vue.ref)(),a=(0,_vue.ref)(),h=(0,_vue.ref)();return{refTrackXElem:u,refTrackYElem:n,refThumbXElem:a,refThumbYElem:h,updateThumbSize:()=>{var e,t,r=o.getScrollViewElem();r&&r.clientHeight&&(t=(t=u.value)?getThumbSize(r.clientWidth,r.scrollWidth,t.clientWidth):0,(e=a.value)&&(e.style.width=t+"px"),s.xThumbWidth=t,t=(e=n.value)?getThumbSize(r.clientHeight,r.scrollHeight,e.clientHeight):0,(r=h.value)&&(r.style.height=t+"px"),s.yThumbHeight=t)},updateThumbOffset:()=>{var e,t,r,l,i=o.getScrollViewElem();i&&i.clientHeight&&({xThumbWidth:t,yThumbHeight:e}=s,l=u.value,r=a.value,l=l&&t?getThumbOffsetSize(i.scrollLeft,i.clientWidth,i.scrollWidth,l.clientWidth,t):0,c.xThumbLeft=l,r&&t&&(r.style.width=t+"px",r.style.transform=`translateX(${l}px)`),t=n.value,r=h.value,l=t&&e?getThumbOffsetSize(i.scrollTop,i.clientHeight,i.scrollHeight,t.clientHeight,e):0,c.yThumbTop=l,r)&&e&&(r.style.height=e+"px",r.style.transform=`translateY(${l}px)`)},clickTrackXEvent:e=>{var t,r,l,i=e.currentTarget;i===e.target&&(t=o.getScrollViewElem())&&(r=s.xThumbWidth,l=i.getBoundingClientRect(),t.scrollTo({left:getScrollFromClick(e.clientX-l.left,t.clientWidth,t.scrollWidth,i.clientWidth,r),behavior:"auto"}))},clickTrackYEvent:e=>{var t,r,l,i=e.currentTarget;i===e.target&&(t=o.getScrollViewElem())&&(r=s.yThumbHeight,l=i.getBoundingClientRect(),t.scrollTo({top:getScrollFromClick(e.clientY-l.top,t.clientHeight,t.scrollHeight,i.clientHeight,r),behavior:"auto"}))},pointerdownThumbXEvent:e=>{var t,r,l=e.currentTarget,i=(c.isThumbDrag=!0,l.setPointerCapture(e.pointerId),o.getScrollViewElem());i&&(t=s.xThumbWidth,r=(l=l.parentElement).getBoundingClientRect(),e=e.clientX-r.left,r=getThumbOffsetSize(i.scrollLeft,i.clientWidth,i.scrollWidth,l.clientWidth,t),c.thumbDragOffset=e-r)},pointermoveThumbXEvent:t=>{let e=t.currentTarget;if(e.hasPointerCapture(t.pointerId)){var{isThumbDrag:r,thumbDragOffset:l}=c;if(r){r=o.getScrollViewElem();if(r){var i=s.xThumbWidth;let e=t.currentTarget;var u=e.parentElement,n=u.getBoundingClientRect();r.scrollLeft=getScrollFromDrag(t.clientX-n.left,l,r.clientWidth,r.scrollWidth,u.clientWidth,i)}}}},cleatPointerThumbEvent:e=>{e.currentTarget.releasePointerCapture(e.pointerId),c.isThumbDrag=!1},pointerdownThumbYEvent:e=>{var t,r,l=e.currentTarget,i=(c.isThumbDrag=!0,l.setPointerCapture(e.pointerId),o.getScrollViewElem());i&&(t=s.yThumbHeight,r=(l=l.parentElement).getBoundingClientRect(),e=e.clientY-r.top,r=getThumbOffsetSize(i.scrollTop,i.clientHeight,i.scrollHeight,l.clientHeight,t),c.thumbDragOffset=e-r)},pointermoveThumbYEvent:t=>{let e=t.currentTarget;if(e.hasPointerCapture(t.pointerId)){var{isThumbDrag:r,thumbDragOffset:l}=c;if(r){r=o.getScrollViewElem();if(r){var i=s.yThumbHeight;let e=t.currentTarget;var u=e.parentElement,n=u.getBoundingClientRect();r.scrollTop=getScrollFromDrag(t.clientY-n.top,l,r.clientHeight,r.scrollHeight,u.clientHeight,i)}}}}}},useFns=(exports.useInitVScrollbar=useInitVScrollbar,exports.useFns={useSize:useSize,useVScrollbar:useVScrollbar,usePermission:usePermission,useInitVScrollbar:useInitVScrollbar});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vxe-ui/core",
3
- "version": "4.4.35",
3
+ "version": "4.4.36",
4
4
  "description": "Vxe UI core library",
5
5
  "scripts": {
6
6
  "update": "npm install --legacy-peer-deps",
@@ -1,13 +1,20 @@
1
1
  import XEUtils from 'xe-utils'
2
- import { computed, inject, provide, ComputedRef } from 'vue'
2
+ import { computed, ref, Ref, inject, provide, ComputedRef } from 'vue'
3
3
  import { handleCheckInfo } from './permission'
4
+ import { scrollbarUtils } from './scrollbar-utils'
4
5
 
5
- import type { VxeComponentSizeType, VxeComponentIsVScrollbar, VxeComponentPermissionCodeType, VxeComponentPermissionMethod } from '../../types'
6
+ import type { VxeComponentSizeType, VxeComponentIsVScrollbar, VxeUseInitVScrollbar, VxeComponentPermissionCodeType, VxeComponentPermissionMethod, VxeUseInitVScrollbarResult, VxeUseSizeResult, VxeUsePermissionResult, VxeUseVScrollbarResult } from '../../types'
6
7
 
8
+ const { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } = scrollbarUtils
9
+
10
+ /**
11
+ * 组件尺寸上下文
12
+ * @param props
13
+ * @returns
14
+ */
7
15
  export function useSize (props: {
8
16
  size?: VxeComponentSizeType
9
- }) {
10
- // 组件尺寸上下文
17
+ }): VxeUseSizeResult {
11
18
  const xeSizeInfo = inject('xeSizeInfo', null as ComputedRef<VxeComponentSizeType> | null)
12
19
  const computeSize = computed(() => {
13
20
  const { size } = props
@@ -18,10 +25,31 @@ export function useSize (props: {
18
25
  return { computeSize }
19
26
  }
20
27
 
28
+ /**
29
+ * 权限码处理
30
+ * @param props
31
+ * @returns
32
+ */
33
+ export function usePermission (props: {
34
+ permissionCode?: VxeComponentPermissionCodeType
35
+ permissionMethod?: VxeComponentPermissionMethod
36
+ }): VxeUsePermissionResult {
37
+ const computePermissionInfo = computed(() => {
38
+ return handleCheckInfo(props.permissionCode, props.permissionMethod)
39
+ })
40
+ return {
41
+ computePermissionInfo
42
+ }
43
+ }
44
+
45
+ /**
46
+ * 虚拟滚动条是否启用
47
+ * @param props
48
+ * @returns
49
+ */
21
50
  export function useVScrollbar (props: {
22
51
  useScrollbar?: VxeComponentIsVScrollbar
23
- }) {
24
- // 组件虚拟滚动条
52
+ }): VxeUseVScrollbarResult {
25
53
  const xeScrollbarInfo = inject('xeScrollbarInfo', null as ComputedRef<VxeComponentIsVScrollbar> | null)
26
54
  const computeIsVScrollbar = computed(() => {
27
55
  const { useScrollbar } = props
@@ -32,20 +60,216 @@ export function useVScrollbar (props: {
32
60
  return { computeIsVScrollbar }
33
61
  }
34
62
 
35
- export function usePermission (props: {
36
- permissionCode?: VxeComponentPermissionCodeType
37
- permissionMethod?: VxeComponentPermissionMethod
38
- }) {
39
- const computePermissionInfo = computed(() => {
40
- return handleCheckInfo(props.permissionCode, props.permissionMethod)
41
- })
63
+ /**
64
+ * 初始化虚拟滚动条
65
+ * @param reactData
66
+ * @param internalData
67
+ * @param refViewElem
68
+ * @returns
69
+ */
70
+ export const useInitVScrollbar: VxeUseInitVScrollbar = ($xeVM): VxeUseInitVScrollbarResult & {
71
+ refTrackXElem: Ref<HTMLDivElement | undefined>
72
+ refTrackYElem: Ref<HTMLDivElement | undefined>
73
+ refThumbXElem: Ref<HTMLDivElement | undefined>
74
+ refThumbYElem: Ref<HTMLDivElement | undefined>
75
+ } => {
76
+ const { reactData, internalData } = $xeVM
77
+
78
+ const refTrackXElem = ref<HTMLDivElement>()
79
+ const refTrackYElem = ref<HTMLDivElement>()
80
+ const refThumbXElem = ref<HTMLDivElement>()
81
+ const refThumbYElem = ref<HTMLDivElement>()
82
+
83
+ const updateThumbSize = () => {
84
+ const viewEl = $xeVM.getScrollViewElem()
85
+ if (!viewEl) {
86
+ return
87
+ }
88
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
89
+ return
90
+ }
91
+ const trackXEl = refTrackXElem.value
92
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
93
+ const thumbXElem = refThumbXElem.value
94
+ if (thumbXElem) {
95
+ thumbXElem.style.width = xThumbWidth + 'px'
96
+ }
97
+ reactData.xThumbWidth = xThumbWidth
98
+
99
+ const trackYEl = refTrackYElem.value
100
+
101
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
102
+ const thumbYElem = refThumbYElem.value
103
+ if (thumbYElem) {
104
+ thumbYElem.style.height = yThumbHeight + 'px'
105
+ }
106
+ reactData.yThumbHeight = yThumbHeight
107
+ }
108
+
109
+ const updateThumbOffset = () => {
110
+ const viewEl = $xeVM.getScrollViewElem()
111
+ if (!viewEl) {
112
+ return
113
+ }
114
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
115
+ return
116
+ }
117
+ const { xThumbWidth, yThumbHeight } = reactData
118
+ const trackXEl = refTrackXElem.value
119
+ const thumbXElem = refThumbXElem.value
120
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
121
+ internalData.xThumbLeft = xThumbLeft
122
+ if (thumbXElem && xThumbWidth) {
123
+ thumbXElem.style.width = xThumbWidth + 'px'
124
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
125
+ }
126
+
127
+ const trackYEl = refTrackYElem.value
128
+ const thumbYElem = refThumbYElem.value
129
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
130
+ internalData.yThumbTop = yThumbTop
131
+ if (thumbYElem && yThumbHeight) {
132
+ thumbYElem.style.height = yThumbHeight + 'px'
133
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`
134
+ }
135
+ }
136
+
137
+ const clickTrackXEvent = (evnt: MouseEvent) => {
138
+ const trackEl = evnt.currentTarget as HTMLDivElement
139
+ if (trackEl !== evnt.target) {
140
+ return
141
+ }
142
+ const viewEl = $xeVM.getScrollViewElem()
143
+ if (!viewEl) {
144
+ return
145
+ }
146
+ const { xThumbWidth } = reactData
147
+ const trackRect = trackEl.getBoundingClientRect()
148
+ viewEl.scrollTo({
149
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
150
+ behavior: 'auto'
151
+ })
152
+ }
153
+
154
+ const clickTrackYEvent = (evnt: MouseEvent) => {
155
+ const trackEl = evnt.currentTarget as HTMLDivElement
156
+ if (trackEl !== evnt.target) {
157
+ return
158
+ }
159
+ const viewEl = $xeVM.getScrollViewElem()
160
+ if (!viewEl) {
161
+ return
162
+ }
163
+ const { yThumbHeight } = reactData
164
+ const trackRect = trackEl.getBoundingClientRect()
165
+ viewEl.scrollTo({
166
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
167
+ behavior: 'auto'
168
+ })
169
+ }
170
+
171
+ const pointerdownThumbXEvent = (evnt: PointerEvent) => {
172
+ const thumbEl = evnt.currentTarget as HTMLDivElement
173
+ internalData.isThumbDrag = true
174
+ thumbEl.setPointerCapture(evnt.pointerId)
175
+
176
+ const viewEl = $xeVM.getScrollViewElem()
177
+ if (!viewEl) {
178
+ return
179
+ }
180
+ const { xThumbWidth } = reactData
181
+ const trackEl = thumbEl.parentElement as HTMLDivElement
182
+ const trackRect = trackEl.getBoundingClientRect()
183
+ const pointerPosition = evnt.clientX - trackRect.left
184
+ // 记录 thumb 的偏移
185
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
186
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
187
+ }
188
+
189
+ const pointermoveThumbXEvent = (evnt: PointerEvent) => {
190
+ const thumbEl = evnt.currentTarget as HTMLDivElement
191
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
192
+ return
193
+ }
194
+ const { isThumbDrag, thumbDragOffset } = internalData
195
+ if (isThumbDrag) {
196
+ const viewEl = $xeVM.getScrollViewElem()
197
+ if (!viewEl) {
198
+ return
199
+ }
200
+ const { xThumbWidth } = reactData
201
+ const thumbEl = evnt.currentTarget as HTMLDivElement
202
+ const trackEl = thumbEl.parentElement as HTMLDivElement
203
+ const trackRect = trackEl.getBoundingClientRect()
204
+ // 更新偏移
205
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
206
+ }
207
+ }
208
+
209
+ const cleatPointerThumbEvent = (evnt: PointerEvent) => {
210
+ const thumbEl = evnt.currentTarget as HTMLDivElement
211
+ thumbEl.releasePointerCapture(evnt.pointerId)
212
+ internalData.isThumbDrag = false
213
+ }
214
+
215
+ const pointerdownThumbYEvent = (evnt: PointerEvent) => {
216
+ const thumbEl = evnt.currentTarget as HTMLDivElement
217
+ internalData.isThumbDrag = true
218
+ thumbEl.setPointerCapture(evnt.pointerId)
219
+
220
+ const viewEl = $xeVM.getScrollViewElem()
221
+ if (!viewEl) {
222
+ return
223
+ }
224
+ const { yThumbHeight } = reactData
225
+ const trackEl = thumbEl.parentElement as HTMLDivElement
226
+ const trackRect = trackEl.getBoundingClientRect()
227
+ const pointerPosition = evnt.clientY - trackRect.top
228
+ // 记录 thumb 的偏移
229
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
230
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
231
+ }
232
+
233
+ const pointermoveThumbYEvent = (evnt: PointerEvent) => {
234
+ const thumbEl = evnt.currentTarget as HTMLDivElement
235
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
236
+ return
237
+ }
238
+ const { isThumbDrag, thumbDragOffset } = internalData
239
+ if (isThumbDrag) {
240
+ const viewEl = $xeVM.getScrollViewElem()
241
+ if (!viewEl) {
242
+ return
243
+ }
244
+ const { yThumbHeight } = reactData
245
+ const thumbEl = evnt.currentTarget as HTMLDivElement
246
+ const trackEl = thumbEl.parentElement as HTMLDivElement
247
+ const trackRect = trackEl.getBoundingClientRect()
248
+ // 更新偏移
249
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
250
+ }
251
+ }
252
+
42
253
  return {
43
- computePermissionInfo
254
+ refTrackXElem,
255
+ refTrackYElem,
256
+ refThumbXElem,
257
+ refThumbYElem,
258
+ updateThumbSize,
259
+ updateThumbOffset,
260
+ clickTrackXEvent,
261
+ clickTrackYEvent,
262
+ pointerdownThumbXEvent,
263
+ pointermoveThumbXEvent,
264
+ cleatPointerThumbEvent,
265
+ pointerdownThumbYEvent,
266
+ pointermoveThumbYEvent
44
267
  }
45
268
  }
46
269
 
47
270
  export const useFns = {
48
271
  useSize,
49
272
  useVScrollbar,
50
- usePermission
273
+ usePermission,
274
+ useInitVScrollbar
51
275
  }