【core】portal事件绑定

This commit is contained in:
c00364821 2023-12-01 10:44:38 +08:00
parent 7d336d7212
commit 3c99146193
3 changed files with 17 additions and 2 deletions

View File

@ -16,7 +16,7 @@
/**
*
*/
import { allDelegatedInulaEvents, simulatedDelegatedEvents } from './EventHub';
import { allDelegatedInulaEvents, portalDefaultDelegatedEvents, simulatedDelegatedEvents } from './EventHub';
import { isDocument } from '../dom/utils/Common';
import { getNearestVNode, getNonDelegatedListenerMap } from '../dom/DOMInternalKeys';
import { asyncUpdates, runDiscreteUpdates } from '../renderer/TreeBuilder';
@ -89,6 +89,13 @@ export function listenSimulatedDelegatedEvents(root: VNode) {
}
}
// portal绑定默认事件
export function listenPortalEvents(root: VNode) {
for (let i = 0; i < portalDefaultDelegatedEvents.length; i++) {
lazyDelegateOnRoot(root, portalDefaultDelegatedEvents[i]);
}
}
// 通过inula事件名获取到native事件名
function getNativeEvtName(inulaEventName, capture) {
let nativeName;

View File

@ -16,6 +16,13 @@
// 需要委托的inula事件和原生事件对应关系
export const allDelegatedInulaEvents = new Map();
/**
* Portal根节点默认绑定事件parent vnode的问题
* parent vNode节点绑定了mousedown事件portal节点mousedown事件
* portal下子元素mousedown事件无法冒泡到parentNode
*/
export const portalDefaultDelegatedEvents = ['onMouseDown', 'onMouseUp', 'onKeyDown', 'onKeyUp', 'onFocus', 'onBlur', 'onClick'];
// 模拟委托事件,不冒泡事件需要利用其他事件来触发冒泡过程
export const simulatedDelegatedEvents = ['onMouseEnter', 'onMouseLeave'];
// 所有委托的原生事件集合

View File

@ -17,11 +17,12 @@ import type { VNode } from '../Types';
import { resetNamespaceCtx, setNamespaceCtx } from '../ContextSaver';
import { createChildrenByDiff } from '../diff/nodeDiffComparator';
import { popCurrentRoot, pushCurrentRoot } from '../RootStack';
import { listenSimulatedDelegatedEvents } from '../../event/EventBinding';
import { listenPortalEvents, listenSimulatedDelegatedEvents } from '../../event/EventBinding';
export function bubbleRender(processing: VNode) {
resetNamespaceCtx(processing);
listenSimulatedDelegatedEvents(processing);
listenPortalEvents(processing);
popCurrentRoot();
}