1.原生JS

事件触发调用有三种方式:

1. on[event]事件属性,手动触发  ❗️on[event]事件是Window对象上的方法。

2. on[event]事件属性,通过htmlElement.click()模拟触发

3. addEventListener监听事件,手动触发

this指向

  1. 如果onevent事件属性定义的时候将this作为参数,在函数中获取到该参数是DOM对象。用该方法可以获取当前DOM。
  2. 在方法中直接访问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的方法有三种:

  1. 箭头函数;本质上是在构造函数中进行了绑定;
  2. 在事件属性定义的时候使用.bind(this, ...params)(不推荐,因为每次运行,会生成一个新函数)
  3. 在构造函数中手动绑定,只需要绑定一次。

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事件处理的更多相关文章

  1. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  2. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  3. js事件处理 —— 详解

    对于JS事件处理分为四部分: 1.html事件处理程序 直接添加到HTML结构中 解析:用html处理程序可以直接在button元素里直接调用,但是维护性不是很方便 <!DOCTYPE html ...

  4. React 深入系列5:事件处理

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列5:事件处理 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加 ...

  5. js事件处理-整理

    <!-- 作者:gentiana@163.com 时间:2016-3-10 描述:js事件处理 --> <!DOCTYPE html> <html> <hea ...

  6. Vue.js事件处理

    Vue.js事件处理 1.v-on指令 用法如下:使用v-on:指令指定其执行的具体内容或者方法名即可. <button v-on:click='num++'>giao</butto ...

  7. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  8. 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别

    一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...

  9. 原生JS实现轮播+学前端的感受(防止走火入魔)

    插件!插件!天天听到有人求这个插件,那个插件的,当然,用第三方插件可以大幅提高开发效率,但作为新手,我还是喜欢自己来实现,主要是我有时间! 今天我来给大家分享下用原生JS实现图片轮播的写法 前辈们可以 ...

随机推荐

  1. PAT(B) 1021 个位数统计(Java)

    题目链接:1021 个位数统计 (15 point(s)) 代码 /** * Score 15 * Run Time 93ms * @author wowpH * @version 1.0 */ im ...

  2. IntelliJ IDEA调出problem窗口

    一.File =>Settings 二.搜索Compiler=>勾选Make project automatically 三.出现问题Problems窗口会报错 原文地址:https:// ...

  3. 在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题 SQL遍历截取字符串)

    原文:在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题 SQL遍历截取字符串) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方 ...

  4. 【es6】将2个数组合并为一个数组

    //第一种 一个数组中的值为key 一个数组中的值为value let arr1 = ['内存','颜色','尺寸']; let arr2 = [1,2,3]; let temp = arr1.map ...

  5. 1、java集合:java集合详解及类关系图

    List和Set继承自Collection接口. Set无序不允许元素重复.HashSet和TreeSet是两个主要的实现类. List有序且允许元素重复,支持null对象.ArrayList.Lin ...

  6. 一个简单的window.onscroll实例

    鉴于better-scroll实现这个效果很复杂,想用最原生的效果来实现吸顶效果 一个简单的window.onscroll实例,可以应用于移动端 demo 一个简单的window.onscroll实例 ...

  7. js循环及for-in , for-of的区别

    循环 字符串遍历:可通过for-of遍历字符串 for-in:遍历对象自身可继承可枚举属性 Object.keys():返回对象自身可枚举属性的键组成的数组 Object.getOwnProperty ...

  8. 高射炮打蚊子,杀鸡用绝世好剑:在SAP Kyma上运行UI5应用

    国人在表述"大材小用"这个场景时,总喜欢用一些实物来类比,比如:高射炮打蚊子. 英国QF 3.7英寸(94mm)高射炮,战斗全重超过9.3吨,全长近5米,最大射程约18公里,最大射 ...

  9. 如何在阿里云上运行SAP UI5应用

    本来Jerry觉得这个知识点太简单了完全不值得写成微信公众号文章,但转念一想,可能网络上有一些刚刚初学UI5的朋友们可能会问到,所以还是写了. 今天一个成都同事问我这个问题,因为SAP WebIDE可 ...

  10. 关于js里的布尔值判断

    第一种if(a)a为以下值时转换为false   false undefined null 0 -0 NaN ""