React源码 - 事件系统( 二 )

1. 将事件绑定到 container 元素 ReactDOM.render(element, container, callback)
2. 事件的捕获和冒泡

1.事件绑定过程
绑定事件的开始方法为 ReactDOMRoot.js 的 createRootImpl 方法, 在创建 FiberRoot 和 RootFiber 对象后,创建事件
在这里插入图片描述
enableEagerRootListeners 默认为 true, 解决了 ReactDOM.createPortal 创建的 container 事件 bug
https://github.com/facebook/react/pull/19659
https://github.com/facebook/react/issues/19608

将 allNativeEvents 中所有的事件调用 listenToNativeEvent,nonDelegatedEvents 事件没有冒泡阶段 ( 媒体事件等 )
在这里插入图片描述
listenToNativeEvent 事件中,如果事件名为 selectionchange 时,将事件绑定到 Document 元素
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
addTrappedEventListener
在这里插入图片描述
createEventListenerWrapperWithPriority 根据 Priority 创建不同的 listenerWrapper
在这里插入图片描述
在这里插入图片描述
addEventCaptureListener 方法通过 node.addEventListener注册事件,并返回 listener,冒泡阶段时,调用 addEventBubbleListener方法
在这里插入图片描述
2.事件的捕获和冒泡
DiscreteEvent 触发 dispatchDiscreteEvent事件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
accumulateSinglePhaseListeners 函数中通过 Fiber 树收集了 Fiber 树中注册的事件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
processDispatchQueueItemsInOrder 函数中对 Listeners 进行遍历,根据 inCapturePhase 的值顺序和倒序遍历 Listeners,模拟了浏览器的捕获和冒泡过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
func.apply 实际是调用 绑定事件函数,funcArgs 参数包含 React 包装过的 event 事件对象
在这里插入图片描述

//变量
allNativeEvents
allNativeEvents 为 EventRegistry.js 导出的变量
在这里插入图片描述
在 DOMPluginEventSystem 中对 allNativeEvents 进行了值的更改
在这里插入图片描述
在这里插入图片描述
注册三种优先级的事件, DiscreteEvent = 0, UserBlockingEvent = 1, ContinuousEvent = 2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
setEventPriorities 函数
在这里插入图片描述
EnterLeaveEventPlugin.registerEvents()
在这里插入图片描述
ChangeEventPlugin.registerEvents()
在这里插入图片描述
SelectEventPlugin.registerEvents()
在这里插入图片描述
BeforeInputEventPlugin.registerEvents()
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值