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实现图片轮播的写法 前辈们可以 ...
随机推荐
- 写CSDN博客
文章目录 前言 写博客的规范 写博客的小技巧 版权声明模板 博客表格模板 更改博客字体和颜色 LaTeX 数学公式 前言 这是一篇关于写CSDN博客的文章.记录我的博客规范,技巧,模板,心得. 写博客 ...
- css之word-wrap和word-break的区别
对于英文单词,如果有一个连写且长度很长的英文单词,在第一行显示不下的情况下,浏览器默认不会截断显示,而是把这个单词整体挪到下一行.但是当整体挪到下一行还是显示不完全该肿么办呢?有如下两个方法: wor ...
- IE浏览器 Table 兼容问题
border篇: 直接在<tr>标签上添加 border-bottom:1px solid red; 在IE8以上浏览器有效,IE7以下版本无效 解决方案:需给<table&g ...
- Django2.0 开始一个项目
python项目运行环境: 安装虚拟环境工具 pip install virtualenv 使用虚拟环境: 创建虚拟环境: virtualenv <虚拟环境名称> 进去虚拟环境: S ...
- 如何画svg路径图
在画路径图之前,首先得在package.json引入2个依赖 废话不多说,直接上代码 <style> .green { position: absolute; } .blue { posi ...
- 移动端适配flexible.js
npm install lib-flexible --save npm install px2rem-loader --save-dev
- 转载一篇有关于diff的文章,方便以后复习
本文章是转载的,为了方便以后复习,特地记录一下.他人请去原地址观看!!! 文章原地址:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.h ...
- 如何在阿里云上运行SAP UI5应用
本来Jerry觉得这个知识点太简单了完全不值得写成微信公众号文章,但转念一想,可能网络上有一些刚刚初学UI5的朋友们可能会问到,所以还是写了. 今天一个成都同事问我这个问题,因为SAP WebIDE可 ...
- Signal Processing and Pattern Recognition in Vision_15_RANSAC:Performance Evaluation of RANSAC Family——2009
此部分是 计算机视觉中的信号处理与模式识别 与其说是讲述,不如说是一些经典文章的罗列以及自己的简单点评.与前一个版本不同的是,这次把所有的文章按类别归了类,并且增加了很多文献.分类的时候并没有按照传统 ...
- Linux常用命令及文件管理
Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 目录解释: .代表此层目录: .. 代表父目录:-代表前一个目录:~代表是家目录. (1)ls命令(显示) -a:列出所有文 ...