React中事件分类

React中事件绑定分为两种:

1.直接添加在React元素上的事件,这是React在基于Virtual DOM的基础上实现的符合w3c规范的合成事件(SyntheticEvent),这种情况下React内部会在组件销毁前自行对事件进行解绑;

2.JS原生事件事件(利用ref获取原生元素),这种情况下需要我们手动对事件进行解绑。

本文主要对第二种情况进行介绍。

React中何时进行事件绑定与解绑

事件绑定在React的componentDidMount生命周期函数中进行,解绑在componentWillUnmount生命周期函数中进行。

为什么要解除绑定的事件

一般来说事件解绑为了节约内存或者防止内存泄漏,或者业务逻辑的需要。

React中事件处理需要注意的事项

1.不要把原生事件和React的合成事件混淆在一起使用,详情看这篇文章 https://segmentfault.com/a/1190000008782645 (这篇文章有个错误点要注意,removeEventListener的第二个参数是必须的,不能不传,这跟jQuery的事件解绑是不同的!!!)。

2.使用addEventListener进行事件绑定的时候不要传入匿名函数作为回调,因为你绑定和解绑的时候看起来一样的匿名函数其实不是一个,它们的地址是不同的,这是一个很容易踩的坑。

class Demo extends React.Component{
constructor(props){
super(props);
this.state = {
visible : true
}
this.handleClick = this.handleClick.bind(this); //绑定和解绑的回调函数是实例的同一个方法
}
componentDidMount(){
document.body.addEventListener('click', this.handleClick); //如果在这里绑定回调函数的this指向,其实就产生了传入匿名函数作为回调一样的问题
}
componentWillUnmount(){
document.body.removeEventListener('click', this.handleClick); //如果在这里绑定回调函数的this指向,其实就产生了传入匿名函数作为回调一样的问题
}
handleClick(){
this.setState((prevState, props) =>{
visible : !prevState.visible
})
}
render(
...此处省略
)
}

 

React事件绑定与解绑的更多相关文章

  1. 兼容8事件绑定与解绑addEventListener、removeEventListener和ie的attachEvent、detachEvent

    兼容8事件绑定与解绑addEventListener.removeEventListener和ie的attachEvent.detachEvent   ;(function(){ // 事件绑定 bi ...

  2. jQuery事件绑定、解绑、命名空间

    jQuery事件绑定.解绑.命名空间 <%@ page language="java" import="java.util.*" pageEncoding ...

  3. jQuery事件绑定,解绑,触发

    事件绑定 1.bind(type,[data],fn) --type: 含有一个或多个事件类型的字符串,由空格分隔多个事件.比如"click"或"submit" ...

  4. jquery中的DOM事件绑定与解绑

    在jquery事件中有时候有的事件只需要在绑定后有效触发一次,当通过e.target判断触发条件有效触发后解除绑定事件,来避免多次无效触发和与未知情况造成冲突. 这时候就要用到了jquery中的事件绑 ...

  5. jQuery 学习笔记(5)(事件绑定与解绑、事件冒泡与事件默认行为、事件的自动触发、自定义事件、事件命名空间、事件委托、移入移出事件)

    1.事件绑定: .eventName(fn) //编码效率略高,但部分事件jQuery没有实现 .on(eventName, fn) //编码效率略低,所有事件均可以添加 注意点:可以同时添加多个相同 ...

  6. jQuery之_事件绑定与解绑

    使用jQuery实现事件的绑定和解绑 就是所谓的事件操作. 1. 事件绑定(2种): * eventName(function(){}) 绑定对应事件名的监听, 例如:$('#div').click( ...

  7. jQuery-3.事件篇---事件绑定与解绑

    on()的多事件绑定 之前学的鼠标事件,表单事件与键盘事件都有个特点,就是直接给元素绑定一个处理函数,所有这类事件都是属于快捷处理.翻开源码其实可以看到,所有的快捷事件在底层的处理都是通过一个&quo ...

  8. jquery中事件重复绑定以及解绑问题

    一般的情况下,对于这种情况,我们常规的思路是,先解绑,再绑定,如下: $(selector).unbind('click').bind('click',function(){....}); 当这样会有 ...

  9. Vue学习之--------组件自定义事件(绑定、解绑)(2022/8/21)

    文章目录 1.基础知识 2.代码实例 2.1 App.vue 2.2 school.vue 2.3 student.vue 3.测试效果(略) 4.实际应用(在组件化编码实战三的基础上改进) 4.1 ...

随机推荐

  1. 使用Nome监控服务器各项指标

    使用Nome监控服务器各项指标     关于Nome的使用:         1)如何将nome压缩文件上传到服务器是,首选需要将压缩包下载到本地             a.创建文件夹Nome:mk ...

  2. JS 超类和子类

    此篇由别的大神的博客与<javascript高级程序设计>一书整理而来 原博客地址:https://hyj1254.iteye.com/blog/628555 看到javascript高级 ...

  3. js判重

    1.两个数组,取出不重复的部分 var arr=[1,2,3]; var arr1=[1,2]; vat tmp=[]; for(let i in arr1){ if(!(arr.includes(a ...

  4. redhat 7 配置源

    http://blog.51cto.com/eagle2014/1434305 一.准备工作 Vmware Workstation 10.0虚拟机软件(http://www.vmware.com/pr ...

  5. This application failed to start because it could not find or load the Qt platform plugin异常

    双击项目Release文件夹下的exe程序无法启动: 解决办法: 1.将用到的QT组件拷贝到程序目录: 2.将D:\Qt\Qt5.3.2\5.3\msvc2013_64_opengl\plugins目 ...

  6. LaLeX数学公式

    启用数学公式: 需要插入公式时,用 $ 将公式包围.若需要输入多行,则用一对 $$ 包围. 例如: $$ \rho = \sqrt{(\Delta x)^{2}+(\Delta y)^{2}} \\ ...

  7. ElasticSearch踩坑记录

    一.分词错误 [2018-02-06 14:28:30:098] --- [INFO] --- [CjhArticleSimilarityTask.java:66] --- [[SimilarityC ...

  8. 跟随我在oracle学习php(14)

    CSS3的@keyframes用法详解: 此属性与animation属性是密切相关的,关于animation属性可以参阅CSS3的animation属性用法详解一章节. 一.基本知识: keyfram ...

  9. sqlserver 数据库关于存储xml字段里内容的查找与替换

    1.传送门 :   http://www.cnblogs.com/GuoPeng/archive/2009/12/11/1621527.html 2.复制原帖的修改部分: 修改:@xml . modi ...

  10. gat和post封装代码和爬虫的5个步奏

    1了解需求2根据需求找网站3请求4获取5存储from urllib import request, parsefrom urllib.error import HTTPError, URLError ...