React事件处理和原生JS事件处理
1.原生JS
事件触发调用有三种方式:
1. on[event]事件属性,手动触发 ❗️on[event]事件是Window对象上的方法。
2. on[event]事件属性,通过htmlElement.click()模拟触发
3. addEventListener监听事件,手动触发
this指向
- 如果onevent事件属性定义的时候将this作为参数,在函数中获取到该参数是DOM对象。用该方法可以获取当前DOM。
- 在方法中直接访问this, this指向当前函数所在的作用域。或者说调用函数的对象。
<body>
<input type="checkbox" id="root" onmouseover="toclick(this,event)" onclick="add()" />
<button onclick="a.test(this)">Test</button>
<script>
function toclick(argThis,e) {
console.log(e); // event对象;必须手动传参
console.log(argThis); // 传递过来的this指向DOM元素,可以通过这个方法调用自身
const rootEle = argThis; // 等于document.getElementById('root');
rootEle.click(); // 里面没有参数,只是触发
}
function add(arg) {
console.log(arg);// undefined 说明事件想要获取event等参数必须要传参
console.log(this); // window 不管是mouseover里面通过rootEle触发还是直接单击触发,相当于直接运行add()
}
const a = {
test(argThis) {
console.log(argThis); // dom元素
console.log(this); // this指向对象a
}
}
const rootEle = document.getElementById("root");
rootEle.addEventListener('click', function() {
console.log('listen===',this); // DOM元素;指向调用监听器的对象
})
</script>
</body>
2. ReactJS
事件触发调用方式:
1. 事件属性。on[Event]触发,注意ReactJS中使用小驼峰命名,这点和原生JS不同。
2. click()模拟触发。注意模拟触发和事件监听都要求DOM加载完毕。
3. 监听事件触发。addEventListener
this指向:
React中this指向一般都期望指向当前组件,如果不绑定this,this一般等于undefined。
绑定this的方法有三种:
- 箭头函数;本质上是在构造函数中进行了绑定;
- 在事件属性定义的时候使用.bind(this, ...params)(不推荐,因为每次运行,会生成一个新函数)
- 在构造函数中手动绑定,只需要绑定一次。
3. 事件对象
原生js中事件对象是原生事件对象,它存在浏览器兼容性,需要用户自己处理各浏览器兼容问题。
ReactJS中的事件对象是React将原生事件对象(event)进行了跨浏览器包装过的合成事件(SyntheticEvent)。
合成事件对象的特点:
1)在事件处理函数中,可以正常访问事件属性。
2)为了性能考虑,执行完后,合成事件的事件属性将不能再访问。
异步处理函数中,访问不到合成事件的属性。
因为执行异步函数的时候,事件处理函数的上下文消失。
示例:
handleClick = (event) => {
console.log(event); // => nullified object
console.log(event.type); // => "click"
const eventType = event.type; // => "click"
setTimeout(function() {// 异步函数中复用
console.log(event.type); // => null
console.log(eventType); // => "click"
}, 0);
// 不起作用,this.state.clickEvent 的值将会只包含 null
this.setState({clickEvent: event});
// 你仍然可以导出事件属性
this.setState({eventType: event.type});
}
想要在异步函数中继续使event属性可访问,需要使用event.persist();
handleClick = (event) => {
event.persist();
console.log(event); // => nullified object
console.log(event.type); // => "click"
const eventType = event.type; // => "click"
setTimeout(function() {// 异步函数中复用
console.log(event.type); // => "click"
console.log(eventType); // => "click"
}, 0);
this.setState({clickEvent: event});
this.setState({eventType: event.type});
}
React事件处理和原生JS事件处理的更多相关文章
- 再谈React.js实现原生js拖拽效果
前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...
- React.js实现原生js拖拽效果及思考
一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...
- js事件处理 —— 详解
对于JS事件处理分为四部分: 1.html事件处理程序 直接添加到HTML结构中 解析:用html处理程序可以直接在button元素里直接调用,但是维护性不是很方便 <!DOCTYPE html ...
- React 深入系列5:事件处理
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列5:事件处理 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加 ...
- js事件处理-整理
<!-- 作者:gentiana@163.com 时间:2016-3-10 描述:js事件处理 --> <!DOCTYPE html> <html> <hea ...
- Vue.js事件处理
Vue.js事件处理 1.v-on指令 用法如下:使用v-on:指令指定其执行的具体内容或者方法名即可. <button v-on:click='num++'>giao</butto ...
- 原生JS封装Ajax插件(同域&&jsonp跨域)
抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...
- 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别
一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...
- 原生JS实现轮播+学前端的感受(防止走火入魔)
插件!插件!天天听到有人求这个插件,那个插件的,当然,用第三方插件可以大幅提高开发效率,但作为新手,我还是喜欢自己来实现,主要是我有时间! 今天我来给大家分享下用原生JS实现图片轮播的写法 前辈们可以 ...
随机推荐
- 序列变换(HDU-5256)【LIS】
题目链接:https://vjudge.net/problem/HDU-5256 题意:给一个数列,每一个数都不相同且为整数,现求,最少需要修改多少次才能使该数列为严格上升的. 思路:首先,对于一个严 ...
- 2019牛客多校一 H. XOR (线性基)
大意: 给定序列, 求所有异或和为$0$的子序列大小之和. 先求出线性基, 假设大小为$r$. 对于一个数$x$, 假设它不在线性基内, 那么贡献为$2^{n-r-1}$ 因为它与其余不在线性基内数的 ...
- Apache2.4+Tomcat7.0整合配置详解
一.简单介绍 Apache.Tomcat Apache HTTP Server(简称 Apache),是 Apache 软件基金协会的一个开放源码的网页服务器,可以在 Windows.Unix.Lin ...
- C# Unix时间戳和DateTime类型相互转换
/// <summary> /// 将Unix时间戳转换为DateTime类型时间 /// </summary> /// <param name="d" ...
- 利用贝叶斯算法实现手写体识别(Python)
在开始介绍之前,先了解贝叶斯理论知识 https://www.cnblogs.com/zhoulujun/p/8893393.html 简单来说就是:贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯 ...
- vue.js入门语法
1.入门 <div id="vue_det"> <h1>site : {{site}}</h1> //两个大括号显示参数 <h1>u ...
- C++ DLL debug版本在其他PC上缺少依赖的处理方式
1.正常情况提供给其他人的都是Release版本DLL 2.在需要提供Debug版本时,目标机器上可能会缺少环境,或者和生成DLL的环境不匹配导致DLL无法加载,提示DLL无法找到. 3.使用DLL依 ...
- Python模拟登陆某网教师教育网
本文转载自看雪论坛[作者]rdsnow 不得不说,最近的 Python 蛮火的,我也稍稍了解了下,并试着用 Python 爬取网站上的数据 不过有些数据是要登陆后才能获取的,我们每年都要到某教师教育网 ...
- bash shell的ANSI控制
格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \03 ...
- Netty4实现JTT809对接
网上的使用的netty版本过老,最近自己接触到这一块,重新写了一个 服务器流程 1,判定报文起始和结束标识 ,2去掉头尾标识进行转义,3,去掉CRC码进行CRC计算,4读取报文头,(5,如果加密则解密 ...