Match-id-78f2aee4f5dd7a1ca2ee2e40479e2c971fa947fc
This commit is contained in:
commit
bdc192774b
|
@ -58,6 +58,7 @@ export function getNearestVNode(dom: Node): null | VNode {
|
||||||
if (vNode) { // 如果是已经被框架标记过的 DOM 节点,那么直接返回其 VNode 实例
|
if (vNode) { // 如果是已经被框架标记过的 DOM 节点,那么直接返回其 VNode 实例
|
||||||
return vNode;
|
return vNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 下面处理的是为被框架标记过的 DOM 节点,向上找其父节点是否被框架标记过
|
// 下面处理的是为被框架标记过的 DOM 节点,向上找其父节点是否被框架标记过
|
||||||
let parentDom = dom.parentNode;
|
let parentDom = dom.parentNode;
|
||||||
let nearVNode = null;
|
let nearVNode = null;
|
||||||
|
|
|
@ -226,15 +226,6 @@ export function unHideDom(tag: string, dom: Element | Text, props: Props) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function clearContainer(container: Container): void {
|
|
||||||
if (isElement(container)) {
|
|
||||||
container.textContent = '';
|
|
||||||
}
|
|
||||||
if (isDocument(container) && container.body != null) {
|
|
||||||
container.body.textContent = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function prePortal(portal: Element): void {
|
export function prePortal(portal: Element): void {
|
||||||
listenDelegatedEvents(portal);
|
listenDelegatedEvents(portal);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import {Props} from '../DOMOperator';
|
||||||
* 获取当前聚焦的 input 或者 textarea 元素
|
* 获取当前聚焦的 input 或者 textarea 元素
|
||||||
* @param doc 指定 document
|
* @param doc 指定 document
|
||||||
*/
|
*/
|
||||||
export function getFocusedDom(doc?: Document): HorizonDom | void {
|
export function getFocusedDom(doc?: Document): HorizonDom | null {
|
||||||
let currentDocument;
|
let currentDocument;
|
||||||
if (doc) {
|
if (doc) {
|
||||||
currentDocument = doc;
|
currentDocument = doc;
|
||||||
|
|
|
@ -78,6 +78,7 @@ export function listenDelegatedEvents(dom: Element) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dom[listeningMarker] = true;
|
dom[listeningMarker] = true;
|
||||||
|
|
||||||
allDelegatedNativeEvents.forEach((nativeEvtName: string) => {
|
allDelegatedNativeEvents.forEach((nativeEvtName: string) => {
|
||||||
// 委托冒泡事件
|
// 委托冒泡事件
|
||||||
listenToNativeEvent(nativeEvtName, dom, false);
|
listenToNativeEvent(nativeEvtName, dom, false);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import type { AnyNativeEvent, ProcessingListenerList } from './Types';
|
import type { AnyNativeEvent } from './Types';
|
||||||
import type { VNode } from '../renderer/Types';
|
import type { VNode } from '../renderer/Types';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
@ -25,6 +25,7 @@ import { getListenersFromTree } from './ListenerGetter';
|
||||||
import { shouldUpdateValue, updateControlledValue } from './ControlledValueUpdater';
|
import { shouldUpdateValue, updateControlledValue } from './ControlledValueUpdater';
|
||||||
import { asyncUpdates, runDiscreteUpdates } from '../renderer/Renderer';
|
import { asyncUpdates, runDiscreteUpdates } from '../renderer/Renderer';
|
||||||
import { getExactNode } from '../renderer/vnode/VNodeUtils';
|
import { getExactNode } from '../renderer/vnode/VNodeUtils';
|
||||||
|
import {ListenerUnitList} from './Types';
|
||||||
|
|
||||||
// 获取事件触发的普通事件监听方法队列
|
// 获取事件触发的普通事件监听方法队列
|
||||||
function getCommonListeners(
|
function getCommonListeners(
|
||||||
|
@ -33,7 +34,7 @@ function getCommonListeners(
|
||||||
nativeEvent: AnyNativeEvent,
|
nativeEvent: AnyNativeEvent,
|
||||||
target: null | EventTarget,
|
target: null | EventTarget,
|
||||||
isCapture: boolean,
|
isCapture: boolean,
|
||||||
): ProcessingListenerList {
|
): ListenerUnitList {
|
||||||
const horizonEvtName = getCustomEventNameWithOn(CommonEventToHorizonMap[nativeEvtName]);
|
const horizonEvtName = getCustomEventNameWithOn(CommonEventToHorizonMap[nativeEvtName]);
|
||||||
if (!horizonEvtName) {
|
if (!horizonEvtName) {
|
||||||
return [];
|
return [];
|
||||||
|
@ -67,20 +68,17 @@ function getCommonListeners(
|
||||||
}
|
}
|
||||||
|
|
||||||
// 按顺序执行事件队列
|
// 按顺序执行事件队列
|
||||||
function processListeners(processingEventsList: ProcessingListenerList): void {
|
function processListeners(listenerList: ListenerUnitList): void {
|
||||||
processingEventsList.forEach(eventUnitList => {
|
listenerList.forEach(eventUnit => {
|
||||||
let lastVNode;
|
const { currentTarget, listener, event } = eventUnit;
|
||||||
eventUnitList.forEach(eventUnit => {
|
if (event.isPropagationStopped()) {
|
||||||
const { vNode, currentTarget, listener, event } = eventUnit;
|
return;
|
||||||
if (vNode !== lastVNode && event.isPropagationStopped()) {
|
}
|
||||||
return;
|
event.currentTarget = currentTarget;
|
||||||
}
|
runListenerAndCatchFirstError(listener, event);
|
||||||
event.currentTarget = currentTarget;
|
event.currentTarget = null;
|
||||||
runListenerAndCatchFirstError(listener, event);
|
|
||||||
event.currentTarget = null;
|
|
||||||
lastVNode = vNode;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 执行所有事件后,重新throw遇到的第一个错误
|
// 执行所有事件后,重新throw遇到的第一个错误
|
||||||
throwCaughtEventError();
|
throwCaughtEventError();
|
||||||
}
|
}
|
||||||
|
@ -91,9 +89,9 @@ function getProcessListenersFacade(
|
||||||
nativeEvent: AnyNativeEvent,
|
nativeEvent: AnyNativeEvent,
|
||||||
target,
|
target,
|
||||||
isCapture: boolean
|
isCapture: boolean
|
||||||
): ProcessingListenerList {
|
): ListenerUnitList {
|
||||||
// 触发普通委托事件
|
// 触发普通委托事件
|
||||||
let processingListenerList: ProcessingListenerList = getCommonListeners(
|
let listenerList: ListenerUnitList = getCommonListeners(
|
||||||
nativeEvtName,
|
nativeEvtName,
|
||||||
vNode,
|
vNode,
|
||||||
nativeEvent,
|
nativeEvent,
|
||||||
|
@ -104,7 +102,7 @@ function getProcessListenersFacade(
|
||||||
// 触发特殊handler委托事件
|
// 触发特殊handler委托事件
|
||||||
if (!isCapture) {
|
if (!isCapture) {
|
||||||
if (horizonEventToNativeMap.get('onChange').includes(nativeEvtName)) {
|
if (horizonEventToNativeMap.get('onChange').includes(nativeEvtName)) {
|
||||||
processingListenerList = processingListenerList.concat(getChangeListeners(
|
listenerList = listenerList.concat(getChangeListeners(
|
||||||
nativeEvtName,
|
nativeEvtName,
|
||||||
nativeEvent,
|
nativeEvent,
|
||||||
vNode,
|
vNode,
|
||||||
|
@ -113,7 +111,7 @@ function getProcessListenersFacade(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (horizonEventToNativeMap.get('onSelect').includes(nativeEvtName)) {
|
if (horizonEventToNativeMap.get('onSelect').includes(nativeEvtName)) {
|
||||||
processingListenerList = processingListenerList.concat(getSelectionListeners(
|
listenerList = listenerList.concat(getSelectionListeners(
|
||||||
nativeEvtName,
|
nativeEvtName,
|
||||||
nativeEvent,
|
nativeEvent,
|
||||||
vNode,
|
vNode,
|
||||||
|
@ -124,7 +122,7 @@ function getProcessListenersFacade(
|
||||||
if (nativeEvtName === 'compositionend' ||
|
if (nativeEvtName === 'compositionend' ||
|
||||||
nativeEvtName === 'compositionstart' ||
|
nativeEvtName === 'compositionstart' ||
|
||||||
nativeEvtName === 'compositionupdate') {
|
nativeEvtName === 'compositionupdate') {
|
||||||
processingListenerList = processingListenerList.concat(getCompositionListeners(
|
listenerList = listenerList.concat(getCompositionListeners(
|
||||||
nativeEvtName,
|
nativeEvtName,
|
||||||
nativeEvent,
|
nativeEvent,
|
||||||
vNode,
|
vNode,
|
||||||
|
@ -133,7 +131,7 @@ function getProcessListenersFacade(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (horizonEventToNativeMap.get('onBeforeInput').includes(nativeEvtName)) {
|
if (horizonEventToNativeMap.get('onBeforeInput').includes(nativeEvtName)) {
|
||||||
processingListenerList = processingListenerList.concat(getBeforeInputListeners(
|
listenerList = listenerList.concat(getBeforeInputListeners(
|
||||||
nativeEvtName,
|
nativeEvtName,
|
||||||
nativeEvent,
|
nativeEvent,
|
||||||
vNode,
|
vNode,
|
||||||
|
@ -141,7 +139,7 @@ function getProcessListenersFacade(
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return processingListenerList;
|
return listenerList;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 触发可以被执行的horizon事件监听
|
// 触发可以被执行的horizon事件监听
|
||||||
|
@ -154,10 +152,10 @@ function triggerHorizonEvents(
|
||||||
const nativeEventTarget = getEventTarget(nativeEvent);
|
const nativeEventTarget = getEventTarget(nativeEvent);
|
||||||
|
|
||||||
// 获取委托事件队列
|
// 获取委托事件队列
|
||||||
const processingListenerList = getProcessListenersFacade(nativeEvtName, vNode, nativeEvent, nativeEventTarget, isCapture);
|
const listenerList = getProcessListenersFacade(nativeEvtName, vNode, nativeEvent, nativeEventTarget, isCapture);
|
||||||
|
|
||||||
// 处理触发的事件队列
|
// 处理触发的事件队列
|
||||||
processListeners(processingListenerList);
|
processListeners(listenerList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -170,26 +168,26 @@ export function handleEventMain(
|
||||||
isCapture: boolean,
|
isCapture: boolean,
|
||||||
nativeEvent: AnyNativeEvent,
|
nativeEvent: AnyNativeEvent,
|
||||||
vNode: null | VNode,
|
vNode: null | VNode,
|
||||||
target: EventTarget,
|
targetContainer: EventTarget,
|
||||||
): void {
|
): void {
|
||||||
let rootVNode = vNode;
|
let startVNode = vNode;
|
||||||
if (vNode !== null) {
|
if (startVNode !== null) {
|
||||||
rootVNode = getExactNode(vNode, target);
|
startVNode = getExactNode(startVNode, targetContainer);
|
||||||
if (!rootVNode) {
|
if (!startVNode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 有事件正在执行,同步执行事件
|
// 有事件正在执行,同步执行事件
|
||||||
if (isInEventsExecution) {
|
if (isInEventsExecution) {
|
||||||
triggerHorizonEvents(nativeEvtName, isCapture, nativeEvent, rootVNode);
|
triggerHorizonEvents(nativeEvtName, isCapture, nativeEvent, startVNode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 没有事件在执行,经过调度再执行事件
|
// 没有事件在执行,经过调度再执行事件
|
||||||
isInEventsExecution = true;
|
isInEventsExecution = true;
|
||||||
try {
|
try {
|
||||||
asyncUpdates(() => triggerHorizonEvents(nativeEvtName, isCapture, nativeEvent, rootVNode));
|
asyncUpdates(() => triggerHorizonEvents(nativeEvtName, isCapture, nativeEvent, startVNode));
|
||||||
} finally {
|
} finally {
|
||||||
isInEventsExecution = false;
|
isInEventsExecution = false;
|
||||||
if (shouldUpdateValue()) {
|
if (shouldUpdateValue()) {
|
||||||
|
|
|
@ -1,62 +1,16 @@
|
||||||
import {VNode} from '../renderer/Types';
|
import {VNode} from '../renderer/Types';
|
||||||
import {DomComponent} from '../renderer/vnode/VNodeTags';
|
import {DomComponent} from '../renderer/vnode/VNodeTags';
|
||||||
import {throwIfTrue} from '../renderer/utils/throwIfTrue';
|
|
||||||
import type {Props} from '../dom/DOMOperator';
|
|
||||||
import {EVENT_TYPE_ALL, EVENT_TYPE_CAPTURE, EVENT_TYPE_BUBBLE} from './const';
|
import {EVENT_TYPE_ALL, EVENT_TYPE_CAPTURE, EVENT_TYPE_BUBBLE} from './const';
|
||||||
import {ProcessingListenerList, ListenerUnitList} from './Types';
|
import {ListenerUnitList} from './Types';
|
||||||
import {CustomBaseEvent} from './customEvents/CustomBaseEvent';
|
import {CustomBaseEvent} from './customEvents/CustomBaseEvent';
|
||||||
|
|
||||||
// 返回是否应该阻止事件响应标记,disabled组件不响应鼠标事件
|
|
||||||
function shouldPrevent(eventName: string, type: string, props: Props): boolean {
|
|
||||||
const canPreventMouseEvents = [
|
|
||||||
'onClick',
|
|
||||||
'onClickCapture',
|
|
||||||
'onDoubleClick',
|
|
||||||
'onDoubleClickCapture',
|
|
||||||
'onMouseDown',
|
|
||||||
'onMouseDownCapture',
|
|
||||||
'onMouseMove',
|
|
||||||
'onMouseMoveCapture',
|
|
||||||
'onMouseUp',
|
|
||||||
'onMouseUpCapture',
|
|
||||||
'onMouseEnter',
|
|
||||||
];
|
|
||||||
const interActiveElements = ['button', 'input', 'select', 'textarea'];
|
|
||||||
if (canPreventMouseEvents.includes(eventName)) {
|
|
||||||
return !!(props.disabled && interActiveElements.includes(type));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 从vnode属性中获取事件listener
|
|
||||||
function getListener(vNode: VNode, eventName: string): Function | null {
|
|
||||||
const realNode = vNode.realNode;
|
|
||||||
if (realNode === null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
const props = vNode.props;
|
|
||||||
if (props === null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
const listener = props[eventName];
|
|
||||||
if (shouldPrevent(eventName, vNode.type, props)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
throwIfTrue(
|
|
||||||
listener && typeof listener !== 'function',
|
|
||||||
'`%s` listener should be a function.',
|
|
||||||
eventName
|
|
||||||
);
|
|
||||||
return listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取监听事件
|
// 获取监听事件
|
||||||
export function getListenersFromTree(
|
export function getListenersFromTree(
|
||||||
targetVNode: VNode | null,
|
targetVNode: VNode | null,
|
||||||
horizonEvtName: string | null,
|
horizonEvtName: string | null,
|
||||||
horizonEvent: CustomBaseEvent,
|
horizonEvent: CustomBaseEvent,
|
||||||
eventType: string,
|
eventType: string,
|
||||||
): ProcessingListenerList {
|
): ListenerUnitList {
|
||||||
if (!horizonEvtName) {
|
if (!horizonEvtName) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
@ -71,7 +25,7 @@ export function getListenersFromTree(
|
||||||
if (tag === DomComponent && realNode !== null) {
|
if (tag === DomComponent && realNode !== null) {
|
||||||
if (eventType === EVENT_TYPE_ALL || eventType === EVENT_TYPE_CAPTURE) {
|
if (eventType === EVENT_TYPE_ALL || eventType === EVENT_TYPE_CAPTURE) {
|
||||||
const captureName = horizonEvtName + EVENT_TYPE_CAPTURE;
|
const captureName = horizonEvtName + EVENT_TYPE_CAPTURE;
|
||||||
const captureListener = getListener(vNode, captureName);
|
const captureListener = vNode.props[captureName];
|
||||||
if (captureListener) {
|
if (captureListener) {
|
||||||
listeners.unshift({
|
listeners.unshift({
|
||||||
vNode,
|
vNode,
|
||||||
|
@ -82,7 +36,7 @@ export function getListenersFromTree(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (eventType === EVENT_TYPE_ALL || eventType === EVENT_TYPE_BUBBLE) {
|
if (eventType === EVENT_TYPE_ALL || eventType === EVENT_TYPE_BUBBLE) {
|
||||||
const bubbleListener = getListener(vNode, horizonEvtName);
|
const bubbleListener = vNode.props[horizonEvtName];
|
||||||
if (bubbleListener) {
|
if (bubbleListener) {
|
||||||
listeners.push({
|
listeners.push({
|
||||||
vNode,
|
vNode,
|
||||||
|
@ -95,7 +49,7 @@ export function getListenersFromTree(
|
||||||
}
|
}
|
||||||
vNode = vNode.parent;
|
vNode = vNode.parent;
|
||||||
}
|
}
|
||||||
return listeners.length > 0 ? [listeners]: [];
|
return listeners;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,5 +12,3 @@ export type ListenerUnit = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ListenerUnitList = Array<ListenerUnit>;
|
export type ListenerUnitList = Array<ListenerUnit>;
|
||||||
|
|
||||||
export type ProcessingListenerList = Array<ListenerUnitList>;
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ export const horizonEventToNativeMap = new Map([
|
||||||
['onCompositionStart', ['compositionstart']],
|
['onCompositionStart', ['compositionstart']],
|
||||||
['onCompositionUpdate', ['compositionupdate']],
|
['onCompositionUpdate', ['compositionupdate']],
|
||||||
['onBeforeInput', ['compositionend', 'keypress', 'textInput']],
|
['onBeforeInput', ['compositionend', 'keypress', 'textInput']],
|
||||||
['onChange', ['change', 'click', 'focusout', 'input',]],
|
['onChange', ['change', 'click', 'focusout', 'input']],
|
||||||
['onSelect', ['focusout', 'contextmenu', 'dragend', 'focusin',
|
['onSelect', ['focusout', 'contextmenu', 'dragend', 'focusin',
|
||||||
'keydown', 'keyup', 'mousedown', 'mouseup', 'selectionchange']],
|
'keydown', 'keyup', 'mousedown', 'mouseup', 'selectionchange']],
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import type {VNode} from '../../renderer/Types';
|
import type {VNode} from '../../renderer/Types';
|
||||||
import type {AnyNativeEvent, ProcessingListenerList} from '../Types';
|
import type {AnyNativeEvent} from '../Types';
|
||||||
import {getListenersFromTree} from '../ListenerGetter';
|
import {getListenersFromTree} from '../ListenerGetter';
|
||||||
import {createHandlerCustomEvent} from '../customEvents/EventFactory';
|
import {createHandlerCustomEvent} from '../customEvents/EventFactory';
|
||||||
import {CHAR_CODE_SPACE, EVENT_TYPE_ALL} from '../const';
|
import {CHAR_CODE_SPACE, EVENT_TYPE_ALL} from '../const';
|
||||||
import {CustomBaseEvent} from '../customEvents/CustomBaseEvent';
|
import {CustomBaseEvent} from '../customEvents/CustomBaseEvent';
|
||||||
|
import {ListenerUnitList} from '../Types';
|
||||||
const SPACE_CHAR = String.fromCharCode(CHAR_CODE_SPACE);
|
const SPACE_CHAR = String.fromCharCode(CHAR_CODE_SPACE);
|
||||||
|
|
||||||
function getInputCharsByNative(
|
function getInputCharsByNative(
|
||||||
|
@ -28,7 +29,7 @@ export function getListeners(
|
||||||
nativeEvent: AnyNativeEvent,
|
nativeEvent: AnyNativeEvent,
|
||||||
vNode: null | VNode,
|
vNode: null | VNode,
|
||||||
target: null | EventTarget,
|
target: null | EventTarget,
|
||||||
): ProcessingListenerList {
|
): ListenerUnitList {
|
||||||
const chars = getInputCharsByNative(nativeEvtName, nativeEvent);
|
const chars = getInputCharsByNative(nativeEvtName, nativeEvent);
|
||||||
// 无字符将要输入,无需处理
|
// 无字符将要输入,无需处理
|
||||||
if (!chars) {
|
if (!chars) {
|
||||||
|
|
|
@ -4,7 +4,7 @@ import {isInputValueChanged} from '../../dom/valueHandler/ValueChangeHandler';
|
||||||
import {addValueUpdateList} from '../ControlledValueUpdater';
|
import {addValueUpdateList} from '../ControlledValueUpdater';
|
||||||
import {isTextInputElement} from '../utils';
|
import {isTextInputElement} from '../utils';
|
||||||
import {EVENT_TYPE_ALL} from '../const';
|
import {EVENT_TYPE_ALL} from '../const';
|
||||||
import {AnyNativeEvent, ProcessingListenerList} from '../Types';
|
import {AnyNativeEvent, ListenerUnitList} from '../Types';
|
||||||
import {
|
import {
|
||||||
getListenersFromTree,
|
getListenersFromTree,
|
||||||
} from '../ListenerGetter';
|
} from '../ListenerGetter';
|
||||||
|
@ -39,7 +39,7 @@ export function getListeners(
|
||||||
nativeEvt: AnyNativeEvent,
|
nativeEvt: AnyNativeEvent,
|
||||||
vNode: null | VNode,
|
vNode: null | VNode,
|
||||||
target: null | EventTarget,
|
target: null | EventTarget,
|
||||||
): ProcessingListenerList {
|
): ListenerUnitList {
|
||||||
if (!vNode) {
|
if (!vNode) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import type {VNode} from '../../renderer/Types';
|
import type {VNode} from '../../renderer/Types';
|
||||||
import type {AnyNativeEvent, ProcessingListenerList} from '../Types';
|
import type {AnyNativeEvent} from '../Types';
|
||||||
import {getListenersFromTree} from '../ListenerGetter';
|
import {getListenersFromTree} from '../ListenerGetter';
|
||||||
import {createHandlerCustomEvent} from '../customEvents/EventFactory';
|
import {createHandlerCustomEvent} from '../customEvents/EventFactory';
|
||||||
import {EVENT_TYPE_ALL} from '../const';
|
import {EVENT_TYPE_ALL} from '../const';
|
||||||
|
import {ListenerUnitList} from '../Types';
|
||||||
|
|
||||||
const compositionEventObj = {
|
const compositionEventObj = {
|
||||||
compositionstart: 'onCompositionStart',
|
compositionstart: 'onCompositionStart',
|
||||||
|
@ -16,7 +17,7 @@ export function getListeners(
|
||||||
nativeEvt: AnyNativeEvent,
|
nativeEvt: AnyNativeEvent,
|
||||||
vNode: null | VNode,
|
vNode: null | VNode,
|
||||||
target: null | EventTarget,
|
target: null | EventTarget,
|
||||||
): ProcessingListenerList {
|
): ListenerUnitList {
|
||||||
const evtType = compositionEventObj[evtName];
|
const evtType = compositionEventObj[evtName];
|
||||||
|
|
||||||
const event = createHandlerCustomEvent(
|
const event = createHandlerCustomEvent(
|
||||||
|
|
|
@ -4,10 +4,11 @@ import {getFocusedDom} from '../../dom/utils/Common';
|
||||||
import {getDom} from '../../dom/DOMInternalKeys';
|
import {getDom} from '../../dom/DOMInternalKeys';
|
||||||
import {isDocument} from '../../dom/utils/Common';
|
import {isDocument} from '../../dom/utils/Common';
|
||||||
import {isTextInputElement} from '../utils';
|
import {isTextInputElement} from '../utils';
|
||||||
import type {AnyNativeEvent, ProcessingListenerList} from '../Types';
|
import type {AnyNativeEvent} from '../Types';
|
||||||
import {getListenersFromTree} from '../ListenerGetter';
|
import {getListenersFromTree} from '../ListenerGetter';
|
||||||
import type {VNode} from '../../renderer/Types';
|
import type {VNode} from '../../renderer/Types';
|
||||||
import {EVENT_TYPE_ALL} from '../const';
|
import {EVENT_TYPE_ALL} from '../const';
|
||||||
|
import {ListenerUnitList} from '../Types';
|
||||||
|
|
||||||
const horizonEventName = 'onSelect'
|
const horizonEventName = 'onSelect'
|
||||||
|
|
||||||
|
@ -83,9 +84,9 @@ export function getListeners(
|
||||||
nativeEvt: AnyNativeEvent,
|
nativeEvt: AnyNativeEvent,
|
||||||
vNode: null | VNode,
|
vNode: null | VNode,
|
||||||
target: null | EventTarget,
|
target: null | EventTarget,
|
||||||
): ProcessingListenerList {
|
): ListenerUnitList {
|
||||||
const targetNode = vNode ? getDom(vNode) : window;
|
const targetNode = vNode ? getDom(vNode) : window;
|
||||||
let eventUnitList: ProcessingListenerList = [];
|
let eventUnitList: ListenerUnitList = [];
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case 'focusin':
|
case 'focusin':
|
||||||
initTargetCache(targetNode, vNode);
|
initTargetCache(targetNode, vNode);
|
||||||
|
|
|
@ -34,8 +34,8 @@ export function callUseEffects(vNode: VNode) {
|
||||||
(effectConstant & EffectConstant.Effect) !== EffectConstant.NoEffect &&
|
(effectConstant & EffectConstant.Effect) !== EffectConstant.NoEffect &&
|
||||||
(effectConstant & EffectConstant.DepsChange) !== EffectConstant.NoEffect
|
(effectConstant & EffectConstant.DepsChange) !== EffectConstant.NoEffect
|
||||||
) {
|
) {
|
||||||
hookEffects.push({effect, vNode});
|
hookEffects.push(effect);
|
||||||
hookRemoveEffects.push({effect, vNode});
|
hookRemoveEffects.push(effect);
|
||||||
|
|
||||||
// 异步调用
|
// 异步调用
|
||||||
if (!isScheduling) {
|
if (!isScheduling) {
|
||||||
|
@ -53,7 +53,7 @@ export function runAsyncEffects() {
|
||||||
// 调用effect destroy
|
// 调用effect destroy
|
||||||
const removeEffects = hookRemoveEffects;
|
const removeEffects = hookRemoveEffects;
|
||||||
hookRemoveEffects = [];
|
hookRemoveEffects = [];
|
||||||
removeEffects.forEach(({effect}) => {
|
removeEffects.forEach((effect) => {
|
||||||
const destroy = effect.removeEffect;
|
const destroy = effect.removeEffect;
|
||||||
effect.removeEffect = undefined;
|
effect.removeEffect = undefined;
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ export function runAsyncEffects() {
|
||||||
// 调用effect create
|
// 调用effect create
|
||||||
const createEffects = hookEffects;
|
const createEffects = hookEffects;
|
||||||
hookEffects = [];
|
hookEffects = [];
|
||||||
createEffects.forEach(({effect}) => {
|
createEffects.forEach((effect) => {
|
||||||
try {
|
try {
|
||||||
const create = effect.effect;
|
const create = effect.effect;
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ export function callEffectRemove(vNode: VNode) {
|
||||||
|
|
||||||
if (removeEffect !== undefined) {
|
if (removeEffect !== undefined) {
|
||||||
if ((effectConstant & EffectConstant.Effect) !== EffectConstant.NoEffect) { // 如果是useEffect,就异步调用
|
if ((effectConstant & EffectConstant.Effect) !== EffectConstant.NoEffect) { // 如果是useEffect,就异步调用
|
||||||
hookRemoveEffects.push({effect, vNode});
|
hookRemoveEffects.push(effect);
|
||||||
|
|
||||||
if (!isScheduling) {
|
if (!isScheduling) {
|
||||||
isScheduling = true;
|
isScheduling = true;
|
||||||
|
|
|
@ -27,7 +27,6 @@ import {
|
||||||
removeChildDom,
|
removeChildDom,
|
||||||
hideDom,
|
hideDom,
|
||||||
unHideDom,
|
unHideDom,
|
||||||
clearContainer,
|
|
||||||
} from '../../dom/DOMOperator';
|
} from '../../dom/DOMOperator';
|
||||||
import {
|
import {
|
||||||
callEffectRemove,
|
callEffectRemove,
|
||||||
|
@ -56,28 +55,17 @@ function callComponentWillUnmount(vNode: VNode, instance: any) {
|
||||||
function callBeforeSubmitLifeCycles(
|
function callBeforeSubmitLifeCycles(
|
||||||
vNode: VNode,
|
vNode: VNode,
|
||||||
): void {
|
): void {
|
||||||
switch (vNode.tag) {
|
if (vNode.tag === ClassComponent && !vNode.isCreated) { // 调用instance.getSnapshotBeforeUpdate
|
||||||
case ClassComponent: { // 调用instance.getSnapshotBeforeUpdate
|
const prevProps = vNode.isLazyComponent
|
||||||
if (!vNode.isCreated) {
|
? mergeDefaultProps(vNode.type, vNode.oldProps)
|
||||||
const prevProps = vNode.isLazyComponent
|
: vNode.oldProps;
|
||||||
? mergeDefaultProps(vNode.type, vNode.oldProps)
|
const prevState = vNode.oldState;
|
||||||
: vNode.oldProps;
|
const instance = vNode.realNode;
|
||||||
const prevState = vNode.oldState;
|
|
||||||
const instance = vNode.realNode;
|
|
||||||
|
|
||||||
const snapshot = instance.getSnapshotBeforeUpdate(prevProps, prevState);
|
const snapshot = instance.getSnapshotBeforeUpdate(prevProps, prevState);
|
||||||
|
|
||||||
// __snapshotResult会在调用componentDidUpdate的时候作为第三个参数
|
// __snapshotResult会在调用componentDidUpdate的时候作为第三个参数
|
||||||
instance.__snapshotResult = snapshot;
|
instance.__snapshotResult = snapshot;
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case TreeRoot: {
|
|
||||||
const root = vNode.realNode;
|
|
||||||
clearContainer(root.outerDom);
|
|
||||||
}
|
|
||||||
|
|
||||||
// No Default
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,7 +126,6 @@ function callAfterSubmitLifeCycles(
|
||||||
if (vNode.isCreated && vNode.flags.Update) {
|
if (vNode.isCreated && vNode.flags.Update) {
|
||||||
// button、input、select、textarea、如果有 autoFocus 属性需要focus
|
// button、input、select、textarea、如果有 autoFocus 属性需要focus
|
||||||
if (shouldAutoFocus(vNode.type, vNode.props)) {
|
if (shouldAutoFocus(vNode.type, vNode.props)) {
|
||||||
// button、input、select、textarea、如果有 autoFocus 属性需要focus
|
|
||||||
vNode.realNode.focus();
|
vNode.realNode.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -333,7 +320,7 @@ function submitClear(vNode: VNode): void {
|
||||||
clearVNode(clearChild);
|
clearVNode(clearChild);
|
||||||
clearChild = clearChild.next as VNode;
|
clearChild = clearChild.next as VNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 在所有子项都卸载后,删除dom树中的节点
|
// 在所有子项都卸载后,删除dom树中的节点
|
||||||
removeChildDom(currentParent, vNode.realNode);
|
removeChildDom(currentParent, vNode.realNode);
|
||||||
currentParent.append(cloneDom);
|
currentParent.append(cloneDom);
|
||||||
|
|
|
@ -11,7 +11,7 @@ import {
|
||||||
callBeforeSubmitLifeCycles, submitDeletion, submitAddition,
|
callBeforeSubmitLifeCycles, submitDeletion, submitAddition,
|
||||||
submitResetTextContent, submitUpdate, detachRef, submitClear,
|
submitResetTextContent, submitUpdate, detachRef, submitClear,
|
||||||
} from './LifeCycleHandler';
|
} from './LifeCycleHandler';
|
||||||
import {tryRenderFromRoot, setProcessing} from '../TreeBuilder';
|
import {tryRenderFromRoot} from '../TreeBuilder';
|
||||||
import {
|
import {
|
||||||
BySync,
|
BySync,
|
||||||
InRender,
|
InRender,
|
||||||
|
@ -81,11 +81,6 @@ export function submitToRender(treeRoot) {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 非批量:即同步执行的,没有必要去执行RenderQueue,RenderQueue放的是异步的
|
|
||||||
if (!checkMode(BySync)) { // 非批量
|
|
||||||
callRenderQueueImmediate();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +91,6 @@ function beforeSubmit(dirtyNodes: Array<VNode>) {
|
||||||
callBeforeSubmitLifeCycles(node);
|
callBeforeSubmitLifeCycles(node);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throwIfTrue(node === null, 'Should be working on an effect.');
|
|
||||||
handleSubmitError(node, error);
|
handleSubmitError(node, error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -138,7 +132,6 @@ function submit(dirtyNodes: Array<VNode>) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throwIfTrue(node === null, 'Should be working on an effect.');
|
|
||||||
handleSubmitError(node, error);
|
handleSubmitError(node, error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -155,7 +148,6 @@ function afterSubmit(dirtyNodes: Array<VNode>) {
|
||||||
attachRef(node);
|
attachRef(node);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throwIfTrue(node === null, 'Should be working on an effect.');
|
|
||||||
handleSubmitError(node, error);
|
handleSubmitError(node, error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -261,14 +261,14 @@ export function getExactNode(targetVNode, targetContainer) {
|
||||||
if (isPortalRoot(vNode, targetContainer)) {
|
if (isPortalRoot(vNode, targetContainer)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (container !== null) {
|
while (container !== null) {
|
||||||
const parentNode = getNearestVNode(container);
|
const parentNode = getNearestVNode(container);
|
||||||
if (parentNode === null) {
|
if (parentNode === null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (parentNode.tag === DomComponent || parentNode.tag === DomText) {
|
if (parentNode.tag === DomComponent || parentNode.tag === DomText) {
|
||||||
vNode = parentNode;
|
return getExactNode(parentNode, targetContainer);
|
||||||
return getExactNode(vNode, targetContainer);
|
|
||||||
}
|
}
|
||||||
container = container.parentNode;
|
container = container.parentNode;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue