1- import { h , defineComponent , ref , onMounted , onBeforeUnmount , computed } from 'vue' ;
1+ import { h , defineComponent , ref , onMounted , onBeforeUnmount , computed , isRef , unref , isReactive , toRaw } from 'vue' ;
22
33export function omiVueify (
44 tagName : string ,
@@ -35,6 +35,13 @@ export function omiVueify(
3535 // 仅处理非事件
3636 . filter ( ( [ key ] ) => ! key . match ( / ^ o n [ A - Z a - z ] / ) )
3737 . map ( ( [ key , value ] ) => {
38+ // 处理 ref 和 reactive
39+ if ( isRef ( value ) ) {
40+ value = unref ( value ) ;
41+ } else if ( isReactive ( value ) ) {
42+ value = toRaw ( value ) ;
43+ }
44+
3845 // 复杂类型 转驼峰
3946 if ( value && typeof value === 'object' ) {
4047 return [ kebabToCamel ( key ) , value ] ;
@@ -50,24 +57,30 @@ export function omiVueify(
5057 . filter ( attrKey => attrKey . match ( / ^ o n [ A - Z a - z ] / ) )
5158 . map ( oriEvent => oriEventToOmi ( oriEvent ) ) ;
5259
60+ // 存储事件处理函数的引用,以便正确移除
61+ const eventHandlers = new Map < string , ( e : Event ) => void > ( ) ;
62+
5363 onMounted ( ( ) => {
5464 // 添加事件监听
5565 omiEvents . forEach ( ( omiEvent ) => {
5666 const vueEvent = camelToKebab ( omiEvent ) ;
5767 // 仅处理kebab-case风格
5868 if ( ! isKebabString ( vueEvent ) ) return ;
5969
60- elRef . value ?. addEventListener ( omiEvent , ( e : Event ) => {
70+ const handler = ( e : Event ) => {
6171 emit ( vueEvent , e ) ;
62- } )
72+ } ;
73+ eventHandlers . set ( omiEvent , handler ) ;
74+ elRef . value ?. addEventListener ( omiEvent , handler ) ;
6375 } )
6476 } )
6577
6678 // 清理事件监听
6779 onBeforeUnmount ( ( ) => {
68- omiEvents . forEach ( ( omiEvent ) => {
69- elRef . value ?. removeEventListener ( omiEvent , ( ) => { } )
70- } )
80+ eventHandlers . forEach ( ( handler , omiEvent ) => {
81+ elRef . value ?. removeEventListener ( omiEvent , handler ) ;
82+ } ) ;
83+ eventHandlers . clear ( ) ;
7184 } )
7285
7386 return ( ) => {
@@ -145,4 +158,4 @@ const camelToKebab = (omiEvent: string): string => {
145158 */
146159const kebabToCamel = ( str : string ) : string => {
147160 return str . replace ( / - ( [ a - z ] ) / g, ( _match , p1 ) => p1 . toUpperCase ( ) ) ;
148- }
161+ }
0 commit comments