Match-id-259d63c38e96411eb0a34820b390f5265864e64e

This commit is contained in:
* 2022-01-24 10:44:25 +08:00 committed by *
commit c9948e796f
13 changed files with 84 additions and 64 deletions

View File

@ -14,9 +14,9 @@ const svgHumpAttr = new Set(['allowReorder', 'autoReverse', 'baseFrequency', 'ba
'maskContentUnits', 'maskUnits', 'numOctaves', 'pathLength', 'patternContentUnits', 'patternTransform,', 'maskContentUnits', 'maskUnits', 'numOctaves', 'pathLength', 'patternContentUnits', 'patternTransform,',
'patternUnits', 'pointsAtX', 'pointsAtY', 'pointsAtZ', 'preserveAlpha', 'preserveAspectRatio', 'primitiveUnits', 'patternUnits', 'pointsAtX', 'pointsAtY', 'pointsAtZ', 'preserveAlpha', 'preserveAspectRatio', 'primitiveUnits',
'referrerPolicy', 'refX', 'refY', 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'referrerPolicy', 'refX', 'refY', 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures',
'specularConstant', 'specularExponent', 'spreadMethod', 'startOffset', 'stdDeviation', 'stitchTiles', 'surfaceScale', 'specularConstant', 'specularExponent', 'spreadMethod', 'startOffset', 'stdDeviation',
'systemLanguage', 'tableValues', 'targetX', 'targetY', 'textLength', 'viewBox', 'viewTarget', 'xChannelSelector', 'stitchTiles', 'surfaceScale','systemLanguage', 'tableValues', 'targetX', 'targetY',
'yChannelSelector', 'zoomAndPan']); 'textLength','viewBox', 'viewTarget', 'xChannelSelector','yChannelSelector', 'zoomAndPan']);
/** /**
* dom * dom

View File

@ -110,8 +110,8 @@ export interface selectionData {
selectionRange: { selectionRange: {
start: number; start: number;
end: number; end: number;
} };
}; }
// 防止选择范围内的信息因为节点删除或其他原因导致的信息丢失 // 防止选择范围内的信息因为节点删除或其他原因导致的信息丢失
export function resetSelectionRange(preSelectionRangeData: selectionData) { export function resetSelectionRange(preSelectionRangeData: selectionData) {

View File

@ -1,5 +1,5 @@
export interface IProperty { export interface IProperty {
[propName: string]: any [propName: string]: any;
} }
export interface HorizonSelect extends HTMLSelectElement { export interface HorizonSelect extends HTMLSelectElement {

View File

@ -9,10 +9,10 @@ export enum PROPERTY_TYPE {
}; };
export type PropDetails = { export type PropDetails = {
propName: string, propName: string;
type: PROPERTY_TYPE, type: PROPERTY_TYPE;
attrName: string, attrName: string;
attrNS: string | null, attrNS: string | null;
}; };
export function getPropDetails(name: string): PropDetails | null { export function getPropDetails(name: string): PropDetails | null {

View File

@ -1,5 +1,5 @@
import type {AnyNativeEvent, ProcessingListenerList} from './types'; import type { AnyNativeEvent, ProcessingListenerList } from './types';
import type {VNode} from '../renderer/Types'; import type { VNode } from '../renderer/Types';
import { import {
CommonEventToHorizonMap, CommonEventToHorizonMap,
@ -11,20 +11,20 @@ import {
throwCaughtEventError, throwCaughtEventError,
runListenerAndCatchFirstError, runListenerAndCatchFirstError,
} from './EventError'; } from './EventError';
import {getListeners as getBeforeInputListeners} from './simulatedEvtHandler/BeforeInputEventHandler'; import { getListeners as getBeforeInputListeners } from './simulatedEvtHandler/BeforeInputEventHandler';
import {getListeners as getCompositionListeners} from './simulatedEvtHandler/CompositionEventHandler'; import { getListeners as getCompositionListeners } from './simulatedEvtHandler/CompositionEventHandler';
import {getListeners as getChangeListeners} from './simulatedEvtHandler/ChangeEventHandler'; import { getListeners as getChangeListeners } from './simulatedEvtHandler/ChangeEventHandler';
import {getListeners as getSelectionListeners} from './simulatedEvtHandler/SelectionEventHandler'; import { getListeners as getSelectionListeners } from './simulatedEvtHandler/SelectionEventHandler';
import { import {
getCustomEventNameWithOn, getCustomEventNameWithOn,
uniqueCharCode, uniqueCharCode,
getEventTarget getEventTarget
} from './utils'; } from './utils';
import {createCommonCustomEvent} from './customEvents/EventFactory'; import { createCommonCustomEvent } from './customEvents/EventFactory';
import {getListenersFromTree} from './ListenerGetter'; 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';
// 获取事件触发的普通事件监听方法队列 // 获取事件触发的普通事件监听方法队列
function getCommonListeners( function getCommonListeners(
@ -61,7 +61,7 @@ function getCommonListeners(
vNode, vNode,
customEventName, customEventName,
customEvent, customEvent,
isCapture ? EVENT_TYPE_CAPTURE: EVENT_TYPE_BUBBLE, isCapture ? EVENT_TYPE_CAPTURE : EVENT_TYPE_BUBBLE,
); );
} }
@ -72,7 +72,7 @@ export function processListeners(
processingEventsList.forEach(eventUnitList => { processingEventsList.forEach(eventUnitList => {
let lastVNode; let lastVNode;
eventUnitList.forEach(eventUnit => { eventUnitList.forEach(eventUnit => {
const {vNode, currentTarget, listener, event} = eventUnit; const { vNode, currentTarget, listener, event } = eventUnit;
if (vNode !== lastVNode && event.isPropagationStopped()) { if (vNode !== lastVNode && event.isPropagationStopped()) {
return; return;
} }
@ -151,7 +151,12 @@ function triggerHorizonEvents(
vNode: null | VNode, vNode: null | VNode,
): void { ): void {
const nativeEventTarget = getEventTarget(nativeEvent); const nativeEventTarget = getEventTarget(nativeEvent);
const processingListenerList = getProcessListenersFacade(nativeEvtName, vNode, nativeEvent, nativeEventTarget, isCapture); const processingListenerList = getProcessListenersFacade(
nativeEvtName,
vNode,
nativeEvent,
nativeEventTarget,
isCapture);
// 处理触发的事件队列 // 处理触发的事件队列
processListeners(processingListenerList); processListeners(processingListenerList);

View File

@ -5,10 +5,10 @@ import {CustomBaseEvent} from './customEvents/CustomBaseEvent';
export type AnyNativeEvent = KeyboardEvent | MouseEvent | TouchEvent | UIEvent | Event; export type AnyNativeEvent = KeyboardEvent | MouseEvent | TouchEvent | UIEvent | Event;
export type ListenerUnit = { export type ListenerUnit = {
vNode: null | VNode, vNode: null | VNode;
listener: Function, listener: Function;
currentTarget: EventTarget, currentTarget: EventTarget;
event: CustomBaseEvent, event: CustomBaseEvent;
}; };
export type ListenerUnitList = Array<ListenerUnit>; export type ListenerUnitList = Array<ListenerUnit>;

View File

@ -35,7 +35,8 @@ export const horizonEventToNativeMap = new Map([
['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', 'keydown', 'keyup', 'mousedown', 'mouseup', 'selectionchange']], ['onSelect', ['focusout', 'contextmenu', 'dragend', 'focusin',
'keydown', 'keyup', 'mousedown', 'mouseup', 'selectionchange']],
['onAnimationEnd', [STYLE_AMT_END]], ['onAnimationEnd', [STYLE_AMT_END]],
['onAnimationIteration', [STYLE_AMT_ITERATION]], ['onAnimationIteration', [STYLE_AMT_ITERATION]],

View File

@ -36,7 +36,9 @@ export class CustomBaseEvent {
this.target = target; this.target = target;
this.timeStamp = nativeEvt.timeStamp || Date.now(); this.timeStamp = nativeEvt.timeStamp || Date.now();
const defaultPrevented = nativeEvt.defaultPrevented != null ? nativeEvt.defaultPrevented : nativeEvt.returnValue === false; const defaultPrevented = nativeEvt.defaultPrevented != null ?
nativeEvt.defaultPrevented :
nativeEvt.returnValue === false;
this.defaultPrevented = defaultPrevented; this.defaultPrevented = defaultPrevented;
this.preventDefault = this.preventDefault.bind(this); this.preventDefault = this.preventDefault.bind(this);
@ -90,11 +92,14 @@ function extendAttribute(target, source) {
// FocusEvent // FocusEvent
'relatedTarget', 'relatedTarget',
// KeyboardEvent // KeyboardEvent
'key', 'keyCode', 'charCode', 'code', 'location', 'ctrlKey', 'shiftKey', 'altKey', 'metaKey', 'repeat', 'locale', 'getModifierState', 'clipboardData', 'key', 'keyCode', 'charCode', 'code', 'location', 'ctrlKey', 'shiftKey',
'altKey', 'metaKey', 'repeat', 'locale', 'getModifierState', 'clipboardData',
// MouseEvent // MouseEvent
'button', 'buttons', 'clientX', 'clientY', 'movementX', 'movementY', 'pageX', 'pageY', 'screenX', 'screenY', 'currentTarget', 'button', 'buttons', 'clientX', 'clientY', 'movementX', 'movementY',
'pageX', 'pageY', 'screenX', 'screenY', 'currentTarget',
// PointerEvent // PointerEvent
'pointerId', 'width', 'height', 'pressure', 'tangentialPressure', 'tiltX', 'tiltY', 'twist', 'pointerType', 'isPrimary', 'pointerId', 'width', 'height', 'pressure', 'tangentialPressure',
'tiltX', 'tiltY', 'twist', 'pointerType', 'isPrimary',
// TouchEvent // TouchEvent
'touches', 'targetTouches', 'changedTouches', 'touches', 'targetTouches', 'changedTouches',
// TransitionEvent // TransitionEvent

View File

@ -1,5 +1,5 @@
import type {VNode} from '../Types'; import type { VNode } from '../Types';
import type {Hook} from './HookType'; import type { Hook } from './HookType';
let processingVNode: VNode = null; let processingVNode: VNode = null;
@ -56,7 +56,9 @@ export function getNextHook(hook: Hook<any, any>, hooks: Array<Hook<any, any>>)
// processing中的hook和上一次执行中的hook需要同时往前走 // processing中的hook和上一次执行中的hook需要同时往前走
// 原因1.比对hook的数量有没有变化非必要2.从上一次执行中的hook获取removeEffect // 原因1.比对hook的数量有没有变化非必要2.从上一次执行中的hook获取removeEffect
export function getCurrentHook(): Hook<any, any> { export function getCurrentHook(): Hook<any, any> {
currentHook = currentHook !== null ? getNextHook(currentHook, processingVNode.hooks) : (processingVNode.hooks[0] || null); currentHook = currentHook !== null ?
getNextHook(currentHook, processingVNode.hooks) :
(processingVNode.hooks[0] || null);
if (lastTimeHook !== null) { if (lastTimeHook !== null) {
lastTimeHook = getNextHook(lastTimeHook, processingVNode.oldHooks); lastTimeHook = getNextHook(lastTimeHook, processingVNode.oldHooks);

View File

@ -1,4 +1,4 @@
import type {Hook, Reducer, Trigger, Update} from './HookType'; import type { Hook, Reducer, Trigger, Update } from './HookType';
import { import {
createHook, createHook,
getCurrentHook, getCurrentHook,
@ -8,12 +8,13 @@ import {
import { import {
launchUpdateFromVNode launchUpdateFromVNode
} from '../TreeBuilder'; } from '../TreeBuilder';
import {isSame} from '../utils/compare'; import { isSame } from '../utils/compare';
import {setStateChange} from '../render/FunctionComponent'; import { setStateChange } from '../render/FunctionComponent';
import {getHookStage, HookStage} from './HookStage'; import { getHookStage, HookStage } from './HookStage';
import type {VNode} from '../Types'; import type { VNode } from '../Types';
export function useReducerImpl<S, P, A>(reducer: (S, A) => S, initArg: P, init?: (P) => S, isUseState?: boolean): [S, Trigger<A>] { export function useReducerImpl<S, P, A>(reducer: (S, A) =>
S, initArg: P, init?: (P) => S, isUseState?: boolean): [S, Trigger<A>] {
const stage = getHookStage(); const stage = getHookStage();
if (stage === null) { if (stage === null) {
throwNotInFuncError(); throwNotInFuncError();

View File

@ -2,10 +2,10 @@
* *
*/ */
import type {Container} from '../../dom/DOMOperator'; import type { Container } from '../../dom/DOMOperator';
import type {RefType, VNode} from '../Types'; import type { RefType, VNode } from '../Types';
import {listenToPromise, SuspenseChildStatus} from '../render/SuspenseComponent'; import { listenToPromise, SuspenseChildStatus } from '../render/SuspenseComponent';
import { import {
FunctionComponent, FunctionComponent,
ForwardRef, ForwardRef,
@ -17,8 +17,8 @@ import {
SuspenseComponent, SuspenseComponent,
MemoComponent, MemoComponent,
} from '../vnode/VNodeTags'; } from '../vnode/VNodeTags';
import {FlagUtils, ResetText} from '../vnode/VNodeFlags'; import { FlagUtils, ResetText } from '../vnode/VNodeFlags';
import {mergeDefaultProps} from '../render/LazyComponent'; import { mergeDefaultProps } from '../render/LazyComponent';
import { import {
submitDomUpdate, submitDomUpdate,
clearText, clearText,
@ -29,15 +29,20 @@ import {
unHideDom, unHideDom,
clearContainer, clearContainer,
} from '../../dom/DOMOperator'; } from '../../dom/DOMOperator';
import {callEffectRemove, callUseEffects, callUseLayoutEffectCreate, callUseLayoutEffectRemove} from './HookEffectHandler'; import {
import {handleSubmitError} from '../ErrorHandler'; callEffectRemove,
callUseEffects,
callUseLayoutEffectCreate,
callUseLayoutEffectRemove
} from './HookEffectHandler';
import { handleSubmitError } from '../ErrorHandler';
import { import {
travelVNodeTree, travelVNodeTree,
clearVNode, clearVNode,
isDomVNode, isDomVNode,
findDomParent, getSiblingDom, findDomParent, getSiblingDom,
} from '../vnode/VNodeUtils'; } from '../vnode/VNodeUtils';
import {shouldAutoFocus} from '../../dom/utils/Common'; import { shouldAutoFocus } from '../../dom/utils/Common';
function callComponentWillUnmount(vNode: VNode, instance: any) { function callComponentWillUnmount(vNode: VNode, instance: any) {
try { try {
@ -227,7 +232,7 @@ function unmountNestedVNodes(vNode: VNode): void {
} }
function submitAddition(vNode: VNode): void { function submitAddition(vNode: VNode): void {
const {parent, parentDom} = findDomParent(vNode); const { parent, parentDom } = findDomParent(vNode);
if (parent.flags.ResetText) { if (parent.flags.ResetText) {
// 在insert之前先reset // 在insert之前先reset
@ -244,7 +249,7 @@ function insertOrAppendPlacementNode(
beforeDom: Element | null, beforeDom: Element | null,
parent: Element | Container, parent: Element | Container,
): void { ): void {
const {tag, realNode} = node; const { tag, realNode } = node;
if (isDomVNode(node)) { if (isDomVNode(node)) {
if (beforeDom) { if (beforeDom) {

View File

@ -49,17 +49,17 @@ export class VNode {
// 因为LazyComponent会修改type属性为了在diff中判断是否可以复用需要增加一个lazyType // 因为LazyComponent会修改type属性为了在diff中判断是否可以复用需要增加一个lazyType
lazyType: any = null; lazyType: any = null;
flags: { flags: {
Addition?: boolean, Addition?: boolean;
Update?: boolean, Update?: boolean;
Deletion?: boolean, Deletion?: boolean;
ResetText?: boolean, ResetText?: boolean;
Callback?: boolean, Callback?: boolean;
DidCapture?: boolean, DidCapture?: boolean;
Ref?: boolean, Ref?: boolean;
Snapshot?: boolean, Snapshot?: boolean;
Interrupted?: boolean, Interrupted?: boolean;
ShouldCapture?: boolean, ShouldCapture?: boolean;
ForceUpdate?: boolean, ForceUpdate?: boolean;
} = {}; } = {};
// one tree相关属性 // one tree相关属性

View File

@ -19,7 +19,8 @@ export const ShouldCapture = 'ShouldCapture';
// For suspense // For suspense
export const ForceUpdate = 'ForceUpdate'; export const ForceUpdate = 'ForceUpdate';
const FlagArr = [Addition, Update, Deletion, ResetText, Callback, DidCapture, Ref, Snapshot, Interrupted, ShouldCapture, ForceUpdate]; const FlagArr = [Addition, Update, Deletion, ResetText, Callback,
DidCapture, Ref, Snapshot, Interrupted, ShouldCapture, ForceUpdate];
const LifecycleEffectArr = [Update, Callback, Ref, Snapshot]; const LifecycleEffectArr = [Update, Callback, Ref, Snapshot];