vite-uni-dev-tool 1.2.0 → 1.2.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 (104) hide show
  1. package/README.md +13 -1
  2. package/dist/const.cjs +1 -1
  3. package/dist/const.d.ts +1 -1
  4. package/dist/const.js +1 -1
  5. package/dist/core-shared.d.ts +2 -3
  6. package/dist/core.d.ts +8 -8
  7. package/dist/core.js +1 -1
  8. package/dist/i18n/index.d.ts +0 -1
  9. package/dist/i18n/instance.d.ts +0 -1
  10. package/dist/i18n/locales/en.cjs +1 -1
  11. package/dist/i18n/locales/en.d.ts +1 -1
  12. package/dist/i18n/locales/en.js +1 -1
  13. package/dist/i18n/locales/zh-Hans.cjs +1 -1
  14. package/dist/i18n/locales/zh-Hans.d.ts +1 -1
  15. package/dist/i18n/locales/zh-Hans.js +1 -1
  16. package/dist/index.d.ts +0 -1
  17. package/dist/modules/devConsole/index.cjs +4 -4
  18. package/dist/modules/devConsole/index.d.ts +6 -107
  19. package/dist/modules/devConsole/index.js +4 -4
  20. package/dist/modules/devEvent/index.cjs +3 -3
  21. package/dist/modules/devEvent/index.d.ts +2 -3
  22. package/dist/modules/devEvent/index.js +3 -3
  23. package/dist/modules/devIntercept/index.cjs +14 -14
  24. package/dist/modules/devIntercept/index.d.ts +33 -5
  25. package/dist/modules/devIntercept/index.js +14 -14
  26. package/dist/modules/devStore/index.cjs +1 -1
  27. package/dist/modules/devStore/index.d.ts +48 -40
  28. package/dist/modules/devStore/index.js +1 -1
  29. package/dist/modules/devToolInfo/index.cjs +1 -1
  30. package/dist/modules/devToolInfo/index.d.ts +6 -25
  31. package/dist/modules/devToolInfo/index.js +1 -1
  32. package/dist/plugins/uniDevTool/transform/transformApp.d.ts +0 -1
  33. package/dist/plugins/uniDevTool/transform/transformMain.d.ts +0 -1
  34. package/dist/plugins/uniDevTool/transform/transformVue.d.ts +0 -1
  35. package/dist/plugins/uniDevTool/uniDevTool.d.ts +0 -1
  36. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts +0 -1
  37. package/dist/plugins/utils/index.d.ts +0 -1
  38. package/dist/shims-uni.d.ts +26 -22
  39. package/dist/type.d.ts +44 -43
  40. package/dist/utils/array.d.ts +0 -1
  41. package/dist/utils/date.d.ts +0 -1
  42. package/dist/utils/file.d.ts +0 -1
  43. package/dist/utils/function.d.ts +0 -1
  44. package/dist/utils/index.d.ts +0 -1
  45. package/dist/utils/ip.d.ts +0 -1
  46. package/dist/utils/language.d.ts +14 -15
  47. package/dist/utils/object.cjs +1 -1
  48. package/dist/utils/object.d.ts +7 -8
  49. package/dist/utils/object.js +1 -1
  50. package/dist/utils/openLink.d.ts +0 -1
  51. package/dist/utils/page.d.ts +0 -1
  52. package/dist/utils/platform.d.ts +0 -1
  53. package/dist/utils/string.d.ts +0 -1
  54. package/dist/utils/utils.d.ts +0 -1
  55. package/dist/v3/DevTool/components/DevToolButton/index.vue +42 -6
  56. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolData.ts +36 -12
  57. package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolHandlers.ts +16 -1
  58. package/dist/v3/DevTool/components/DevToolWindow/index.vue +27 -64
  59. package/dist/v3/DevTool/components/Instance/transformTree.ts +156 -138
  60. package/dist/v3/DevTool/components/SettingList/index.vue +8 -0
  61. package/dist/v3/DevTool/components/SettingList/modules/SettingBarrage.vue +16 -0
  62. package/dist/v3/DevTool/index.vue +85 -139
  63. package/dist/v3/components/AppTransition/index.vue +33 -53
  64. package/dist/v3/components/Barrage/BarrageItem.vue +66 -9
  65. package/dist/v3/components/Barrage/index.vue +3 -0
  66. package/dist/v3/components/DevErrorBoundary/index.vue +13 -5
  67. package/dist/v3/components/DraggableContainer/index.vue +186 -73
  68. package/dist/v3/components/MovableContainer/index.vue +2 -0
  69. package/dist/v3/components/Pick/index.vue +29 -30
  70. package/dist/v3/hooks/useContainerStyle.ts +15 -73
  71. package/package.json +70 -67
  72. package/dist/const.d.ts.map +0 -1
  73. package/dist/core-shared.d.ts.map +0 -1
  74. package/dist/core.d.ts.map +0 -1
  75. package/dist/i18n/index.d.ts.map +0 -1
  76. package/dist/i18n/instance.d.ts.map +0 -1
  77. package/dist/i18n/locales/en.d.ts.map +0 -1
  78. package/dist/i18n/locales/zh-Hans.d.ts.map +0 -1
  79. package/dist/index.d.ts.map +0 -1
  80. package/dist/modules/devConsole/index.d.ts.map +0 -1
  81. package/dist/modules/devEvent/index.d.ts.map +0 -1
  82. package/dist/modules/devIntercept/index.d.ts.map +0 -1
  83. package/dist/modules/devStore/index.d.ts.map +0 -1
  84. package/dist/modules/devToolInfo/index.d.ts.map +0 -1
  85. package/dist/plugins/uniDevTool/transform/transformApp.d.ts.map +0 -1
  86. package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +0 -1
  87. package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +0 -1
  88. package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +0 -1
  89. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +0 -1
  90. package/dist/plugins/utils/index.d.ts.map +0 -1
  91. package/dist/type.d.ts.map +0 -1
  92. package/dist/utils/array.d.ts.map +0 -1
  93. package/dist/utils/date.d.ts.map +0 -1
  94. package/dist/utils/file.d.ts.map +0 -1
  95. package/dist/utils/function.d.ts.map +0 -1
  96. package/dist/utils/index.d.ts.map +0 -1
  97. package/dist/utils/ip.d.ts.map +0 -1
  98. package/dist/utils/language.d.ts.map +0 -1
  99. package/dist/utils/object.d.ts.map +0 -1
  100. package/dist/utils/openLink.d.ts.map +0 -1
  101. package/dist/utils/page.d.ts.map +0 -1
  102. package/dist/utils/platform.d.ts.map +0 -1
  103. package/dist/utils/string.d.ts.map +0 -1
  104. package/dist/utils/utils.d.ts.map +0 -1
@@ -7,21 +7,23 @@ import {
7
7
  } from 'vue';
8
8
  import { getRecordedChildren } from './registry';
9
9
 
10
- // 类型守卫函数,检查是否为VNode类型
11
- function isVNode(child: any): child is VNode {
12
- return child != null && typeof child === 'object' && 'type' in child;
10
+ // 类型守卫函数,检查是否为Vnode类型
11
+ function isVNode(child: unknown): child is VNode {
12
+ return (
13
+ child != null && typeof child === 'object' && 'type' in (child as object)
14
+ );
13
15
  }
14
16
 
15
17
  // 类型守卫函数,检查是否为包含component属性的对象
16
18
  function hasComponentProperty(
17
- child: any,
19
+ child: unknown,
18
20
  ): child is VNode & { component?: ComponentInternalInstance } {
19
- return isVNode(child) && 'component' in child;
21
+ return isVNode(child) && 'component' in (child as object);
20
22
  }
21
23
 
22
24
  // 类型守卫函数,检查是否为Symbol类型且具有description属性
23
25
  function isSymbolWithDescription(
24
- value: any,
26
+ value: unknown,
25
27
  ): value is symbol & { description?: string } {
26
28
  return typeof value === 'symbol';
27
29
  }
@@ -33,35 +35,49 @@ interface SimpleTreeNode {
33
35
  content?: string;
34
36
  hasChildren?: boolean;
35
37
  // 分类存储属性
36
- props?: Record<string, any>;
37
- styles?: Record<string, any>;
38
- other?: Record<string, any>;
39
- provides?: Record<string, any>;
40
- data?: Record<string, any>;
41
- functions?: Record<string, any>;
42
- emits?: Record<string, any>;
38
+ props?: Record<string, unknown>;
39
+ styles?: Record<string, unknown>;
40
+ other?: Record<string, unknown>;
41
+ provides?: Record<string, unknown>;
42
+ data?: Record<string, unknown>;
43
+ functions?: Record<string, unknown>;
44
+ emits?: Record<string, unknown>;
45
+ }
46
+
47
+ interface VNodeWithInternals extends Record<string, unknown> {
48
+ uid?: string | number;
49
+ type?: unknown;
50
+ props?: Record<string, unknown> | null;
51
+ children?: unknown;
52
+ component?: unknown;
53
+ subTree?: unknown;
54
+ provides?: Record<string | symbol, unknown>;
55
+ setupState?: Record<string, unknown>;
56
+ data?: Record<string, unknown>;
57
+ emitsOptions?: string[] | Record<string, unknown>;
58
+ devtoolsRawSetupState?: Record<string, unknown>;
43
59
  }
44
60
 
45
61
  /**
46
62
  * 分类提取属性
47
63
  */
48
- function extractCategorizedData(vnode: any): {
49
- props: Record<string, any>;
50
- styles: Record<string, any>;
51
- other: Record<string, any>;
52
- provides: Record<string, any>;
53
- data: Record<string, any>;
54
- functions: Record<string, any>;
55
- emits: Record<string, any>;
64
+ function extractCategorizedData(vnode: VNodeWithInternals): {
65
+ props: Record<string, unknown>;
66
+ styles: Record<string, unknown>;
67
+ other: Record<string, unknown>;
68
+ provides: Record<string, unknown>;
69
+ data: Record<string, unknown>;
70
+ functions: Record<string, unknown>;
71
+ emits: Record<string, unknown>;
56
72
  } {
57
- const styles: any = {};
58
- const props: any = {};
59
- const other: any = {};
60
- const provides: any = {};
61
- const data: any = {};
62
- const emits: any = {};
73
+ const styles: Record<string, unknown> = {};
74
+ const props: Record<string, unknown> = {};
75
+ const other: Record<string, unknown> = {};
76
+ const provides: Record<string, unknown> = {};
77
+ const data: Record<string, unknown> = {};
78
+ const emits: Record<string, unknown> = {};
63
79
 
64
- const vnodeProps = vnode.props || {};
80
+ const vnodeProps = (vnode.props as Record<string, unknown>) || {};
65
81
 
66
82
  // 1. 提取样式相关 (id, style)
67
83
  const styleKeys = ['id', 'style'];
@@ -71,7 +87,7 @@ function extractCategorizedData(vnode: any): {
71
87
  let val = vnodeProps[key];
72
88
  if (val !== undefined && val !== null && val !== '') {
73
89
  if (key === 'style' && isObject(val)) {
74
- val = Object.entries(val)
90
+ val = Object.entries(val as object)
75
91
  .filter(([_, v]) => v !== undefined && v !== null && v !== '')
76
92
  .map(([k, v]) => `${k}: ${v}`)
77
93
  .join('; ');
@@ -95,24 +111,25 @@ function extractCategorizedData(vnode: any): {
95
111
  // 3. 提取其他元数据
96
112
  other.uid = vnode.uid;
97
113
  if (vnode.type) {
114
+ const vType = vnode.type as Record<string, string>;
98
115
  other.type = isString(vnode.type)
99
116
  ? vnode.type
100
117
  : isObject(vnode.type)
101
- ? (vnode.type as any).name || (vnode.type as any).__name || 'Component'
118
+ ? vType.name || vType.__name || 'Component'
102
119
  : String(vnode.type);
103
120
 
104
- if (isObject(vnode.type) && (vnode.type as any).__file) {
105
- other.file = (vnode.type as any).__file;
121
+ if (isObject(vnode.type) && vType.__file) {
122
+ other.file = vType.__file;
106
123
  }
107
124
  }
108
125
 
109
126
  // 如果有 slots
110
127
  if (vnode.children && !isArray(vnode.children) && isObject(vnode.children)) {
111
- other.slots = Object.keys(vnode.children);
128
+ other.slots = Object.keys(vnode.children as object);
112
129
  }
113
130
 
114
131
  // 4. 提取 provides
115
- const currentProvides = vnode.provides;
132
+ const currentProvides = vnode.provides as Record<string | symbol, unknown>;
116
133
 
117
134
  if (currentProvides) {
118
135
  Reflect.ownKeys(currentProvides).forEach((key) => {
@@ -126,20 +143,20 @@ function extractCategorizedData(vnode: any): {
126
143
  }
127
144
 
128
145
  // 5. 提取 data (仅当 vnode.component 存在时)
129
- const functions: any = {};
146
+ const functions: Record<string, unknown> = {};
130
147
  if (vnode.setupState || vnode.data) {
131
148
  // 优先取 setupState (Script Setup / Composition API), 其次取 data (Options API)
132
149
  // 注意:setupState 包含了响应式引用的解包值
133
- const allData: any = {};
150
+ const allData: Record<string, unknown> = {};
134
151
 
135
152
  // 处理 setupState
136
153
  if (isObject(vnode.setupState)) {
137
- Object.assign(allData, vnode.setupState);
154
+ Object.assign(allData, vnode.setupState as object);
138
155
  }
139
156
 
140
157
  // 处理 Options API data
141
158
  if (isObject(vnode.data)) {
142
- Object.assign(allData, vnode.data);
159
+ Object.assign(allData, vnode.data as object);
143
160
  }
144
161
 
145
162
  if (isObject(allData)) {
@@ -151,13 +168,15 @@ function extractCategorizedData(vnode: any): {
151
168
  )
152
169
  return;
153
170
 
154
- const value = (allData as any)[key];
171
+ const value = (allData as Record<string | symbol, unknown>)[key];
155
172
  let keyStr = typeof key === 'symbol' ? String(key) : key;
156
173
 
157
174
  // 标记 Ref 和 Reactive
158
175
  // 优先检查 devtoolsRawSetupState 获取原始 Ref
159
- const rawSetupState = (vnode as any).devtoolsRawSetupState || {};
160
- const rawValue = rawSetupState[key];
176
+ const rawSetupState =
177
+ (vnode as Record<string, Record<string, unknown>>)
178
+ .devtoolsRawSetupState || {};
179
+ const rawValue = rawSetupState[key as string];
161
180
 
162
181
  if (rawValue && isRef(rawValue)) {
163
182
  keyStr += ' (Ref)';
@@ -178,7 +197,10 @@ function extractCategorizedData(vnode: any): {
178
197
 
179
198
  // 6. 提取 emits
180
199
  // 优先从组件实例获取归一化的 emitsOptions, 其次从类型定义获取
181
- const emitsOptions = vnode?.emitsOptions || vnode.type?.emits;
200
+ const emitsOptions = (vnode?.emitsOptions ||
201
+ (vnode.type as Record<string, unknown>)?.emits) as
202
+ | string[]
203
+ | Record<string, unknown>;
182
204
  if (emitsOptions) {
183
205
  if (isArray(emitsOptions)) {
184
206
  emitsOptions.forEach((emit: string) => {
@@ -212,107 +234,37 @@ function extractNameFromFile(file: string): string | undefined {
212
234
  return match ? match[1] : undefined;
213
235
  }
214
236
 
215
- function getComponentName(type: any): string {
237
+ function getComponentName(type: unknown): string {
216
238
  if (!type) return 'Anonymous';
217
239
  if (typeof type === 'string') return type;
218
240
  if (typeof type === 'object') {
241
+ const t = type as Record<string, string>;
219
242
  return (
220
- type.name ||
221
- type.__name ||
222
- (type.__file ? extractNameFromFile(type.__file) : undefined) ||
243
+ t.name ||
244
+ t.__name ||
245
+ (t.__file ? extractNameFromFile(t.__file) : undefined) ||
223
246
  'Anonymous'
224
247
  );
225
248
  }
226
249
  if (typeof type === 'function') {
227
- return type.name || type.__name || 'Anonymous';
250
+ const f = type as { name?: string; __name?: string };
251
+ return f.name || f.__name || 'Anonymous';
228
252
  }
229
253
  return 'Anonymous';
230
254
  }
231
255
 
232
- // ... existing code ...
233
-
234
- // ... types ...
235
-
236
- export function simpleTree(vNode?: any, depth = 0): SimpleTreeNode | null {
237
- // ... check valid ...
238
- if (vNode === null || typeof vNode !== 'object' || depth > 40) {
239
- return null;
240
- }
241
- // ... rest of simpleTree func ...
242
-
243
- // 确保只使用必需的属性
244
- const simplifiedInstance: InstanceTree.SimplifiedComponentInternalInstance = {
245
- type: vNode.type,
246
- subTree: vNode.subTree,
247
- uid: vNode.uid,
248
- ...(vNode.component && { component: vNode.component }),
249
- ...(vNode.children && { children: vNode.children }),
250
- };
251
-
252
- const children: SimpleTreeNode[] = [];
253
-
254
- // 获取子节点
255
- if (simplifiedInstance.subTree) {
256
- if ('data-dev-tool' in (simplifiedInstance.subTree.props ?? {})) {
257
- return null;
258
- } else {
259
- children.push(
260
- ...getSimpleChildrenFromVNode(simplifiedInstance.subTree, depth),
261
- );
262
- }
263
- }
264
-
265
- // 插槽 fallback
266
- if (children.length === 0 && simplifiedInstance.children) {
267
- if (isArray(simplifiedInstance.children)) {
268
- const slotChildren = getSimpleChildrenFromVNode(
269
- {
270
- children: simplifiedInstance.children,
271
- },
272
- depth,
273
- );
274
- children.push(...slotChildren);
275
- }
276
- }
277
-
278
- // GLOBAL fallback
279
- if (children.length === 0 && vNode.uid !== undefined) {
280
- const recordedChildren = getRecordedChildren(vNode.uid);
281
- recordedChildren.forEach((childInst) => {
282
- const childTree = simpleTree(childInst, depth + 1);
283
- if (childTree) {
284
- children.push(childTree);
285
- }
286
- });
287
- }
288
-
289
- const hasChildrenFlag = children.length > 0;
290
- const uid = vNode.uid !== undefined ? vNode.uid : getNextUid();
291
- const typeName = getComponentName(simplifiedInstance.type);
292
-
293
- const nodeInfo: SimpleTreeNode = {
294
- type: typeName,
295
- uid,
296
- children,
297
- hasChildren: hasChildrenFlag,
298
- ...extractCategorizedData(vNode),
299
- };
300
-
301
- return nodeInfo;
302
- }
303
-
304
256
  /**
305
- * 从 VNode 获取简化的子节点 (仅保留组件节点)
257
+ * 从 Vnode 获取简化的子节点 (仅保留组件节点)
306
258
  */
307
259
  function getSimpleChildrenFromVNode(
308
- vnode: any,
260
+ vnode: VNodeWithInternals,
309
261
  depth: number = 0,
310
262
  ): SimpleTreeNode[] {
311
263
  const children: SimpleTreeNode[] = [];
312
264
  if (vnode.children) {
313
265
  // 统一转为数组处理,兼容单节点和多节点
314
266
  const rawChildren = isArray(vnode.children)
315
- ? vnode.children
267
+ ? (vnode.children as unknown[])
316
268
  : isObject(vnode.children)
317
269
  ? [vnode.children]
318
270
  : isString(vnode.children)
@@ -320,19 +272,21 @@ function getSimpleChildrenFromVNode(
320
272
  : [];
321
273
 
322
274
  for (const child of rawChildren) {
323
- if (
324
- child &&
325
- typeof child === 'object' &&
326
- 'props' in child &&
327
- child.props &&
328
- 'data-dev-tool' in child.props
329
- ) {
275
+ if (!child || typeof child !== 'object') continue;
276
+
277
+ const childObj = child as unknown as VNodeWithInternals;
278
+ const childProps = (childObj.props as Record<string, unknown>) || {};
279
+
280
+ if (childProps['data-dev-tool']) {
330
281
  continue;
331
282
  }
332
283
 
333
284
  // 1. 如果是组件实例,直接处理
334
- if (hasComponentProperty(child) && child?.component) {
335
- const childTree = simpleTree(child.component, depth + 1);
285
+ if (hasComponentProperty(child) && child.component) {
286
+ const childTree = simpleTree(
287
+ child.component as unknown as Record<string, unknown>,
288
+ depth + 1,
289
+ );
336
290
  if (childTree) {
337
291
  children.push(childTree);
338
292
  }
@@ -340,32 +294,35 @@ function getSimpleChildrenFromVNode(
340
294
  // 2. 如果是函数式组件
341
295
  else if (isVNode(child) && typeof child.type === 'function') {
342
296
  const uid =
343
- (child as any).uid !== undefined ? (child as any).uid : getNextUid();
297
+ childObj.uid !== undefined
298
+ ? (childObj.uid as string | number)
299
+ : getNextUid();
344
300
  const typeName = getComponentName(child.type);
345
301
  children.push({
346
302
  type: typeName,
347
303
  uid,
348
304
  children: [],
349
305
  hasChildren: false,
350
- ...extractCategorizedData(child),
306
+ ...extractCategorizedData(childObj),
351
307
  });
352
308
  }
353
309
  // 3. 如果是 VNode 且是 Fragmentation/Block (带 children 的非组件节点),需要深入查找内部的组件
354
310
  else if (isVNode(child)) {
355
311
  // 如果是 Fragment,递归查找子节点
356
312
  if (child.type && isSymbolWithDescription(child.type)) {
357
- const desc = child.type.description;
313
+ const desc = (child.type as { description?: string }).description;
358
314
  const isFragment = desc === 'v-fgt' || desc === 'Fragment';
359
315
  if (isFragment) {
360
- const fragmentChildren = getSimpleChildrenFromVNode(child, depth);
316
+ const fragmentChildren = getSimpleChildrenFromVNode(
317
+ childObj,
318
+ depth,
319
+ );
361
320
  children.push(...fragmentChildren);
362
321
  }
363
322
  }
364
323
  // 如果是普通 HTML 元素或其他容器,也需要递归查找其 children 中的组件
365
- // 例如 <view><MyComponent /></view>,我们需要找到 MyComponent
366
324
  else if (isString(child.type) || isObject(child.type)) {
367
- // 递归查找子节点中的组件,但不把当前节点加入树中(因为我们只关心组件)
368
- const subChildren = getSimpleChildrenFromVNode(child, depth);
325
+ const subChildren = getSimpleChildrenFromVNode(childObj, depth);
369
326
  children.push(...subChildren);
370
327
  }
371
328
  }
@@ -373,3 +330,64 @@ function getSimpleChildrenFromVNode(
373
330
  }
374
331
  return children;
375
332
  }
333
+
334
+ export function simpleTree(
335
+ vNode?: Record<string, unknown>,
336
+ depth = 0,
337
+ ): SimpleTreeNode | null {
338
+ if (!vNode || typeof vNode !== 'object' || depth > 40) {
339
+ return null;
340
+ }
341
+
342
+ const vNodeObj = vNode as unknown as VNodeWithInternals;
343
+ const children: SimpleTreeNode[] = [];
344
+
345
+ // 1. 获取子节点
346
+ const subTree = vNodeObj.subTree as VNodeWithInternals | undefined;
347
+ if (subTree) {
348
+ const subProps = (subTree.props as Record<string, unknown>) || {};
349
+ if (!subProps['data-dev-tool']) {
350
+ children.push(...getSimpleChildrenFromVNode(subTree, depth));
351
+ }
352
+ }
353
+
354
+ // 2. 插槽 fallback
355
+ if (children.length === 0 && vNodeObj.children) {
356
+ if (isArray(vNodeObj.children)) {
357
+ const slotChildren = getSimpleChildrenFromVNode(
358
+ { children: vNodeObj.children } as VNodeWithInternals,
359
+ depth,
360
+ );
361
+ children.push(...slotChildren);
362
+ }
363
+ }
364
+
365
+ // 3. GLOBAL fallback
366
+ if (children.length === 0 && typeof vNodeObj.uid === 'number') {
367
+ const recordedChildren = getRecordedChildren(vNodeObj.uid);
368
+ recordedChildren.forEach((childInst) => {
369
+ const childTree = simpleTree(
370
+ childInst as unknown as Record<string, unknown>,
371
+ depth + 1,
372
+ );
373
+ if (childTree) {
374
+ children.push(childTree);
375
+ }
376
+ });
377
+ }
378
+
379
+ const hasChildrenFlag = children.length > 0;
380
+ const uid =
381
+ vNodeObj.uid !== undefined
382
+ ? (vNodeObj.uid as string | number)
383
+ : getNextUid();
384
+ const typeName = getComponentName(vNodeObj.type);
385
+
386
+ return {
387
+ type: typeName,
388
+ uid,
389
+ children,
390
+ hasChildren: hasChildrenFlag,
391
+ ...extractCategorizedData(vNodeObj),
392
+ };
393
+ }
@@ -47,6 +47,7 @@
47
47
  :barrage-start-top="barrageStartTop"
48
48
  :barrage-duration="barrageDuration"
49
49
  :barrage-max-length="barrageMaxLength"
50
+ :barrage-allow-drag="barrageAllowDrag"
50
51
  :barrage-types="barrageTypes"
51
52
  :barrage-show-when-open="barrageShowWhenOpen"
52
53
  :sizeFormat="sizeFormat"
@@ -56,6 +57,7 @@
56
57
  @change-barrage-start-top="onChangeBarrageStartTop"
57
58
  @change-barrage-duration="onChangeBarrageDuration"
58
59
  @change-barrage-max-length="onChangeBarrageMaxLength"
60
+ @change-barrage-allow-drag="onChangeBarrageAllowDrag"
59
61
  @change-barrage-types="onChangeBarrageTypes"
60
62
  @change-barrage-show-when-open="onChangeBarrageShowWhenOpen" />
61
63
  </scroll-view>
@@ -89,6 +91,7 @@ defineProps<{
89
91
  barrageStartTop?: number; // 新增
90
92
  barrageDuration?: number; // 时长
91
93
  barrageMaxLength?: number; // 长度
94
+ barrageAllowDrag?: boolean; // 允许拖动
92
95
  barrageTypes?: string[]; // 类型
93
96
  barrageShowWhenOpen?: boolean;
94
97
  buildInfo?: {
@@ -121,6 +124,7 @@ const emit = defineEmits<{
121
124
  (e: 'change-barrage-start-top', value: number): void;
122
125
  (e: 'change-barrage-duration', value: number): void;
123
126
  (e: 'change-barrage-max-length', value: number): void;
127
+ (e: 'change-barrage-allow-drag', value: boolean): void;
124
128
  (e: 'change-barrage-types', value: string[]): void;
125
129
  (e: 'change-barrage-show-when-open', value: boolean): void;
126
130
  (e: 'change-use-transition', value: boolean): void;
@@ -168,6 +172,10 @@ function onChangeBarrageMaxLength(v: number) {
168
172
  emit('change-barrage-max-length', v);
169
173
  }
170
174
 
175
+ function onChangeBarrageAllowDrag(v: boolean) {
176
+ emit('change-barrage-allow-drag', v);
177
+ }
178
+
171
179
  function onChangeBarrageTypes(v: string[]) {
172
180
  emit('change-barrage-types', v);
173
181
  }
@@ -23,6 +23,16 @@
23
23
  </view>
24
24
 
25
25
  <view v-if="barrageVisible" class="barrage-advanced">
26
+ <!-- 是否允许拖动 -->
27
+ <view class="setting-row">
28
+ <view class="setting-label">{{ t('common.barrageAllowDrag') }}</view>
29
+ <switch
30
+ :checked="barrageAllowDrag"
31
+ @change="onBarrageAllowDragChange"
32
+ color="var(--dev-tool-main-color)"
33
+ style="transform: scale(0.7)" />
34
+ </view>
35
+
26
36
  <!-- 轨道数量 -->
27
37
  <view class="setting-row-group">
28
38
  <view class="setting-row-header">
@@ -157,6 +167,7 @@ const props = defineProps<{
157
167
  barrageStartTop?: number;
158
168
  barrageDuration?: number;
159
169
  barrageMaxLength?: number;
170
+ barrageAllowDrag?: boolean;
160
171
  barrageTypes?: string[];
161
172
  barrageShowWhenOpen?: boolean;
162
173
  }>();
@@ -168,6 +179,7 @@ const emit = defineEmits<{
168
179
  (e: 'change-barrage-start-top', value: number): void;
169
180
  (e: 'change-barrage-duration', value: number): void;
170
181
  (e: 'change-barrage-max-length', value: number): void;
182
+ (e: 'change-barrage-allow-drag', value: boolean): void;
171
183
  (e: 'change-barrage-types', value: string[]): void;
172
184
  (e: 'change-barrage-show-when-open', value: boolean): void;
173
185
  }>();
@@ -210,6 +222,10 @@ function onMaxLengthChange(e: any) {
210
222
  emit('change-barrage-max-length', e.detail.value);
211
223
  }
212
224
 
225
+ function onBarrageAllowDragChange(e: any) {
226
+ emit('change-barrage-allow-drag', !!e.detail.value);
227
+ }
228
+
213
229
  function onTypesChange(e: any) {
214
230
  let values = e.detail.value;
215
231
  // 如果全部取消,至少保留一个之前的