1515
1616import assign from 'object-assign' ;
1717import { 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
1929const 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+
2680type 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}
0 commit comments