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