Match-id-259d63c38e96411eb0a34820b390f5265864e64e
This commit is contained in:
commit
c9948e796f
|
@ -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 设置属性
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
|
@ -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]],
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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相关属性
|
||||||
|
|
|
@ -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];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue