React事件绑定与解绑
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(){....}); 当这样会有 ...
- Vue学习之--------组件自定义事件(绑定、解绑)(2022/8/21)
文章目录 1.基础知识 2.代码实例 2.1 App.vue 2.2 school.vue 2.3 student.vue 3.测试效果(略) 4.实际应用(在组件化编码实战三的基础上改进) 4.1 ...
随机推荐
- 使用Nome监控服务器各项指标
使用Nome监控服务器各项指标 关于Nome的使用: 1)如何将nome压缩文件上传到服务器是,首选需要将压缩包下载到本地 a.创建文件夹Nome:mk ...
- JS 超类和子类
此篇由别的大神的博客与<javascript高级程序设计>一书整理而来 原博客地址:https://hyj1254.iteye.com/blog/628555 看到javascript高级 ...
- js判重
1.两个数组,取出不重复的部分 var arr=[1,2,3]; var arr1=[1,2]; vat tmp=[]; for(let i in arr1){ if(!(arr.includes(a ...
- redhat 7 配置源
http://blog.51cto.com/eagle2014/1434305 一.准备工作 Vmware Workstation 10.0虚拟机软件(http://www.vmware.com/pr ...
- 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目 ...
- LaLeX数学公式
启用数学公式: 需要插入公式时,用 $ 将公式包围.若需要输入多行,则用一对 $$ 包围. 例如: $$ \rho = \sqrt{(\Delta x)^{2}+(\Delta y)^{2}} \\ ...
- ElasticSearch踩坑记录
一.分词错误 [2018-02-06 14:28:30:098] --- [INFO] --- [CjhArticleSimilarityTask.java:66] --- [[SimilarityC ...
- 跟随我在oracle学习php(14)
CSS3的@keyframes用法详解: 此属性与animation属性是密切相关的,关于animation属性可以参阅CSS3的animation属性用法详解一章节. 一.基本知识: keyfram ...
- sqlserver 数据库关于存储xml字段里内容的查找与替换
1.传送门 : http://www.cnblogs.com/GuoPeng/archive/2009/12/11/1621527.html 2.复制原帖的修改部分: 修改:@xml . modi ...
- gat和post封装代码和爬虫的5个步奏
1了解需求2根据需求找网站3请求4获取5存储from urllib import request, parsefrom urllib.error import HTTPError, URLError ...