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实现图片轮播的写法 前辈们可以 ...
随机推荐
- ACMComputerFactory(POJ-3436)【最大流】
题目链接:https://vjudge.net/problem/POJ-3436 题意:要用N台机器来组装电脑,每台电脑由P个零部件构成,每一台机器的输入电脑和输出电脑的每部分都有各自的属性,机器本身 ...
- C++中如何记录程序运行时间
一.clock()计时函数clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下:clock_t clock(void) ;简单而言, ...
- SAS学习笔记3 输入输出格式(format、informat函数)
format函数:定义输出格式 informat函数:定义输入格式 proc format:定义输出格式 从外部读取文件 proc format过程步
- Intellij IDEA中启动多个微服务--开启Run Dashboard管理
1.找到workspace.xml 2.添加配置 <option name="configurationTypes"> <set> <option v ...
- 奇妙的算法【9】YC每个小孩的糖果数,找公约数,最少硬币数
1,每个小孩的糖果数量是多少 有p个小孩,c个糖果,刚开始第1个小孩发一个糖果,第2个小孩发两个糖果,第p个小孩发p个糖果,如果糖果没有发完,就接着[注意]第1个小孩发p+1个糖果.....第p个小孩 ...
- SpringFramework5.0 @Indexed注解 简单解析
目录 使用场景 使用方法 原理说明 使用需注意点 案例说明 参考资料 纸上得来终觉浅 绝知此事要躬行 -陆游 最近在看SpringBoot核编程思想(核心篇),看到走向注解驱动编程这章,里面有讲解到: ...
- c#基础知识梳理(三)
上期回顾 - https://www.cnblogs.com/liu-jinxin/p/10824638.html 一.方法 一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块.每一个 C ...
- EDK2开发环境搭建
EDK2开发环境搭建 来源 https://blog.csdn.net/rikeyone/article/details/80759724 EDK2全称为“uEFI Development Kit”, ...
- sql复杂的子查询,横向合并结果集
第一个查询的结果集 select * from( select c.msName,a.msId,c.msPrice, c.msPrice*COUNT(a.msId) as totalMoney,sum ...
- 案例:selenium实现登录处理弹窗
func.py https://www.cnblogs.com/andy9468/p/10899508.html main.py中 # 导入webdriver import os import tim ...