本文目录

React 事件机制

🌙
手机阅读
本文目录结构

问题

React 事件机制

答案

React 其实⾃⼰实现了⼀套事件机制,⾸先我们考虑⼀下以下代码

const Test = ({ list, handleClick }) => ({
    list.map((item, index) => (
        <span onClick={handleClick} key={index}>{index}</span>
    ))
})
``

以上类似代码想必⼤家经常会写到,但是你是否考虑过点击事件是否绑定在了每⼀个标签
上?事实当然不是, JSX 上写的事件并没有绑定在对应的真实  DOM 上,⽽是通过事件
代理的⽅式,将所有的事件都统⼀绑定在了  document 上。这样的⽅式不仅减少了内存消
耗,还能在组件挂载销毁时统⼀订阅和移除事件。

另外冒泡到  document 上的事件也不是原⽣浏览器事件,⽽是  React ⾃⼰实现的合成
事件( SyntheticEvent )。因此我们如果不想要事件冒泡的话,调⽤
event.stopPropagation 是⽆效的,⽽应该调⽤  event.preventDefault

那么实现合成事件的⽬的是什么呢?总的来说在我看来好处有两点,分别是:


1. 合成事件⾸先抹平了浏览器之间的兼容问题,另外这是⼀个跨浏览器原⽣事件包装器,赋
予了跨浏览器开发的能⼒

2. 对于原⽣浏览器事件来说,浏览器会给监听器创建⼀个事件对象。如果你有很多的事件监
听,那么就需要分配很多的事件对象,造成⾼额的内存分配问题。但是对于合成事件来
说,有⼀个事件池专⻔来管理它们的创建和销毁,当事件需要被使⽤时,就会从池⼦中复
⽤对象,事件回调结束后,就会销毁事件对象上的属性,从⽽便于下次复⽤事件对象。

## 更多面试题

如果你想了解更多的前端面试题,可以查看本站的[WEB前端面试题](/edu/ask.html) ,这里基本包涵了市场上的所有前端方面的面试题,也有一些大公司的面试图,可以让你面试更加顺利。


<table class="reference">
    <tbody>
        <tr>
            <th colspan="3">面试题</th>
        </tr>
        <tr>
            <td> <a href="/map/html-focus.html">HTML</a></a></td>
            <td> <a href="/map/css-focus.html">CSS</a></td>
            <td> <a href="/map/js-focus.html">JavaScript</a></td>
        </tr>
        <tr>
            <td> <a href="/map/jquery-focus.html">jQuery</a></td>
            <td> <a href="/map/vue-focus.html">Vue.js</a></td>
            <td> <a href="/map/react-focus.html">React</a></td>
        </tr>
        <tr>
            <td> <a href="/map/logic-focus.html">算法</a></td>
            <td> <a href="/map/ajax-focus.html">HTTP</a></td>
            <td> <a href="/map/babel-focus.html">Babel</a></td>
        </tr>
        <tr>
            <td> <a href="/map/bootstrap-focus.html">BootStrap</a></td>
            <td> <a href="/map/electron-focus.html">Electron</a></td>
            <td> <a href="/map/gulp-focus.html">Gulp</a></td>
        </tr>
        <tr>
            <td> <a href="/map/nodejs-focus.html">Node.js</a></td>
            <td> <a href="/map/other-focus.html">前端经验相关</a></td>
            <td> <a href="/map/web-focus.html">前端综合</a></td>
        </tr>
        <tr>
            <td> <a href="/map/webpack-focus.html">Webpack</a></td>
            <td> <a href="/map/wechat-focus.html">微信小程序</a></td>
            <td> - </td>
        </tr>
      </tbody>
</table>

这些题库还在更新中,如果你有不错的面试题库欢迎分享给我,我整理后放上来;人人为我,我为人人,互帮互助,共同提高,祝大家都拿到心仪的Offer!

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了