Copy Link

React Learning Day 2: Events

Native Events

原生DOM上的事件被稱為原生事件,正式名稱為”Native Events”。Native Event在不同平台的處理機制存在差異。

Event Delegation

React不會直接管理Native Event,React通過事件委託來管理事件。React會附加事件監聽器到App Root元素,React通過Native Event的DOM樹中的冒泡來觸發React設置在App Root上的事件以模擬Capture和Bubing。

Synthetic Event

React提供了統一的事件API來消除不同平台的事件實現差異(註冊、合成、派發、冒泡)以實現跨平台的模擬原生DOM事件的能力。這套事件機制被稱為SyntheticEvent。

interface BaseSyntheticEvent<E = object, C = any, T = any> {
    nativeEvent: E;
    currentTarget: C;
    target: T;
    bubbles: boolean;
    cancelable: boolean;
    defaultPrevented: boolean;
    eventPhase: number;
    isTrusted: boolean;
    preventDefault(): void;
    isDefaultPrevented(): boolean;
    stopPropagation(): void;
    isPropagationStopped(): boolean;
    persist(): void;
    timeStamp: number;
    type: string;
}

interface SyntheticEvent<
    T = Element, 
    E = Event
> extends BaseSyntheticEvent<
    E, EventTarget & T, 
    EventTarget
> {}

React提供了如下事件類型:

type EventHandler<E extends SyntheticEvent<any>> = { bivarianceHack(event: E): void }["bivarianceHack"]

type ReactEventHandler<T = Element> = EventHandler<SyntheticEvent<T>>

type ClipboardEventHandler<T = Element> = EventHandler<ClipboardEvent<T>>
type CompositionEventHandler<T = Element> = EventHandler<CompositionEvent<T>>
type DragEventHandler<T = Element> = EventHandler<DragEvent<T>>
type FocusEventHandler<T = Element> = EventHandler<FocusEvent<T>>
type FormEventHandler<T = Element> = EventHandler<FormEvent<T>>
type ChangeEventHandler<T = Element> = EventHandler<ChangeEvent<T>>
type InputEventHandler<T = Element> = EventHandler<InputEvent<T>>
type KeyboardEventHandler<T = Element> = EventHandler<KeyboardEvent<T>>
type MouseEventHandler<T = Element> = EventHandler<MouseEvent<T>>
type TouchEventHandler<T = Element> = EventHandler<TouchEvent<T>>
type PointerEventHandler<T = Element> = EventHandler<PointerEvent<T>>
type UIEventHandler<T = Element> = EventHandler<UIEvent<T>>
type WheelEventHandler<T = Element> = EventHandler<WheelEvent<T>>
type AnimationEventHandler<T = Element> = EventHandler<AnimationEvent<T>>
type ToggleEventHandler<T = Element> = EventHandler<ToggleEvent<T>>
type TransitionEventHandler<T = Element> = EventHandler<TransitionEvent<T>>

以onClick為例。React為click編寫了一個合成事件,名叫onClick,其類型為MouseEventHandler:

const handleClick: MouseEventHandler<HTMLButtonElement> = (e: MouseEvent<HTMLButtonElement>) => {
    console.log(e.currentTarget, `clicked.`)
}
return (
    <button onClick={handleClick}>Click me</button>
)

執行順序

這張圖片展示了React事件的執行順序