vite-uni-dev-tool 0.0.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 (69) hide show
  1. package/README.md +120 -0
  2. package/dev/components/Button/index.vue +34 -0
  3. package/dev/components/Checkbox/index.vue +40 -0
  4. package/dev/components/CloseButton/index.vue +25 -0
  5. package/dev/components/Connection/index.vue +98 -0
  6. package/dev/components/ConsoleList/ConsoleItem.vue +89 -0
  7. package/dev/components/ConsoleList/index.vue +98 -0
  8. package/dev/components/DevTool/index.vue +165 -0
  9. package/dev/components/DevToolButton/index.vue +213 -0
  10. package/dev/components/DevToolWindow/index.vue +847 -0
  11. package/dev/components/DeviceInfo/index.vue +32 -0
  12. package/dev/components/Empty/empty.png +0 -0
  13. package/dev/components/Empty/index.vue +28 -0
  14. package/dev/components/FilterInput/index.vue +86 -0
  15. package/dev/components/JsonPretty/components/Brackets/index.vue +23 -0
  16. package/dev/components/JsonPretty/components/Carets/index.vue +63 -0
  17. package/dev/components/JsonPretty/components/CheckController/index.vue +108 -0
  18. package/dev/components/JsonPretty/components/TreeNode/index.vue +348 -0
  19. package/dev/components/JsonPretty/hooks/useClipboard.ts +21 -0
  20. package/dev/components/JsonPretty/hooks/useError.ts +21 -0
  21. package/dev/components/JsonPretty/index.vue +463 -0
  22. package/dev/components/JsonPretty/type.ts +123 -0
  23. package/dev/components/JsonPretty/utils/index.ts +172 -0
  24. package/dev/components/NetworkList/NetworkDetail.vue +197 -0
  25. package/dev/components/NetworkList/NetworkItem.vue +106 -0
  26. package/dev/components/NetworkList/index.vue +108 -0
  27. package/dev/components/PiniaList/index.vue +64 -0
  28. package/dev/components/RouteList/index.vue +98 -0
  29. package/dev/components/SettingList/index.vue +235 -0
  30. package/dev/components/StorageList/index.vue +170 -0
  31. package/dev/components/SystemInfo/index.vue +34 -0
  32. package/dev/components/Tabs/index.vue +110 -0
  33. package/dev/components/Tag/index.vue +89 -0
  34. package/dev/components/UploadList/UploadDetail.vue +208 -0
  35. package/dev/components/UploadList/UploadItem.vue +111 -0
  36. package/dev/components/UploadList/index.vue +94 -0
  37. package/dev/components/VuexList/index.vue +54 -0
  38. package/dev/components/WebSocket/WebSocketItem.vue +98 -0
  39. package/dev/components/WebSocket/WebSocketList.vue +176 -0
  40. package/dev/components/WebSocket/index.vue +99 -0
  41. package/dev/components/WindowInfo/index.vue +33 -0
  42. package/dev/const.ts +95 -0
  43. package/dev/core.ts +103 -0
  44. package/dev/devConsole/index.ts +334 -0
  45. package/dev/devEvent/index.ts +665 -0
  46. package/dev/devIntercept/index.ts +629 -0
  47. package/dev/devStore/index.ts +581 -0
  48. package/dev/index.d.ts +6 -0
  49. package/dev/index.d.ts.map +1 -0
  50. package/dev/index.js +1 -0
  51. package/dev/plugins/uniDevTool/uniDevTool.d.ts +66 -0
  52. package/dev/plugins/uniDevTool/uniDevTool.d.ts.map +1 -0
  53. package/dev/plugins/uniDevTool/uniDevTool.js +13 -0
  54. package/dev/plugins/uniGlobalComponents/uniGlobalComponents.d.ts +28 -0
  55. package/dev/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +1 -0
  56. package/dev/plugins/uniGlobalComponents/uniGlobalComponents.js +5 -0
  57. package/dev/shims-uni.d.ts +43 -0
  58. package/dev/type.ts +188 -0
  59. package/dev/utils/date.ts +75 -0
  60. package/dev/utils/file.ts +121 -0
  61. package/dev/utils/function.ts +192 -0
  62. package/dev/utils/index.ts +25 -0
  63. package/dev/utils/ip.ts +79 -0
  64. package/dev/utils/language.ts +19 -0
  65. package/dev/utils/object.ts +235 -0
  66. package/dev/utils/page.ts +13 -0
  67. package/dev/utils/string.ts +23 -0
  68. package/dev/utils/utils.ts +198 -0
  69. package/package.json +34 -0
@@ -0,0 +1,21 @@
1
+ import { ref } from "vue";
2
+
3
+ export function useClipboard() {
4
+ const copied = ref(false);
5
+
6
+ const copy = async (source: string) => {
7
+ try {
8
+ await navigator.clipboard.writeText(source);
9
+ copied.value = true;
10
+ setTimeout(() => {
11
+ copied.value = false;
12
+ }, 300);
13
+ } catch (err) {
14
+ console.error("[json-pretty] Copy failed: ", err);
15
+ }
16
+ };
17
+
18
+ return {
19
+ copy
20
+ };
21
+ }
@@ -0,0 +1,21 @@
1
+ import { watchEffect } from "vue";
2
+
3
+ type UseErrorOptions = {
4
+ emitListener: boolean;
5
+ };
6
+
7
+ export function useError(message: string, { emitListener }: UseErrorOptions) {
8
+ const emit = () => {
9
+ throw new Error(`[VueJsonPretty] ${message}`);
10
+ };
11
+
12
+ watchEffect(() => {
13
+ if (emitListener) {
14
+ emit();
15
+ }
16
+ });
17
+
18
+ return {
19
+ emit
20
+ };
21
+ }
@@ -0,0 +1,463 @@
1
+ <template>
2
+ <view
3
+ :class="{
4
+ 'json-pretty-tree': true,
5
+ 'is-virtual': virtual,
6
+ dark: theme === 'dark',
7
+ }"
8
+ :style="
9
+ showLineNumber
10
+ ? {
11
+ paddingLeft: `${
12
+ Number(originFlatData.length.toString().length) * 12
13
+ }px`,
14
+ ...style,
15
+ }
16
+ : style
17
+ "
18
+ >
19
+ <scroll-view
20
+ v-if="virtual"
21
+ class="json-pretty-tree-list"
22
+ scroll-y
23
+ scroll-x
24
+ :style="{ height: `${height}px` }"
25
+ @scroll="handleTreeScroll"
26
+ ref="treeRef"
27
+ >
28
+ <view
29
+ class="json-pretty-tree-list-holder"
30
+ :style="{ height: `${flatData.length * itemHeight}px` }"
31
+ >
32
+ <view
33
+ class="json-pretty-tree-list-holder-inner"
34
+ :style="{ transform: `translateY(${state.translateY}px)` }"
35
+ >
36
+ <TreeNode
37
+ v-for="item in state?.visibleData"
38
+ :key="item.id"
39
+ :data="data"
40
+ :rootPath="rootPath"
41
+ :indent="indent"
42
+ :node="item"
43
+ :collapsed="!!state.hiddenPaths[item.path]"
44
+ :theme="theme"
45
+ :showDoubleQuotes="showDoubleQuotes"
46
+ :showLength="showLength"
47
+ :checked="selectedPaths.includes(item.path)"
48
+ :selectableType="selectableType"
49
+ :showLine="showLine"
50
+ :showLineNumber="showLineNumber"
51
+ :showSelectController="showSelectController"
52
+ :selectOnClickNode="selectOnClickNode"
53
+ :nodeSelectable="nodeSelectable"
54
+ :highlightSelectedNode="highlightSelectedNode"
55
+ :editable="editable"
56
+ :editableTrigger="editableTrigger"
57
+ :showIcon="showIcon"
58
+ :showKeyValueSpace="showKeyValueSpace"
59
+ :showNodeActions="showNodeActions"
60
+ @nodeClick="handleNodeClick"
61
+ @nodeMouseover="handleNodeMouseover"
62
+ @bracketsClick="handleBracketsClick"
63
+ @iconClick="handleIconClick"
64
+ @selectedChange="handleSelectedChange"
65
+ @valueChange="handleValueChange"
66
+ :style="
67
+ itemHeight && itemHeight !== 20
68
+ ? { lineHeight: `${itemHeight}px` }
69
+ : {}
70
+ "
71
+ />
72
+ </view>
73
+ </view>
74
+ </scroll-view>
75
+ <template v-else>
76
+ <TreeNode
77
+ v-for="item in state?.visibleData"
78
+ :key="item.id"
79
+ :data="data"
80
+ :rootPath="rootPath"
81
+ :indent="indent"
82
+ :node="item"
83
+ :collapsed="!!state.hiddenPaths[item.path]"
84
+ :theme="theme"
85
+ :showDoubleQuotes="showDoubleQuotes"
86
+ :showLength="showLength"
87
+ :checked="selectedPaths.includes(item.path)"
88
+ :selectableType="selectableType"
89
+ :showLine="showLine"
90
+ :showLineNumber="showLineNumber"
91
+ :showSelectController="showSelectController"
92
+ :selectOnClickNode="selectOnClickNode"
93
+ :nodeSelectable="nodeSelectable"
94
+ :highlightSelectedNode="highlightSelectedNode"
95
+ :editable="editable"
96
+ :editableTrigger="editableTrigger"
97
+ :showIcon="showIcon"
98
+ :showKeyValueSpace="showKeyValueSpace"
99
+ :showNodeActions="showNodeActions"
100
+ @nodeClick="handleNodeClick"
101
+ @nodeMouseover="handleNodeMouseover"
102
+ @bracketsClick="handleBracketsClick"
103
+ @iconClick="handleIconClick"
104
+ @selectedChange="handleSelectedChange"
105
+ @valueChange="handleValueChange"
106
+ :style="
107
+ itemHeight && itemHeight !== 20
108
+ ? { lineHeight: `${itemHeight}px` }
109
+ : {}
110
+ "
111
+ />
112
+ </template>
113
+ </view>
114
+ </template>
115
+
116
+ <script setup lang="ts">
117
+ import {
118
+ ref,
119
+ reactive,
120
+ computed,
121
+ watchEffect,
122
+ watch,
123
+ defineEmits,
124
+ onMounted,
125
+ onUpdated,
126
+ onUnmounted,
127
+ } from 'vue';
128
+ import TreeNode from './components/TreeNode/index.vue';
129
+
130
+ import { emitError, jsonFlatten, cloneDeep, isFunction } from './utils';
131
+
132
+ import type { NodeDataType, ScrollEvent, Tree } from './type';
133
+ import { setValueByPath } from '../../utils';
134
+
135
+ // 定义 emits 类型
136
+ type Emits = {
137
+ (event: 'nodeClick', node: NodeDataType): void;
138
+ (event: 'nodeMouseover', node: NodeDataType): void;
139
+ (event: 'bracketsClick', collapsed: boolean, node: NodeDataType): void;
140
+ (event: 'iconClick', collapsed: boolean, node: NodeDataType): void;
141
+ (
142
+ event: 'selectedChange',
143
+ newVal: string | string[],
144
+ oldVal: string | string[],
145
+ ): void;
146
+ (event: 'update:selectedValue', value: string | string[]): void;
147
+ (event: 'update:data', data: any): void;
148
+ };
149
+
150
+ // 定义 props 和 emits
151
+ const props = withDefaults(defineProps<Tree>(), {
152
+ fontSize: '12px',
153
+ itemHeight: 20,
154
+ height: 400,
155
+ deep: Infinity,
156
+ collapsedNodeLength: Infinity,
157
+ collapsedOnClickBrackets: true,
158
+ pathCollapsible: () => false,
159
+ nodeSelectable: () => false,
160
+
161
+ rootPath: 'root',
162
+ indent: 2,
163
+ showDoubleQuotes: true,
164
+ showLine: true,
165
+ selectOnClickNode: true,
166
+ highlightSelectedNode: true,
167
+ theme: 'light',
168
+ showKeyValueSpace: true,
169
+ editableTrigger: 'click',
170
+ });
171
+ const emits = defineEmits<Emits>();
172
+
173
+ // 初始化数据
174
+ const treeRef = ref<HTMLElement | null>(null);
175
+
176
+ const originFlatData = computed(() => jsonFlatten(props.data, props.rootPath));
177
+
178
+ // 初始化折叠路径
179
+ const initHiddenPaths = (
180
+ deep: number,
181
+ collapsedNodeLength: number,
182
+ ): Record<string, 1> => {
183
+ return originFlatData.value.reduce((acc, item) => {
184
+ const doCollapse = item.level >= deep || item.length >= collapsedNodeLength;
185
+ const pathComparison =
186
+ isFunction(props?.pathCollapsible) &&
187
+ props?.pathCollapsible?.(item as NodeDataType);
188
+ if (
189
+ (item.type === 'objectStart' || item.type === 'arrayStart') &&
190
+ (doCollapse || pathComparison)
191
+ ) {
192
+ return {
193
+ ...acc,
194
+ [item.path]: 1,
195
+ };
196
+ }
197
+ return acc;
198
+ }, {});
199
+ };
200
+
201
+ // 响应式状态
202
+ interface State {
203
+ translateY: number;
204
+ visibleData: NodeDataType[] | null;
205
+ hiddenPaths: Record<string, 1>;
206
+ }
207
+
208
+ const state = reactive<State>({
209
+ translateY: 0,
210
+ visibleData: [],
211
+ hiddenPaths: initHiddenPaths(props.deep, props.collapsedNodeLength),
212
+ });
213
+
214
+ // 计算属性
215
+ const flatData = computed(() => {
216
+ let startHiddenItem: null | NodeDataType = null;
217
+ const data: NodeDataType[] = [];
218
+ const length = originFlatData.value.length;
219
+ for (let i = 0; i < length; i++) {
220
+ const cur = originFlatData.value[i];
221
+ const item: NodeDataType = {
222
+ ...cur,
223
+ id: i,
224
+ };
225
+ const isHidden = state.hiddenPaths[item.path];
226
+ if (startHiddenItem && startHiddenItem.path === item.path) {
227
+ const isObject = startHiddenItem.type === 'objectStart';
228
+ const mergeItem: NodeDataType = {
229
+ ...item,
230
+ ...startHiddenItem,
231
+ showComma: item.showComma,
232
+ content: isObject ? '{...}' : '[...]',
233
+ type: isObject ? 'objectCollapsed' : 'arrayCollapsed',
234
+ };
235
+ startHiddenItem = null;
236
+ data.push(mergeItem);
237
+ } else if (isHidden && !startHiddenItem) {
238
+ startHiddenItem = item;
239
+ continue;
240
+ } else {
241
+ if (startHiddenItem) continue;
242
+ else data.push(item);
243
+ }
244
+ }
245
+ return data;
246
+ });
247
+
248
+ const selectedPaths = computed(() => {
249
+ const value = props.selectedValue;
250
+ if (value && props.selectableType === 'multiple' && Array.isArray(value)) {
251
+ return value;
252
+ }
253
+ return [value];
254
+ });
255
+
256
+ const propsErrorMessage = computed(() => {
257
+ const error =
258
+ props.selectableType &&
259
+ !props.selectOnClickNode &&
260
+ !props.showSelectController;
261
+ return error
262
+ ? 'When selectableType is not null, selectOnClickNode and showSelectController cannot be false at the same time, because this will cause the selection to fail.'
263
+ : '';
264
+ });
265
+
266
+ // 更新可见数据
267
+ const updateVisibleData = (scrollTop: number = 0) => {
268
+ const flatDataValue = flatData.value ?? [];
269
+ if (props.virtual) {
270
+ const visibleCount = props.height / props.itemHeight;
271
+ // const scrollTop = treeRef.value?.scrollTop || 0;
272
+ const scrollCount = Math.floor(scrollTop / props.itemHeight);
273
+ let start =
274
+ scrollCount < 0
275
+ ? 0
276
+ : scrollCount + visibleCount > flatDataValue.length
277
+ ? flatDataValue.length - visibleCount
278
+ : scrollCount;
279
+ if (start < 0) {
280
+ start = 0;
281
+ }
282
+ const end = start + visibleCount;
283
+ state.translateY = start * props.itemHeight;
284
+ state.visibleData = flatDataValue.filter(
285
+ (item, index) => index >= start && index < end,
286
+ );
287
+ } else {
288
+ state.visibleData = flatDataValue;
289
+ }
290
+ };
291
+
292
+ // 事件处理
293
+ const handleTreeScroll = (e: ScrollEvent) => {
294
+ updateVisibleData(e?.detail?.scrollTop ?? 0);
295
+ };
296
+
297
+ const handleSelectedChange = ({ path }: NodeDataType) => {
298
+ const type = props.selectableType;
299
+ if (type === 'multiple') {
300
+ const index = selectedPaths.value.findIndex((item) => item === path);
301
+ const newVal = [...selectedPaths.value];
302
+ if (index !== -1) {
303
+ newVal.splice(index, 1);
304
+ } else {
305
+ newVal.push(path);
306
+ }
307
+ emits('update:selectedValue', newVal);
308
+
309
+ emits('selectedChange', newVal, [...selectedPaths.value]);
310
+ } else if (type === 'single') {
311
+ if (selectedPaths.value[0] !== path) {
312
+ const [oldVal] = selectedPaths.value;
313
+ const newVal = path;
314
+ emits('update:selectedValue', newVal);
315
+ emits('selectedChange', newVal, oldVal);
316
+ }
317
+ }
318
+ };
319
+
320
+ const handleNodeClick = (node: NodeDataType) => {
321
+ emits('nodeClick', node);
322
+ };
323
+
324
+ const handleNodeMouseover = (node: NodeDataType) => {
325
+ emits('nodeMouseover', node);
326
+ };
327
+
328
+ const updateCollapsedPaths = (collapsed: boolean, path: string) => {
329
+ if (collapsed) {
330
+ state.hiddenPaths = {
331
+ ...state.hiddenPaths,
332
+ [path]: 1,
333
+ };
334
+ } else {
335
+ const newPaths = { ...state.hiddenPaths };
336
+ delete newPaths[path];
337
+ state.hiddenPaths = newPaths;
338
+ }
339
+ };
340
+
341
+ const handleBracketsClick = (collapsed: boolean, node: NodeDataType) => {
342
+ if (props.collapsedOnClickBrackets) {
343
+ updateCollapsedPaths(collapsed, node.path);
344
+ }
345
+ emits('bracketsClick', collapsed, node);
346
+ };
347
+
348
+ const handleIconClick = (collapsed: boolean, node: NodeDataType) => {
349
+ updateCollapsedPaths(collapsed, node.path);
350
+ emits('iconClick', collapsed, node);
351
+ };
352
+
353
+ const handleValueChange = (value: unknown, path: string) => {
354
+ const newData = cloneDeep(props.data);
355
+ const rootPath = props.rootPath;
356
+ const key = path.slice(rootPath.length);
357
+ setValueByPath(newData, key, value);
358
+ emits('update:data', newData);
359
+ };
360
+
361
+ // 监听和副作用
362
+ watchEffect(() => {
363
+ if (propsErrorMessage.value) {
364
+ emitError(propsErrorMessage.value);
365
+ }
366
+ });
367
+
368
+ watchEffect(() => {
369
+ if (flatData.value) {
370
+ updateVisibleData();
371
+ }
372
+ });
373
+
374
+ watch(
375
+ () => props.deep,
376
+ (val) => {
377
+ if (val)
378
+ state.hiddenPaths = initHiddenPaths(val, props.collapsedNodeLength);
379
+ },
380
+ );
381
+
382
+ watch(
383
+ () => props.collapsedNodeLength,
384
+ (val) => {
385
+ if (val) state.hiddenPaths = initHiddenPaths(props.deep, val);
386
+ },
387
+ );
388
+
389
+ // 生命周期钩子
390
+ onMounted(() => {
391
+ updateVisibleData();
392
+ });
393
+
394
+ onUpdated(() => {
395
+ // 可选的更新后操作
396
+ });
397
+
398
+ onUnmounted(() => {
399
+ // 清理操作
400
+ });
401
+ </script>
402
+
403
+ <style>
404
+ .json-pretty-tree {
405
+ /* theme color */
406
+ --json-pretty-color-primary: #9254de;
407
+ --json-pretty-color-info: #1d8ce0;
408
+ --json-pretty-color-error: #ff4d4f;
409
+ --json-pretty-color-success: #888888;
410
+ --json-pretty-color-nil: #020201;
411
+
412
+ /* field values color */
413
+ --json-pretty-color-string: var(--json-pretty-color-success);
414
+ --json-pretty-color-number: var(--json-pretty-color-info);
415
+ --json-pretty-color-boolean: var(--json-pretty-color-info);
416
+ --json-pretty-color-null: var(--json-pretty-color-nil);
417
+ --json-pretty-color-undefined: var(--json-pretty-color-nil);
418
+
419
+ /* highlight */
420
+ --json-pretty-highlight-bg-color: rgba(146, 84, 222, 0.1);
421
+ --json-pretty-highlight-bg-color-dark: #2e4558;
422
+
423
+ /* comment */
424
+ --json-pretty-comment-color: #bfcbd9;
425
+
426
+ /* common border-color */
427
+ --json-pretty-border-color: #bfcbd9;
428
+
429
+ font-family:
430
+ 'Monaco', 'Menlo', 'Consolas', 'Bitstream Vera Sans Mono', monospace;
431
+ font-size: v-bind(fontSize);
432
+ text-align: left;
433
+ overflow: auto;
434
+ position: relative;
435
+ width: 100%;
436
+ }
437
+
438
+ .json-pretty-tree.is-virtual {
439
+ overflow: auto;
440
+ }
441
+
442
+ .json-pretty-tree-node {
443
+ white-space: nowrap;
444
+ }
445
+
446
+ .json-pretty-tree-list {
447
+ overflow: auto;
448
+ position: relative;
449
+ }
450
+
451
+ .json-pretty-tree-list-holder {
452
+ position: relative;
453
+ }
454
+
455
+ .json-pretty-tree-list-holder-inner {
456
+ position: absolute;
457
+ width: 100%;
458
+ }
459
+
460
+ .dark {
461
+ /* 深色主题样式 */
462
+ }
463
+ </style>
@@ -0,0 +1,123 @@
1
+ import type { CSSProperties } from 'vue';
2
+
3
+ export type JsonPrettyNodeProps = {
4
+ data: any;
5
+ rootPath: string;
6
+ indent: number;
7
+ showLength: boolean;
8
+ showDoubleQuotes: boolean;
9
+ renderNodeKey: any;
10
+ renderNodeValue: any;
11
+ };
12
+ export interface NodeDataType extends JSONFlattenReturnType {
13
+ id: number;
14
+ }
15
+
16
+ export interface JSONFlattenOptions {
17
+ key?: string;
18
+ index?: number;
19
+ showComma: boolean;
20
+ length: number;
21
+ type:
22
+ | 'content'
23
+ | 'objectStart'
24
+ | 'objectEnd'
25
+ | 'objectCollapsed'
26
+ | 'arrayStart'
27
+ | 'arrayEnd'
28
+ | 'arrayCollapsed';
29
+ }
30
+
31
+ export type JSONDataType =
32
+ | string
33
+ | number
34
+ | boolean
35
+ | unknown[]
36
+ | Record<string, unknown>
37
+ | null;
38
+
39
+ export interface JSONFlattenReturnType extends JSONFlattenOptions {
40
+ content: string | number | null | boolean;
41
+ level: number;
42
+ path: string;
43
+ }
44
+
45
+ export type StyleValue =
46
+ | false
47
+ | null
48
+ | undefined
49
+ | string
50
+ | CSSProperties
51
+ | Array<StyleValue>;
52
+
53
+ // 定义 Props 类型
54
+ type SelectableType = 'single' | 'multiple' | null;
55
+
56
+ export type TreeNodeProps = Partial<{
57
+ data: any;
58
+ indent: number;
59
+ showLength: boolean;
60
+ showDoubleQuotes: boolean;
61
+ selectableType: SelectableType;
62
+ showSelectController: boolean;
63
+ showLine: boolean;
64
+ showLineNumber: boolean;
65
+ showNodeActions: boolean;
66
+ selectOnClickNode: boolean;
67
+ highlightSelectedNode: boolean;
68
+ showIcon: boolean;
69
+ theme: string;
70
+ showKeyValueSpace: boolean;
71
+ editable: boolean;
72
+ editableTrigger: string;
73
+ node: NodeDataType;
74
+ checked: boolean;
75
+ collapsed: boolean;
76
+ style: CSSProperties;
77
+ fontSize: string;
78
+ onNodeClick: (node: NodeDataType) => void;
79
+ onNodeMouseover: (node: NodeDataType) => void;
80
+ onBracketsClick: (collapsed: boolean, node: NodeDataType) => void;
81
+ onIconClick: (collapsed: boolean, node: NodeDataType) => void;
82
+ onValueChange: (value: boolean, path: string) => void;
83
+ onSelectedChange: (node: NodeDataType) => void;
84
+ }> &
85
+ TreeNodeRequiredProps;
86
+
87
+ export type TreeNodeRequiredProps = {
88
+ node: NodeDataType;
89
+ rootPath: string;
90
+ nodeSelectable: (node: NodeDataType) => boolean;
91
+ };
92
+
93
+ export type TreeRequired = TreeNodeRequiredProps & {};
94
+
95
+ export type Tree = Partial<TreeNodeProps> &
96
+ Partial<
97
+ {
98
+ deep: number;
99
+ collapsedNodeLength: number;
100
+ virtual: boolean;
101
+ itemHeight: number;
102
+ height: number;
103
+ selectedValue: string | Array<any>;
104
+ collapsedOnClickBrackets: boolean;
105
+ style: CSSProperties;
106
+ pathCollapsible: (node: NodeDataType) => boolean;
107
+ } & TreeRequired
108
+ >;
109
+
110
+ export interface ScrollEvent {
111
+ detail: {
112
+ scrollLeft: number; // 横向滚动距离
113
+ scrollTop: number; // 纵向滚动距离
114
+ scrollHeight: number; // 可滚动区域的高度
115
+ scrollWidth: number; // 可滚动区域的宽度
116
+ deltaX: number; // 横向滚动增量
117
+ deltaY: number; // 纵向滚动增量
118
+ };
119
+ target: EventTarget; // 事件源组件
120
+ currentTarget: EventTarget; // 当前组件
121
+ timeStamp: number; // 事件触发时间戳
122
+ type: string; // 事件类型,这里是 'scroll'
123
+ }