React事件

Event Handler ----React事件

React中的事件包括合成事件和原生事件,React底层对合成事件进行事件委派和手动绑定,原生事件的使用在高程3有具体讲解,难点在于跨浏览器兼容和DOM0/DOM2级事件处理程序的使用方法不同,这可以通过编写工具函数屏蔽浏览器差异,关于原生事件的描述在《Event Handler 事件处理程序 1》《Event Handler 事件处理程序 2》中有详细解释。

合成事件:事件委派

React不会把事件处理函数直接绑定到真实的节点上,而是把所有事件绑定到最外层,使用一个统一的事件监听器,这个事件监听器上维持了一个映射来保存所有组件内部的事件监听和函数。当组件挂载或者卸载时,只是在这个统一的事件监听器上插入或者删除一些对象;当事件发生时,首先被这个统一的事件监听器处理,然后在映射里找到真正的事件处理函数并调用。这简化了事件处理和回收机制,效率也有很大提升。

合成事件:手动绑定

使用class或者纯函数创建组件时,this不会自动绑定,需要手动绑定:
1)bind方法,可以传递参数;
//在button上绑定事件处理函数,类似于DOM0级事件绑定

    return <button onClick = {this.handleClick.bind(this,’test’)}> Test </button>

2)在class的构造函数constructor内部完成this绑定,仅需要一次绑定;

    this.handleClick = this.handleClick.bind(this);

这是我目前常用的方法,一般在super(props)后面。

3)在组件内部创建时间通过箭头函数创建事件处理程序以实现绑定,由于箭头函数自动绑定了定义此函数作用域的this,不需要再使用bind方法。

    class App extends Component{
        const handle(e) = (e) =>{console.log(e);};
        render(){
        return <button onClick = {this.handleClick}> Test </button>;
        }
    }

在React中使用原生事件

在React中使用原生事件DOM2级事件:addEventListener()和removeEventListener()。为什么使用原生事件?因为有些时候需要将事件绑定在组件的父级元素上。在React中一般在componentDidMount之后调用原生事件,这时DOM节点已经确定。一定要在组件卸载时(componentWillUnmount)手动解除绑定,不然内存就会泄露。合成事件系统不需要这样,React已经妥善处理了这一点(怎么处理的?)。

对比React事件和JavaScript原生事件(DOM2级事件)

JavaScript原生事件传播有事件捕获、事件冒泡两个先后的过程,分别是由外到内和由内到外,事件捕获并不是一个通用的技术,在低于IE9版本的浏览器中无法使用。而且IE浏览器的事件处理机制和其他浏览器不同,通过原生JavaScript实现的通用事件处理程序中一般使用if else语句对浏览器差异性进行屏蔽。React的合成事件实现中,仅仅对最外层容器进行绑定,并且依赖事件冒泡完成事件委派,避免了事件捕获的浏览器不兼容特性。

最好避免同时使用原生事件和合成事件,混用时由于合成事件机制将事件绑定在了最外层,对内层组件上的事件处理函数使用e.preventDefault()无法阻止事件默认操作,因为事件不知道自身绑定在内部组件上。最好的方法是不混用合成事件和原生事件,或者混用时通过在if语句中使用e.target判断事件的直接绑定元素是不是内部组件。

本文转载于:猿2048?https://www.mk2048.com/blog/blog.php?id=hhi100ka2ib

原文地址:https://www.cnblogs.com/baimeishaoxia/p/12546050.html

时间: 2024-08-29 13:52:14

React事件的相关文章

React事件绑定总结

需要绑定的原因 ................................................................................................... 事件绑定目的,就是事件的作用域的转移. 问题是,react生成出来的组件,this还不能指向自身吗? <button onClick={this.plus}>plus</button> plus函数上的this,是事件响应时的上下文(window),并不是当前组件实例!

源码看React 事件机制

对React熟悉的同学都知道,React中的事件机制并不是原生的那一套,事件没有绑定在原生DOM上,发出的事件也是对原生事件的包装.那么这一切是怎么实现的呢? 事件注册 首先还是看我们熟悉的代码 <button onClick={this.autoFocus}>点击聚焦</button> 这是我们在React中绑定事件的常规写法.经由JSX解析,button会被当做组件挂载.而onClick这时候也只是一个普通的props.ReactDOMComponent在进行组件加载(moun

React 事件对象、键盘事件、表单事件、ref获取dom节点、react实现类似Vue双向数据绑定

1.案例实现代码 import React, { Component } from 'react'; /** * 事件对象.键盘事件.表单事件.ref获取dom节点.react实现类似Vue双向数据绑定 * 事件对象: 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件有关的信息 * 表单事件: 获取表单的值 * 1.监听表单的改变事件 ---onChange * 2.在改变的事件里面获取表单输入的值 ---event * 3.把表单输入的值赋值给username

React事件机制-事件分发

事件分发 之前讲述了事件如何绑定在document上,那么具体事件触发的时候是如何分发到具体的监听者呢?我们接着上次注册的事件代理看.当我点击update counter按钮时,触发注册的click事件代理. function dispatchInteractiveEvent(topLevelType, nativeEvent) { interactiveUpdates(dispatchEvent, topLevelType, nativeEvent); } function interacti

React事件属性

一.简介 二.滚动例子,滚动改变颜色 1 <!DOCTYPE html> 2 <html lang="zh-cn"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>React涓殑浜嬩欢</title> 6 </head> 7 <body> 8 <script src="./react-0.13.2/react-0.

React事件函数简介

一.事件汇总 二.例子 1 <!DOCTYPE html> 2 <html lang="zh-cn"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>React涓殑浜嬩欢</title> 6 </head> 7 <body> 8 <script src="./react-0.13.2/react-0.13.2/bu

react事件代理

参考:https://github.com/youngwind/blog/issues/107 首先回顾以下原生事件的两个方法:event.stopImmediatePropagation 和 event.stopPropagation ,前者可以阻止同一dom上的后续事件的执行以及阻止冒泡,后者仅能阻止冒泡. 测试如下: 默认情况下点击内部的div,会依次显示inner click1.inner click2.root click,这是因为以下事件是绑定在了冒泡阶段 <div id="r

自己写的一个React事件流处理框架

这个框架是在开始学习React的时候写的,当时主要是觉得Redux的事件流过于复杂,以及考虑到在多层的props的传递中的代码复杂度的问题,尝试着完成了这样一个框架,通过维护一个全局的数据管理器管理storage来部分替代Redux的使用,将storage中的数据直接映射到组件的state中.具体代码和示例可以见我的GitHub:https://github.com/alexxyzeng/easy-react-router-4 本框架主要解决ReactJS View层事件逻辑过多和多层组件之间父

React事件方法、React定义方法的几种方式、获取数据、改变数据、执行方法传值

1.案例实现代码如下 import React, { Component } from 'react'; /** * 特别注意this,对于传值和绑定都十分重要 */ class Home4 extends Component{ constructor(props){ super(props); //定义数据 this.state={ msg:'这是一个Home4组件', name:"杨杰" } this.getMessage = this.getMessage.bind(this);