Skip to content

03.事件名注册

packages/react-dom-bindings/src/events/DOMPluginEventSystem.js

js
import { allNativeEvents } from './EventRegistry';
import * as SimpleEventPlugin from './plugins/SimpleEventPlugin';
SimpleEventPlugin.registerEvents();
export function listenToAllSupportedEvents(rootContainerElement) {

}

packages/react-dom-bindings/src/events/plugins/SimpleEventPlugin.js

js
import { registerSimpleEvents } from '../DOMEventProperties';
export { registerSimpleEvents as registerEvents }

packages/react-dom-bindings/src/events/DOMEventProperties.js

js
// 导入 EventRegistry 模块中的 registerTwoPhaseEvent 函数
import { registerTwoPhaseEvent } from './EventRegistry';

// 定义一个包含 'click' 的事件数组
const simpleEventPluginEvents = ['click'];

// 创建一个新的 Map 对象,用来存储顶层事件名到 React 事件名的映射
export const topLevelEventsToReactNames = new Map();

/**
 * 注册简单事件
 *
 * @param {string} domEventName DOM事件名称
 * @param {string} reactName React事件名称
 */
function registerSimpleEvent(domEventName, reactName) {
  // 在 Map 对象中设置 domEventName 和 reactName 的映射关系
  topLevelEventsToReactNames.set(domEventName, reactName);

  // 调用 registerTwoPhaseEvent 函数,注册为两阶段事件
  registerTwoPhaseEvent(reactName, [domEventName]);
}

/**
 * 注册简单事件数组中的所有事件
 */
export function registerSimpleEvents() {
  // 遍历 simpleEventPluginEvents 数组
  for (let i = 0; i < simpleEventPluginEvents.length; i++) {
    // 获取数组中的每个事件名
    const eventName = simpleEventPluginEvents[i];
    
    // 转换事件名为小写,得到 domEventName
    const domEventName = eventName.toLowerCase();
    
    // 将事件名的首字母转换为大写,得到 capitalizeEvent
    const capitalizeEvent = eventName[0].toUpperCase() + eventName.slice(1);

    // 调用 registerSimpleEvent 函数,注册该事件
    // 其中,reactName 是 'on' 加上 capitalizeEvent
    registerSimpleEvent(domEventName, `on${capitalizeEvent}`);
  }
}

packages/react-dom-bindings/src/events/EventRegistry.js

js
/**
 * 创建一个 Set 来存储所有的原生事件
 */
export const allNativeEvents = new Set();

/**
 * 注册一个两阶段的事件(包括捕获和冒泡阶段)
 * 
 * @param {string} registrationName - 注册的事件名称
 * @param {Array<string>} dependencies - 事件依赖的其他事件的名称的数组
 */
export function registerTwoPhaseEvent(registrationName, dependencies) {
  // 直接注册事件(可能是冒泡阶段的)
  registerDirectEvent(registrationName, dependencies);
  
  // 注册捕获阶段的事件
  // 通过在事件名称后添加 'Capture' 后缀来区分
  registerDirectEvent(registrationName + 'Capture', dependencies);
}

/**
 * 直接注册事件(包括冒泡或捕获阶段)
 * 
 * @param {string} registrationName - 注册的事件名称
 * @param {Array<string>} dependencies - 事件依赖的其他事件的名称的数组
 */
export function registerDirectEvent(registrationName, dependencies) {
  // 遍历依赖事件数组
  for (let i = 0; i < dependencies.length; i++) {
    // 将每个依赖事件添加到 allNativeEvents Set 中
    allNativeEvents.add(dependencies[i]);
  }
}

基于 VitePress 构建