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.
- package/README.md +13 -1
- package/dist/const.cjs +1 -1
- package/dist/const.d.ts +1 -1
- package/dist/const.js +1 -1
- package/dist/core-shared.d.ts +2 -3
- package/dist/core.d.ts +8 -8
- package/dist/core.js +1 -1
- package/dist/i18n/index.d.ts +0 -1
- package/dist/i18n/instance.d.ts +0 -1
- package/dist/i18n/locales/en.cjs +1 -1
- package/dist/i18n/locales/en.d.ts +1 -1
- package/dist/i18n/locales/en.js +1 -1
- package/dist/i18n/locales/zh-Hans.cjs +1 -1
- package/dist/i18n/locales/zh-Hans.d.ts +1 -1
- package/dist/i18n/locales/zh-Hans.js +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/modules/devConsole/index.cjs +4 -4
- package/dist/modules/devConsole/index.d.ts +6 -107
- package/dist/modules/devConsole/index.js +4 -4
- package/dist/modules/devEvent/index.cjs +3 -3
- package/dist/modules/devEvent/index.d.ts +2 -3
- package/dist/modules/devEvent/index.js +3 -3
- package/dist/modules/devIntercept/index.cjs +14 -14
- package/dist/modules/devIntercept/index.d.ts +33 -5
- package/dist/modules/devIntercept/index.js +14 -14
- package/dist/modules/devStore/index.cjs +1 -1
- package/dist/modules/devStore/index.d.ts +48 -40
- package/dist/modules/devStore/index.js +1 -1
- package/dist/modules/devToolInfo/index.cjs +1 -1
- package/dist/modules/devToolInfo/index.d.ts +6 -25
- package/dist/modules/devToolInfo/index.js +1 -1
- package/dist/plugins/uniDevTool/transform/transformApp.d.ts +0 -1
- package/dist/plugins/uniDevTool/transform/transformMain.d.ts +0 -1
- package/dist/plugins/uniDevTool/transform/transformVue.d.ts +0 -1
- package/dist/plugins/uniDevTool/uniDevTool.d.ts +0 -1
- package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts +0 -1
- package/dist/plugins/utils/index.d.ts +0 -1
- package/dist/shims-uni.d.ts +26 -22
- package/dist/type.d.ts +44 -43
- package/dist/utils/array.d.ts +0 -1
- package/dist/utils/date.d.ts +0 -1
- package/dist/utils/file.d.ts +0 -1
- package/dist/utils/function.d.ts +0 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/ip.d.ts +0 -1
- package/dist/utils/language.d.ts +14 -15
- package/dist/utils/object.cjs +1 -1
- package/dist/utils/object.d.ts +7 -8
- package/dist/utils/object.js +1 -1
- package/dist/utils/openLink.d.ts +0 -1
- package/dist/utils/page.d.ts +0 -1
- package/dist/utils/platform.d.ts +0 -1
- package/dist/utils/string.d.ts +0 -1
- package/dist/utils/utils.d.ts +0 -1
- package/dist/v3/DevTool/components/DevToolButton/index.vue +42 -6
- package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolData.ts +36 -12
- package/dist/v3/DevTool/components/DevToolWindow/hooks/useDevToolHandlers.ts +16 -1
- package/dist/v3/DevTool/components/DevToolWindow/index.vue +27 -64
- package/dist/v3/DevTool/components/Instance/transformTree.ts +156 -138
- package/dist/v3/DevTool/components/SettingList/index.vue +8 -0
- package/dist/v3/DevTool/components/SettingList/modules/SettingBarrage.vue +16 -0
- package/dist/v3/DevTool/index.vue +85 -139
- package/dist/v3/components/AppTransition/index.vue +33 -53
- package/dist/v3/components/Barrage/BarrageItem.vue +66 -9
- package/dist/v3/components/Barrage/index.vue +3 -0
- package/dist/v3/components/DevErrorBoundary/index.vue +13 -5
- package/dist/v3/components/DraggableContainer/index.vue +186 -73
- package/dist/v3/components/MovableContainer/index.vue +2 -0
- package/dist/v3/components/Pick/index.vue +29 -30
- package/dist/v3/hooks/useContainerStyle.ts +15 -73
- package/package.json +70 -67
- package/dist/const.d.ts.map +0 -1
- package/dist/core-shared.d.ts.map +0 -1
- package/dist/core.d.ts.map +0 -1
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/instance.d.ts.map +0 -1
- package/dist/i18n/locales/en.d.ts.map +0 -1
- package/dist/i18n/locales/zh-Hans.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/modules/devConsole/index.d.ts.map +0 -1
- package/dist/modules/devEvent/index.d.ts.map +0 -1
- package/dist/modules/devIntercept/index.d.ts.map +0 -1
- package/dist/modules/devStore/index.d.ts.map +0 -1
- package/dist/modules/devToolInfo/index.d.ts.map +0 -1
- package/dist/plugins/uniDevTool/transform/transformApp.d.ts.map +0 -1
- package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +0 -1
- package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +0 -1
- package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +0 -1
- package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +0 -1
- package/dist/plugins/utils/index.d.ts.map +0 -1
- package/dist/type.d.ts.map +0 -1
- package/dist/utils/array.d.ts.map +0 -1
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/file.d.ts.map +0 -1
- package/dist/utils/function.d.ts.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/ip.d.ts.map +0 -1
- package/dist/utils/language.d.ts.map +0 -1
- package/dist/utils/object.d.ts.map +0 -1
- package/dist/utils/openLink.d.ts.map +0 -1
- package/dist/utils/page.d.ts.map +0 -1
- package/dist/utils/platform.d.ts.map +0 -1
- package/dist/utils/string.d.ts.map +0 -1
- 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
|
-
// 类型守卫函数,检查是否为
|
|
11
|
-
function isVNode(child:
|
|
12
|
-
return
|
|
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:
|
|
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:
|
|
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,
|
|
37
|
-
styles?: Record<string,
|
|
38
|
-
other?: Record<string,
|
|
39
|
-
provides?: Record<string,
|
|
40
|
-
data?: Record<string,
|
|
41
|
-
functions?: Record<string,
|
|
42
|
-
emits?: Record<string,
|
|
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:
|
|
49
|
-
props: Record<string,
|
|
50
|
-
styles: Record<string,
|
|
51
|
-
other: Record<string,
|
|
52
|
-
provides: Record<string,
|
|
53
|
-
data: Record<string,
|
|
54
|
-
functions: Record<string,
|
|
55
|
-
emits: Record<string,
|
|
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:
|
|
58
|
-
const props:
|
|
59
|
-
const other:
|
|
60
|
-
const provides:
|
|
61
|
-
const data:
|
|
62
|
-
const emits:
|
|
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
|
-
?
|
|
118
|
+
? vType.name || vType.__name || 'Component'
|
|
102
119
|
: String(vnode.type);
|
|
103
120
|
|
|
104
|
-
if (isObject(vnode.type) &&
|
|
105
|
-
other.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:
|
|
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:
|
|
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
|
|
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 =
|
|
160
|
-
|
|
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 ||
|
|
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:
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
(
|
|
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
|
-
|
|
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
|
-
* 从
|
|
257
|
+
* 从 Vnode 获取简化的子节点 (仅保留组件节点)
|
|
306
258
|
*/
|
|
307
259
|
function getSimpleChildrenFromVNode(
|
|
308
|
-
vnode:
|
|
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
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
|
335
|
-
const childTree = simpleTree(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
// 如果全部取消,至少保留一个之前的
|