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实现图片轮播的写法 前辈们可以 ...
随机推荐
- 剑指offer56:删除链表中重复的结点,排序的链表中,删除重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处 ...
- 病毒 | wordpress网站内容被篡改、自动跳转、变全英文的解决办法
去年10月开始,网站经常有文章被莫名其妙的篡改,而且后面还经常出现跳转到色情网站的问题,让人烦不胜烦,困扰了好几个月,最后终于解决了.这里特次记录和总结下此次恼人的事件. 时间:2018年10月 问题 ...
- python中的 __inti__ 和 __new__ 方法的区别
这个要从Python的面向对象实例化的过程说起 类名() 之后,开辟一块内存空间,然后调用__init__把空间的内存地址作为self的参数传递到函数的内部,所有和self有关的参数,属性都会和sel ...
- k8s-部署策略
在Kubernetes中有几种不同的方式发布应用,所以为了让应用在升级期间依然平稳提供服务,选择一个正确的发布策略就非常重要了. 选择正确的部署策略是要依赖于我们的业务需求的,下面我们列出了一些可能会 ...
- BZOJ3998 TJOI2015弦论(后缀自动机)
先考虑相同子串视为一个.按SAM的拓扑序预处理出从每个节点开始能得到多少个本质不同子串(注意虽然一个节点对应多个子串,但到达该点时当前的子串显然是确定为其中一个的),然后按位贪心即可. 相同子串视为多 ...
- IdentityServer4密码模式接入现有用户数据表
具体接入identityserver请看文档,这里只简单列举部分步骤 1.创建一个web项目,引入Identityserver4的nuget包 2.新建一个类,实现IResourceOwnerPass ...
- angular select 的第一行option 空白问题
记录一下这个问题的解决方案 <select class="form-control" ng-init="vm.columnId = vm.columnList[0] ...
- JS 断点调试心得
1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断 ...
- 解决window 12 service 不能调用excel ,报"System.Runtime.InteropServices.COMException (0x800A03EC)
Step1: 运行comexp.msc -32 注意因为excel 是32 位的,所以这里用的32位的操作, 如用64位的操作命令:dcomcnfg.exe,将找不到excel com 进入compo ...
- 使用帅气的cordic算法进行坐标系互转及log10的求解
参考博客 https://blog.csdn.net/u010712012/article/details/77755567 https://blog.csdn.net/Reborn_Lee/arti ...