hello world欢迎来到前端的新世界
😜当前文章系列专栏:前端面试
🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
💖感谢大家支持!您的观看就是作者创作的动力
为了解决跨浏览器兼容性问题,React 会将浏览器原生事件(Browser Native Event)封装为合成事件(SyntheticEvent)传入设置的事件处理器中。这里的合成事件提供了与原生事件相同的接口,不过它们屏蔽了底层浏览器的细节差异,保证了行为的一致性。另外有意思的是,React 并没有直接将事件附着到子元素上,而是以单一事件监听器的方式将所有的事件发送到顶层进行处理。这样 React 在更新 DOM 的时候就不需要考虑如何去处理附着在 DOM 上的事件监听器,最终达到优化性能的目的
React 17 之前的事件冒泡流程图

所以这就造成了,在一个页面中,只能有一个版本的 React。如果有多个版本,事件就乱套了。值得一提的是,这个问题在 React 17 中得到了解决,事件委托不再挂在 document 上,而是挂在 DOM 容器上,也就是 ReactDom.Render 所调用的节点上。
React 17 后的事件冒泡流程图

那到底哪些事件会被捕获生成合成事件呢?可以从 React 的源码测试文件中一探究竟。下面的测试快照中罗列了大量的事件名,也只有在这份快照中的事件,才会被捕获生成合成事件。
// react/packages/react-dom/src/__tests__/__snapshots__/ReactTestUtils-test.js.snap
Array [
"abort",
"animationEnd",
"animationIteration",
"animationStart",
"auxClick",
"beforeInput",
"blur",
"canPlay",
"canPlayThrough",
"cancel",
"change",
"click",
"close",
"compositionEnd",
"compositionStart",
"compositionUpdate",
"contextMenu",
"copy",
"cut",
"doubleClick",
"drag",
"dragEnd",
"dragEnter",
"dragExit",
"dragLeave",
"dragOver",
"dragStart",
"drop",
"durationChange",
"emptied",
"encrypted",
"ended",
"error",
"focus",
"gotPointerCapture",
"input",
"invalid",
"keyDown",
"keyPress",
"keyUp",
"load",
"loadStart",
"loadedData",
"loadedMetadata",
"lostPointerCapture",
"mouseDown",
"mouseEnter",
"mouseLeave",
"mouseMove",
"mouseOut",
"mouseOver",
"mouseUp",
"paste",
"pause",
"play",
"playing",
"pointerCancel",
"pointerDown",
"pointerEnter",
"pointerLeave",
"pointerMove",
"pointerOut",
"pointerOver",
"pointerUp",
"progress",
"rateChange",
"reset",
"scroll",
"seeked",
"seeking",
"select",
"stalled",
"submit",
"suspend",
"timeUpdate",
"toggle",
"touchCancel",
"touchEnd",
"touchMove",
"touchStart",
"transitionEnd",
"volumeChange",
"waiting",
"wheel",
]
如果DOM上绑定了过多的事件处理函数,整个页面响应以及内存占用可能都会受到影响。React为了避免这类DOM事件滥用,同时屏蔽底层不同浏览器之间的事件系统的差异,实现了一个中间层 - SyntheticEvent

为何要合成事件
HTTP 0.9
HTTP 1.0
HTTP 1.1
http1.x版本问题
HTTP 2.0
| 特点 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| 并发请求 | 不支持 | 支持有限 | 引入多路复用,支持更高级别并发请求 | 引入QUIC协议,通过多路复用和UDP传输支持更高级别的并发请求 |
| 请求头压缩 | 不支持 | 支持有限 | HPACK算法压缩 | QPACK算法压缩 |
| 二进制转换 | 不支持 | 不支持 | 支持 | 支持 |
| 服务器推送 | 不支持 | 不支持 | 支持,服务器可以主动推送资源给客户端 | 支持,服务器可以主动推送资源给客户端 |
| 连接复用 | 不支持 | 持久连接 | 多路复用,多个请求可以通过单个连接表并行处理 | 多路复用,多个请求可以通过单个连接表并行处理 |
| 安全性 | 不支持 | HTTPS,支持加密传递 | HTTPS,支持加密传递 | HTTPS,支持加密传递 |
| 可靠性 | 不支持 | 不支持 | 支持头部压缩,流控制和服务器推送,可靠性强 | QUIC协议,通过UDP传输提升传输的可靠性 |
| 开发复杂性 | 简单 | 友好 | 新概念和协议,相对复杂 | QUIC协议,相对负责 |
| 底层协议 | tcp | tcp | TCP和TCS的加密传递 | QUIC |
| 对丢包和延迟的影响力 | 恢复较慢,容易堵塞 | 恢复较快,使用流方式并行处理请求 | 恢复较快,使用流方式并行处理请求 | 恢复较快,QUIC通过UDP传输有利于降低延迟和丢包的影响 |
| 适用场景 | 静态Web页面和静态资源 | 大多数Web应用程序 | 复杂Web应用程序 | 更为复杂Web应用程序 |
1xx(信息性状态码):表示请求已被接受,需要继续处理。
2xx(成功状态码):表示请求被成功接收、理解、接受或处理。
3xx(重定向状态码):表示需要进行更多操作才能完成请求。
4xx(客户端错误状态码):表示客户端发送的请求有误。
5xx(服务器错误状态码):表示服务器无法完成明显有效的请求。
我们可以根据http状态码返回的code来迅速定位到我们项目中是发生了什么问题。方便我们调试程序中出现的bug
创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力