Skip to content

Commit 2b835e6

Browse files
committed
fix: fix ref/reactive props error & fix event unbind error
1 parent e24e7fd commit 2b835e6

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

packages/omi-vueify/src/index.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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

33
export function omiVueify(
44
tagName: string,
@@ -35,6 +35,13 @@ export function omiVueify(
3535
// 仅处理非事件
3636
.filter(([key]) => !key.match(/^on[A-Za-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(/^on[A-Za-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
*/
146159
const kebabToCamel = (str: string): string => {
147160
return str.replace(/-([a-z])/g, (_match, p1) => p1.toUpperCase());
148-
}
161+
}

0 commit comments

Comments
 (0)