@@ -19,12 +19,15 @@ export const FieldSelect = defineComponent({
1919 modelValue : String ,
2020 loading : Boolean ,
2121 } ,
22+ inheritAttrs : false ,
2223 setup : ( props , { attrs, slots } ) => {
2324 const labelRef = ref < HTMLElement > ( )
2425 const showTooltip = ref ( false )
2526 const isTextOverflow = ref ( false )
2627 const tooltipContent = ref ( '' )
2728 const selectRef = ref < SelectV2Instance > ( )
29+ const tooltipRef = ref ( )
30+ const isMouseInTooltip = ref ( false )
2831
2932 const checkTextOverflow = ( element : HTMLElement , text : string ) => {
3033 if ( ! element || ! text ) return false
@@ -165,10 +168,61 @@ export const FieldSelect = defineComponent({
165168 }
166169 }
167170
171+ const onMouseLeave = ( ) => {
172+ // 延迟检查,给鼠标移动到 tooltip 的时间
173+ setTimeout ( ( ) => {
174+ // 如果鼠标不在 tooltip 内,则隐藏
175+ if ( ! isMouseInTooltip . value ) {
176+ showTooltip . value = false
177+ }
178+ } , 100 )
179+ }
180+
181+ const setupTooltipListeners = ( ) => {
182+ if ( ! tooltipRef . value ?. contentRef ) return
183+
184+ const contentEl = tooltipRef . value . popperRef . contentRef as HTMLElement
185+
186+ const handleMouseEnter = ( ) => {
187+ isMouseInTooltip . value = true
188+ }
189+
190+ const handleMouseLeave = ( ) => {
191+ isMouseInTooltip . value = false
192+ showTooltip . value = false
193+ }
194+
195+ contentEl . addEventListener ( 'mouseenter' , handleMouseEnter )
196+ contentEl . addEventListener ( 'mouseleave' , handleMouseLeave )
197+
198+ // 返回清理函数
199+ return ( ) => {
200+ contentEl . removeEventListener ( 'mouseenter' , handleMouseEnter )
201+ contentEl . removeEventListener ( 'mouseleave' , handleMouseLeave )
202+ }
203+ }
204+
205+ let cleanupTooltipListeners : ( ( ) => void ) | undefined
206+
207+ // 监听 tooltip 显示状态,当显示时设置事件监听器
208+ watch ( showTooltip , ( visible ) => {
209+ if ( visible ) {
210+ // 等待 tooltip 渲染完成后再设置监听器
211+ nextTick ( ( ) => {
212+ cleanupTooltipListeners = setupTooltipListeners ( )
213+ } )
214+ } else {
215+ // tooltip 隐藏时清理监听器
216+ cleanupTooltipListeners ?.( )
217+ cleanupTooltipListeners = undefined
218+ }
219+ } )
220+
168221 let unwatch : any
169222
170223 onBeforeMount ( ( ) => {
171224 unwatch ?.( )
225+ cleanupTooltipListeners ?.( )
172226 } )
173227
174228 onMounted ( ( ) => {
@@ -219,6 +273,7 @@ export const FieldSelect = defineComponent({
219273
220274 return props . enableTooltip ? (
221275 < ElTooltip
276+ ref = { tooltipRef }
222277 visible = { showTooltip . value }
223278 placement = "top"
224279 content = { tooltipContent . value }
@@ -238,9 +293,7 @@ export const FieldSelect = defineComponent({
238293 dataSource = { fieldOptions . value }
239294 loading = { props . loading }
240295 onMouseenter = { onMouseEnter }
241- onMouseleave = { ( ) => {
242- showTooltip . value = false
243- } }
296+ onMouseleave = { onMouseLeave }
244297 >
245298 { {
246299 ...children ,
0 commit comments