Skip to content

Commit 4f51d7e

Browse files
陈超涛gitee-org
authored andcommitted
!212 feat: add Tag to selected components
Merge pull request !212 from Zero1017/dev-tools
2 parents 7587567 + 35bbd5c commit 4f51d7e

File tree

2 files changed

+101
-4
lines changed

2 files changed

+101
-4
lines changed

packages/inula-dev-tools/src/injector/highLightElement.ts

Lines changed: 97 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,16 @@
1515

1616
import assign from 'object-assign';
1717
import { VNode } from '../../../inula/src/renderer/vnode/VNode';
18+
import {
19+
ClassComponent,
20+
FunctionComponent,
21+
ContextProvider,
22+
ContextConsumer,
23+
ForwardRef,
24+
SuspenseComponent,
25+
MemoComponent,
26+
DomComponent,
27+
} from '../../../inula/src/renderer/vnode/VNodeTags';
1828

1929
const overlayStyles = {
2030
background: 'rgba(120, 170, 210, 0.7)',
@@ -23,6 +33,50 @@ const overlayStyles = {
2333
border: 'rgba(255, 200, 50, 0.3)',
2434
};
2535

36+
// 获取组件的显示名称
37+
function getComponentDisplayName(vNode: VNode): string {
38+
if (!vNode || vNode.tag === DomComponent) {
39+
// 对于DOM组件,返回标签名称
40+
if (vNode.type && typeof vNode.type === 'string') {
41+
return `<${vNode.type}>`;
42+
}
43+
return 'DOM';
44+
}
45+
46+
const { tag, type } = vNode;
47+
48+
// 根据不同的组件类型返回名称
49+
switch (tag) {
50+
case ClassComponent:
51+
case FunctionComponent: {
52+
const name = type?.displayName || type?.name;
53+
return name || 'Anonymous';
54+
}
55+
case ContextProvider: {
56+
const contextName = type?._context?.displayName;
57+
return contextName ? `${contextName}.Provider` : 'Provider';
58+
}
59+
case ContextConsumer: {
60+
const contextName = type?._context?.displayName;
61+
return contextName ? `${contextName}.Consumer` : 'Consumer';
62+
}
63+
case ForwardRef: {
64+
const name = type?.displayName || 'Anonymous';
65+
return name;
66+
}
67+
case SuspenseComponent: {
68+
return 'Suspense';
69+
}
70+
case MemoComponent: {
71+
const name = type?.displayName || type?.name || type?.render?.name;
72+
return name ? `Memo(${name})` : 'Memo(Anonymous)';
73+
}
74+
default: {
75+
return 'Component';
76+
}
77+
}
78+
}
79+
2680
type Rect = {
2781
bottom: number;
2882
height: number;
@@ -139,17 +193,35 @@ class OverlayRect {
139193
border: HTMLElement;
140194
padding: HTMLElement;
141195
content: HTMLElement;
196+
label: HTMLElement;
142197

143198
constructor(doc: Document, container: HTMLElement) {
144199
this.node = doc.createElement('div');
145200
this.border = doc.createElement('div');
146201
this.padding = doc.createElement('div');
147202
this.content = doc.createElement('div');
203+
this.label = doc.createElement('div');
148204

149205
this.border.style.borderColor = overlayStyles.border;
150206
this.padding.style.borderColor = overlayStyles.padding;
151207
this.content.style.backgroundColor = overlayStyles.background;
152208

209+
// 设置标签样式
210+
assign(this.label.style, {
211+
position: 'absolute',
212+
top: '0',
213+
left: '0',
214+
backgroundColor: 'rgba(70, 184, 213, 0.8)',
215+
color: 'white',
216+
padding: '2px 6px',
217+
fontSize: '12px',
218+
fontFamily: 'monospace',
219+
borderRadius: '2px',
220+
whiteSpace: 'nowrap',
221+
pointerEvents: 'none',
222+
zIndex: '10000001',
223+
});
224+
153225
assign(this.node.style, {
154226
borderColor: overlayStyles.margin,
155227
pointerEvents: 'none',
@@ -161,6 +233,7 @@ class OverlayRect {
161233
this.node.appendChild(this.border);
162234
this.border.appendChild(this.padding);
163235
this.padding.appendChild(this.content);
236+
this.node.appendChild(this.label);
164237
container.appendChild(this.node);
165238
}
166239

@@ -170,7 +243,7 @@ class OverlayRect {
170243
}
171244
}
172245

173-
update(boxRect: Rect, eleStyle: any) {
246+
update(boxRect: Rect, eleStyle: any, componentName?: string) {
174247
setBoxStyle(eleStyle, 'margin', this.node);
175248
setBoxStyle(eleStyle, 'border', this.border);
176249
setBoxStyle(eleStyle, 'padding', this.padding);
@@ -196,6 +269,14 @@ class OverlayRect {
196269
top: boxRect.top - eleStyle.marginTop + 'px',
197270
left: boxRect.left - eleStyle.marginLeft + 'px',
198271
});
272+
273+
// 设置组件名称标签
274+
if (componentName) {
275+
this.label.textContent = componentName;
276+
this.label.style.display = 'block';
277+
} else {
278+
this.label.style.display = 'none';
279+
}
199280
}
200281
}
201282

@@ -225,7 +306,7 @@ class ElementOverlay {
225306
}
226307

227308
execute(nodes: Array<VNode>) {
228-
const elements = nodes.filter(node => node.tag === 'DomComponent');
309+
const elements = nodes.filter(node => node.tag === DomComponent);
229310

230311
// 有几个 element 就添加几个 OverlayRect
231312
while (this.rects.length > elements.length) {
@@ -257,7 +338,20 @@ class ElementOverlay {
257338
outerBox.left = Math.min(outerBox.left, boxRect.left - eleStyle.marginLeft);
258339

259340
const rect = this.rects[index];
260-
rect.update(boxRect, eleStyle);
341+
342+
// 获取组件名称 - 查找对应的非DOM组件父节点
343+
let componentName = '';
344+
let currentNode = element.parent;
345+
while (currentNode && currentNode.tag === DomComponent) {
346+
currentNode = currentNode.parent;
347+
}
348+
if (currentNode) {
349+
componentName = getComponentDisplayName(currentNode);
350+
} else {
351+
componentName = getComponentDisplayName(element);
352+
}
353+
354+
rect.update(boxRect, eleStyle, componentName);
261355
});
262356
}
263357
}

packages/inula-dev-tools/src/injector/pickElement.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ function onMouseMove(event: MouseEvent) {
4242
event.preventDefault();
4343
event.stopPropagation();
4444

45-
const target = (event.target as any)._inula_VNode;
45+
// const target = (event.target as any)._inula_VNode;
46+
const key = Object.keys(event.target).find(k => k.startsWith('_inula_vNode_'));
47+
const target = key ? event.target[key] : null;
48+
4649
if (target) {
4750
const id = VNodeToIdMap.get(getUserComponent(target));
4851
const vNode = queryVNode(id);

0 commit comments

Comments
 (0)