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事件绑定与解绑的更多相关文章
-
兼容8事件绑定与解绑addEventListener、removeEventListener和ie的attachEvent、detachEvent
兼容8事件绑定与解绑addEventListener.removeEventListener和ie的attachEvent.detachEvent ;(function(){ // 事件绑定 bi ...
-
jQuery事件绑定、解绑、命名空间
jQuery事件绑定.解绑.命名空间 <%@ page language="java" import="java.util.*" pageEncoding ...
-
jQuery事件绑定,解绑,触发
事件绑定 1.bind(type,[data],fn) --type: 含有一个或多个事件类型的字符串,由空格分隔多个事件.比如"click"或"submit" ...
-
jquery中的DOM事件绑定与解绑
在jquery事件中有时候有的事件只需要在绑定后有效触发一次,当通过e.target判断触发条件有效触发后解除绑定事件,来避免多次无效触发和与未知情况造成冲突. 这时候就要用到了jquery中的事件绑 ...
-
jQuery 学习笔记(5)(事件绑定与解绑、事件冒泡与事件默认行为、事件的自动触发、自定义事件、事件命名空间、事件委托、移入移出事件)
1.事件绑定: .eventName(fn) //编码效率略高,但部分事件jQuery没有实现 .on(eventName, fn) //编码效率略低,所有事件均可以添加 注意点:可以同时添加多个相同 ...
-
jQuery之_事件绑定与解绑
使用jQuery实现事件的绑定和解绑 就是所谓的事件操作. 1. 事件绑定(2种): * eventName(function(){}) 绑定对应事件名的监听, 例如:$('#div').click( ...
-
jQuery-3.事件篇---事件绑定与解绑
on()的多事件绑定 之前学的鼠标事件,表单事件与键盘事件都有个特点,就是直接给元素绑定一个处理函数,所有这类事件都是属于快捷处理.翻开源码其实可以看到,所有的快捷事件在底层的处理都是通过一个&quo ...
-
jquery中事件重复绑定以及解绑问题
一般的情况下,对于这种情况,我们常规的思路是,先解绑,再绑定,如下: $(selector).unbind('click').bind('click',function(){....}); 当这样会有 ...
-
Service的启动与停止、绑定与解绑
---恢复内容开始--- Service的意义就在于当软件停止之后还可以在背景中进行运行,换句话也就是说,比如一个音乐播放器,当我们退出音乐播放器的时候,还是希望它在背景中运行,也就是一直播放着音乐, ...
随机推荐
-
hdu 1398 Square Coins(简单dp)
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Pro ...
-
【转】RTSP实例解析
原文网址:http://www.cnblogs.com/qq78292959/archive/2010/08/12/2077039.html. 核心提示:rtsp简介(ZT) Real Time St ...
-
LR 取到怎么样才能得到参数列表中的每一个值
char *m="e"; lr_save_string("helloworld","p4"); lr_eval_string("{ ...
-
(转)dedecms代码详解 很全面
dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...
-
JavaScript的六种继承方式
继承是面向对象编程中又一非常重要的概念,JavaScript支持实现继承,不支持接口继承,实现继承主要依靠原型链来实现的 原型链 首先得要明白什么是原型链,在一篇文章看懂proto和prototype ...
-
linux下内存的统计和内存泄露类问题的定位
在产品的开发中,通过对当前系统消耗内存总量的统计,可以对产品所需内存总量进行精确的评估,从而选择合适的内存芯片与大小,降低产品的成本.在遇到内存泄露类问题时,经常会对此束手无策,本文通过对proc下进 ...
-
Java构造器:级联调用,调用兄弟构造器
级联调用: class Father{ Father(){ System.out.println("Father birth"); } public void announce() ...
-
Weblogic WLS-WebServices组件反序列化漏洞复现
漏洞分析: 当weblogic使用WLS-WebServices组件时,该组件会调用XMLDecoder解析XML数据,由此就产生了该漏洞 影响版本: weblogic<10.3.6版本 复现过 ...
-
Angular MVC
<!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...
-
ERROR 1045 (28000): Access denied for user &#39;ODBC&#39;@&#39;localhost&#39; (using password: NO) ERROR 1045 (28000): Access denied for user &#39;ODBC&#39;@&#39;localhost&#39; (using password: YES)
windows下,以上两个错误的解决方法 工具/原料 windows 8 MySql 方法/步骤 找到配置文件my.ini ,然后将其打开,可以选择用记事本打开 打开后,搜索mysq ...