Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript react中的事件池是什么?_Javascript_Reactjs - Fatal编程技术网

Javascript react中的事件池是什么?

Javascript react中的事件池是什么?,javascript,reactjs,Javascript,Reactjs,该事件是合并的。这意味着将重用SyntheticEvent对象,并且在调用事件回调后,所有属性都将为空。这是出于性能原因。因此,您不能以异步方式访问事件 请参阅:这意味着事件的属性仅在回调处于活动状态时存在。将异步添加到混合或存储事件以供将来使用将失败 如果在事件处理程序中尝试console.log(event),很容易观察到这一点。在检查对象时,事件对象上的大多数属性都将null。如果使用调试器停止脚本的执行记录值后,可以立即检查值 class MyComponent extends Reac

该事件是合并的。这意味着将重用SyntheticEvent对象,并且在调用事件回调后,所有属性都将为空。这是出于性能原因。因此,您不能以异步方式访问事件


请参阅:

这意味着事件的属性仅在回调处于活动状态时存在。将异步添加到混合或存储事件以供将来使用将失败

如果在事件处理程序中尝试
console.log(event)
,很容易观察到这一点。在检查对象时,事件对象上的大多数属性都将
null
。如果使用
调试器停止脚本的执行记录值后,可以立即检查值

class MyComponent extends React.Component {
    handleClick (e){
    console.log('The event currentTarget is', e.currentTarget); // DOM element
    setTimeout(() => {
    console.log('event.currentTarget was', e.currentTarget); // null
  }, 1000)
  }
  render () {
    return <button onClick={this.handleClick}>Fire event!</button>
  }
}
类MyComponent扩展了React.Component{ handleClick(e){ log('event currentTarget为',e.currentTarget);//DOM元素 设置超时(()=>{ console.log('event.currentTarget was',e.currentTarget);//null }, 1000) } 渲染(){ 还击事件! } }

当您单击按钮时,这将记录DOM元素,并在一秒钟后记录
null
。出于我无法理解的原因,
event.target仍然存储,直到下一个事件发生,并且不会被取消。

事件池- React使用SyntheticEvent,这是本机浏览器事件的包装器,因此它们在不同浏览器中具有一致的属性。我们在任何react应用程序中拥有的事件处理程序实际上都是SyntheticEvent的传递实例,除非我们使用nativeEvent属性来获取底层浏览器事件

包装本机事件实例可能会导致性能问题,因为创建的每个合成事件包装器也需要在某个时候进行垃圾收集,这在CPU时间方面可能非常昂贵


React通过分配一个合成实例池来处理此问题。无论何时触发事件,它都会从池中获取一个实例并填充其属性并重用它。当事件处理程序完成运行时,所有属性都将为空,合成事件实例将释放回池中。因此,要提高性能。

请注意,React 17中已删除
事件池,原因如下

React 17从React中删除“事件池”优化。它不能提高现代浏览器的性能,甚至会让经验丰富的React用户感到困惑


答案似乎在这段引文中……但我无法理解。对于像我这样的新手来说,这个语句难道不能更容易理解吗?这意味着当需要一个SyntheticEvent对象时,系统会重用一个旧对象,而不是创建一个新对象。如果您不理解它对异步操作的说明,您应该阅读一些关于异步功能的一般教程,然后将这些知识应用到这个特定主题中。您可以将
事件
对象中所需的属性指定给局部变量,然后使用闭包。“将异步添加到混合将失败”。是的,它失败了,但是为什么,你能解释一下吗?这是对React事件池的一个很好的解释。React会自动使事件实例无效吗?我们什么时候可以确定事件处理程序已完成运行?回答请…一个很好的解释合成事件和事件池!我只想补充一点,因为React 17事件池已被删除,因为它不能提高现代浏览器的性能