当前位置: 首页 > Web前端 > HTML

React事件

时间:2023-04-02 16:34:10 HTML

EventHandler----React事件React中的事件包括合成事件和原生事件。React底层对合成事件进行事件委托和手动绑定。nativeevents的使用在Elevation3中有详细的解释,难点在于Cross-browsercompatibility和DOM0/DOM2-leveleventhandlers的使用不同。这可以通过编写工具函数来屏蔽浏览器差异。在《Event Handler 事件处理程序 1》和《Event Handler 事件处理程序 2》中详细解释了原生事件的描述。合成事件:事件委托React并没有直接将事件处理程序绑定到真实节点,而是将所有事件绑定到最外层,使用统一的事件监听器,它维护一个映射来保存所有组件内部的事件监听器和函数。当一个组件被挂载或卸载时,它只是在这个统一的事件监听器上插入或删除一些对象;当一个事件发生时,首先被这个统一的事件监听器处理,然后在映射中找到真正的事件处理函数并调用它。这简化了事件处理和回收机制,大大提高了效率。合成事件:手动绑定使用类或者纯函数创建组件时,this不会自动绑定,需要手动绑定:1)bind方法,可以传递参数;//在按钮上绑定事件处理函数,类似于DOM0Level事件绑定returnTest2)在类,只需要一个绑定;这个.handleClick=this.handleClick.bind(this);这是我目前的方法,通常在super(props)后面。3)通过箭头函数创建事件处理器,实现组件内部创建时的绑定。由于箭头函数会自动绑定定义此函数作用域的this,因此无需使用bind方法。类App扩展组件{consthandle(e)=(e)=>{console.log(e);};render(){return测试;在React中使用原生事件在React中使用原生事件DOM2级别的事件:addEventListener()和removeEventListener()。为什么要使用原生事件?因为有时候需要给组件的父元素绑定事件。在React中,原生事件一般在componentDidMount之后,DOM节点已经确定的时候调用。组件卸载时一定要手动解除绑定(componentWillUnmount),否则内存会泄露。合成事件系统不需要这个,React已经优雅地处理了这个(如何?)。React事件和JavaScript原生事件(DOM2级别事件)对比JavaScript原生事件传播有事件捕获和事件冒泡两个连续的过程,分别是从外到内和从内到外。事件捕获不是一般的技术。不能在IE9以下的浏览器中使用。而且,IE浏览器的事件处理机制与其他浏览器不同。通常,原生JavaScript实现的通用事件处理程序中会使用ifelse语句来屏蔽浏览器差异。React的合成事件实现只绑定最外层的容器,依靠事件冒泡完成事件委托,避免了浏览器对事件捕获的不兼容。最好避免同时使用原生事件和合成事件。混合使用时,由于合成事件机制将事件绑定到最外层,在内部组件上的事件处理程序上使用e.preventDefault()无法阻止事件的默认操作,因为事件不知道自己绑定在内部成分。最好的办法是不要把合成事件和原生事件混在一起,或者在if语句中使用e.target来判断事件的直接绑定元素是否是内部组件。