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 ...
随机推荐
- react 的基础
首先下载React 的安装包,可以到官网下载.也可以使用React Demos 已经自带 React 源码,不用另外安装,只需把这个库拷贝到硬盘中使用. (可参考http://www.ruanyife ...
- 数据库 ACID
ACID是指一个事务本质上有四个特点: Atomicity:原子性 Consistency:一致性 Isolation:隔离性 Durablilty:耐久性 原子性 原子性是指事务是一个不可分割的工作 ...
- windows异步通知I/O模型
回声服务器端: #include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #define BUF_S ...
- 【jenkins】jenkins+maven+gitlab+testng,jenkins配置
电脑版本:windows10企业版 jenkins配置: 1.general配置,这里的配置比较简单,基本默认就可以了 2.源码管理 2.1填写git地址,从你的gitlib项目里去找.不会的自行百度 ...
- Java集合类(转自hey平平)
一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...
- Oracle 11g 单实例到单实例OGG同步实施文档-EXPDP初始化
Oracle 11g 单实例到单实例OGG同步实施文档-EXPDP初始化 2018-06-07 00:446470原创GoldenGate 作者: leo 本文链接:https://www.cndba ...
- http协议与https协议的前世今生
一.Http与Https的区别: HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 HTTP 是不安全的,而 HTTPS 是安全的 HTTP 标准端口是80 ...
- h5或者微信端吊起app
[https://www.cnblogs.com/shadajin/p/5724117.html]! 魔窗sdk http://www.magicwindow.cn/doc/universal-lin ...
- servlet获取request数据的乱码解决
例如请求中有: /score?type=Mana&name=${user.name} ***************************************************** ...
- Vue项目的打包
vue项目的打包 更改config文件夹下的index.js里的assetsPublicPath路径 将 “/” 改为 “./” build: { env: require('./prod. ...