From 22036bc75d4f75a8ca7762cf011b922bed19c150 Mon Sep 17 00:00:00 2001 From: huangxuan Date: Tue, 5 Dec 2023 19:57:07 +0800 Subject: [PATCH] =?UTF-8?q?Dom=E4=B8=8A=E9=94=AE=E5=80=BC=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=9A=8F=E6=9C=BA=E5=AD=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/inula/src/dom/DOMExternal.ts | 3 ++- packages/inula/src/dom/DOMInternalKeys.ts | 9 ++++++--- .../inula/src/dom/valueHandler/ValueChangeHandler.ts | 2 +- packages/inula/src/event/EventBinding.ts | 6 +++--- packages/inula/src/event/InulaEventMain.ts | 8 +++++++- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/inula/src/dom/DOMExternal.ts b/packages/inula/src/dom/DOMExternal.ts index 076709e9..12dea7b1 100644 --- a/packages/inula/src/dom/DOMExternal.ts +++ b/packages/inula/src/dom/DOMExternal.ts @@ -21,6 +21,7 @@ import { findDOMByClassInst } from '../renderer/vnode/VNodeUtils'; import { listenSimulatedDelegatedEvents } from '../event/EventBinding'; import { Callback } from '../renderer/Types'; import { InulaNode } from '../types'; +import { EVENT_KEY } from './DOMInternalKeys'; function createRoot(children: any, container: Container, callback?: Callback) { // 清空容器 @@ -89,7 +90,7 @@ function findDOMNode(domOrEle?: Element): null | Element | Text { // 情况根节点监听器 function removeRootEventLister(container: Container) { - const events = (container as any).$EV; + const events = (container as any)[EVENT_KEY]; if (events) { Object.keys(events).forEach(event => { const listener = events[event]; diff --git a/packages/inula/src/dom/DOMInternalKeys.ts b/packages/inula/src/dom/DOMInternalKeys.ts index a8727261..c4f1824f 100644 --- a/packages/inula/src/dom/DOMInternalKeys.ts +++ b/packages/inula/src/dom/DOMInternalKeys.ts @@ -22,9 +22,12 @@ import type { Container, Props } from './DOMOperator'; import { DomComponent, DomText, TreeRoot } from '../renderer/vnode/VNodeTags'; -const INTERNAL_VNODE = '_inula_VNode'; -const INTERNAL_PROPS = '_inula_Props'; -const INTERNAL_NONDELEGATEEVENTS = '_inula_NonDelegatedEvents'; +const randomKey = Math.random().toString(16).slice(2); +const INTERNAL_VNODE = `_inula_VNode_${randomKey}`; +const INTERNAL_PROPS = `_inula_Props_${randomKey}`; +const INTERNAL_NONDELEGATEEVENTS = `_inula_nonDelegatedEvents_${randomKey}`; +export const HANDLER_KEY = `_inula_valueChangeHandler_${randomKey}`; +export const EVENT_KEY = `_inula_ev_${randomKey}`; // 通过 VNode 实例获取 DOM 节点 export function getDom(vNode: VNode): Element | Text | null { diff --git a/packages/inula/src/dom/valueHandler/ValueChangeHandler.ts b/packages/inula/src/dom/valueHandler/ValueChangeHandler.ts index cd07c35c..262dc837 100644 --- a/packages/inula/src/dom/valueHandler/ValueChangeHandler.ts +++ b/packages/inula/src/dom/valueHandler/ValueChangeHandler.ts @@ -18,7 +18,7 @@ * 只有值发生变化时才会触发change事件。 */ -const HANDLER_KEY = '_valueChangeHandler'; +import { HANDLER_KEY } from '../DOMInternalKeys'; // 判断是否是 check 类型 function isCheckType(dom: HTMLInputElement): boolean { diff --git a/packages/inula/src/event/EventBinding.ts b/packages/inula/src/event/EventBinding.ts index f3e9f58e..52bfffcd 100644 --- a/packages/inula/src/event/EventBinding.ts +++ b/packages/inula/src/event/EventBinding.ts @@ -18,7 +18,7 @@ */ import { allDelegatedInulaEvents, portalDefaultDelegatedEvents, simulatedDelegatedEvents } from './EventHub'; import { isDocument } from '../dom/utils/Common'; -import { getNearestVNode, getNonDelegatedListenerMap } from '../dom/DOMInternalKeys'; +import { EVENT_KEY, getNearestVNode, getNonDelegatedListenerMap } from '../dom/DOMInternalKeys'; import { asyncUpdates, runDiscreteUpdates } from '../renderer/TreeBuilder'; import { handleEventMain } from './InulaEventMain'; import { decorateNativeEvent } from './EventWrapper'; @@ -73,8 +73,8 @@ export function lazyDelegateOnRoot(currentRoot: VNode, eventName: string) { const nativeFullName = isCapture ? nativeEvent + 'capture' : nativeEvent; // 事件存储在DOM节点属性,避免多个VNode(root和portal)对应同一个DOM, 造成事件重复监听 - currentRoot.realNode.$EV = currentRoot.realNode.$EV ?? {}; - const events = currentRoot.realNode.$EV; + currentRoot.realNode[EVENT_KEY] = currentRoot.realNode[EVENT_KEY] ?? {}; + const events = currentRoot.realNode[EVENT_KEY]; if (!events[nativeFullName]) { events[nativeFullName] = listenToNativeEvent(nativeEvent, currentRoot.realNode, isCapture); diff --git a/packages/inula/src/event/InulaEventMain.ts b/packages/inula/src/event/InulaEventMain.ts index cff523fc..817618f4 100644 --- a/packages/inula/src/event/InulaEventMain.ts +++ b/packages/inula/src/event/InulaEventMain.ts @@ -142,7 +142,13 @@ function triggerInulaEvents( const target = nativeEvent.target || nativeEvent.srcElement!; // 触发普通委托事件 - const listenerList: ListenerUnitList = getCommonListeners(nativeEvtName, vNode, nativeEvent, target, isCapture); + const listenerList: ListenerUnitList = getCommonListeners( + nativeEvtName, + vNode, + nativeEvent as MouseEvent, + target, + isCapture + ); let mouseEnterListeners: ListenerUnitList = []; if (inulaEventToNativeMap.get('onMouseEnter')!.includes(nativeEvtName)) {