React事件绑定总结

需要绑定的原因

...................................................................................................

  事件绑定目的,就是事件的作用域的转移。

  问题是,react生成出来的组件,this还不能指向自身吗?

<button onClick={this.plus}>plus</button>

  plus函数上的this,是事件响应时的上下文(window),并不是当前组件实例!

  先来看看bind方法的定义:“bind()方法创建一个新的函数, 当这个新函数被调用时其this置为提供的值”,什么意思呢,看代码:

var module = {
  x: 42,
  getX: function() {
    return this.x;
  }
}

var unboundGetX = module.getX;
console.log(unboundGetX()); // 调用的对象是window,所以里面的this.x => window.x
// expected output: undefined

var boundGetX = unboundGetX.bind(module);
console.log(boundGetX()); // 但是bind之后,会将this的值置为module提供的值
// expected output: 42

  所以代码修改为 this.plus.bind(this)之后,不过执行时的上下文是什么,函数的内部的this,始终指向组件提供的值。

选择绑定方法的目的

...................................................................................................

  绑定的方法有好多种,为什么需要挑选呢?我们首先要了解到:

  • DOM 是一个独立于语言的文档接口 API。在浏览器中,该 API 是用 JavaScript 实现的。但浏览器通常把DOM 和 JavaScript 分开实现。所以每次 JavaScript 访问 DOM 都会伴随着巨大的开销。
  • bind() 会创建一个绑定了作用域的函数实例。于是,从原型中实现一个实例,相当于拷贝了一份同样的函数,这是一种巨大的浪费。React想要把系统的方法关联到DOM上,我们需要最优的方法进行绑定。

  而React事件系统对DOM进行了改进,有一套高效的事件的

  • 注册
  • 存储
  • 分发
  • 重用

的机制,得到了优秀的效果:

  • 事件委托:react组件声明的事件都会转换成DOM原生事件
  • 事件冒泡:以队列的形式,可以回溯父组件
  • 合成事件:并不是单纯的使用DOM原生事件
  • 对象池:合理管理事件对象,内存分配,垃圾回收

实现

...................................................................................................

  • bind方法
    • 每次重新渲染时,都会生成一个新的函数实例保存在listenerBank中
      • 数量多时极其浪费内存。
      • 如果是子组件的props,则会导致子组件重新渲染
    • 用默认参数event来解决,如【箭头函数-函数上】,它们会在有event参数的情况下绑定到同一个函数上
<button onClick={this.handleEdit.bind(this, param)}>编辑</button>
  • 箭头函数上调用
    • 实际效果同bind方法,同样会造成重新绑定问题
    • 可以带参数,但是需要把参数写两次,不划算
<button onClick={(param) => this.handleEdit(param)}>编辑</button>
  • 构造器内部声明
    • 官方推荐,虽然代码量多
    • 事件只会生成一个
constructor(props){
    super(props);
    this.handleEdit = this.handleEdit.bind(this);
}
  • 箭头函数声明
    • 写法简单
    • 只会生成一个
    • 不能带参数,带参数就要写成bind方式
const handleEdit = (e) => {
    console.log(e)
}
  • 双冒号语法
    • ::的意思是,绑定左值和右值
    • 相当于.bind(this),但是不能带参数,不推荐
<button onClick={::this.click}></button

当组件的事件数量极多时,用【构造器内部声明】方法,否则就牺牲性能来换取便捷,有参数就用【bind方法】,没有就用【箭头函数声明】。这是又一个性能与业务平衡的例子。

思考

...................................................................................................

  • 为什么在VUE中的事件不需要绑定?
<button v-on:click="say(‘what‘)">Say what</button

  来看看官方原文

  印证了那句话:VUE是保时捷,react是组装车。

  • jQuery需要事件绑定吗?

  需要。但是为了不破坏DOM的结构,并不是直接绑定在DOM上,而是通过一种缓存的方式监听数据。

原文地址:https://www.cnblogs.com/mazhaokeng/p/9573146.html

时间: 2024-10-12 10:58:56

React事件绑定总结的相关文章

react事件绑定的三种常见方式以及解决Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state问题思路

在 React 组件中,每个方法的上下文都会指向该组件的实例,即自动绑定 this 为当前组件. 而且 React 还会对这种引用进行缓存,以达到 CPU 和内存的优化.在使用 ES6 classes 或者纯 函数时,这种自动绑定就不复存在了,我们需要手动实现 this 的绑定. 1.bind方法进行绑定,这个方法可以帮助我们绑定事件处理器内的 this ,并可以向事件处理器中传 递参数,如下图清晰明了: bind方法绑定 2.箭头函数进行绑定,箭头函数不仅是函数的“语法糖”,它还自动绑定了定义

最正确的React事件绑定方式

参考这篇文章:Choosing the Best Approach for React Event Handlers 1.function.bind()方式 2.inline arrow function方式 3.Class Property Arrow Functions 第一种方式比较常见,但因为每次父组件render时,会重新生成一个函数,相当于子组件的props发生了改变.子组件的PureComponent会失效. 第二种是一种性能好,书写简单,功能强大的方式. 第三种因为是类的属性,可

react系列-事件绑定的几种方法对比

前言 本文主要给大家介绍了关于React事件绑定的几种方法对比的相关呢荣,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. React事件绑定 由于类的方法默认不会绑定this,因此在调用的时候如果忘记绑定,this的值将会是undefined. 通常如果不是直接调用,应该为方法绑定this.绑定方式有以下几种: 1. 在构造函数中使用bind绑定this ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Button extends

React中,input外边如果包一个div,可以把input的onChange事件绑定到div上面,并且也生效

最近第一次开始学习封装组件,遇到几个比较神奇的问题. 首先就是如果input外边包一个div,如果把input的onChange事件绑定到div上,也会生效 <div onChange={(e)=>{console.log(e.target.value)}}> <Input/> </div> 还有,如果封装了一个组件,那么里面的最外层元素的{...this.props}需要慎用,虽然这样子做,可以把样式传过来,并且生效,但是会报错 原文地址:https://www

react事件代理

参考:https://github.com/youngwind/blog/issues/107 首先回顾以下原生事件的两个方法:event.stopImmediatePropagation 和 event.stopPropagation ,前者可以阻止同一dom上的后续事件的执行以及阻止冒泡,后者仅能阻止冒泡. 测试如下: 默认情况下点击内部的div,会依次显示inner click1.inner click2.root click,这是因为以下事件是绑定在了冒泡阶段 <div id="r

源码看React 事件机制

对React熟悉的同学都知道,React中的事件机制并不是原生的那一套,事件没有绑定在原生DOM上,发出的事件也是对原生事件的包装.那么这一切是怎么实现的呢? 事件注册 首先还是看我们熟悉的代码 <button onClick={this.autoFocus}>点击聚焦</button> 这是我们在React中绑定事件的常规写法.经由JSX解析,button会被当做组件挂载.而onClick这时候也只是一个普通的props.ReactDOMComponent在进行组件加载(moun

React事件

Event Handler ----React事件 React中的事件包括合成事件和原生事件,React底层对合成事件进行事件委派和手动绑定,原生事件的使用在高程3有具体讲解,难点在于跨浏览器兼容和DOM0/DOM2级事件处理程序的使用方法不同,这可以通过编写工具函数屏蔽浏览器差异,关于原生事件的描述在<Event Handler 事件处理程序 1>和<Event Handler 事件处理程序 2>中有详细解释. 合成事件:事件委派 React不会把事件处理函数直接绑定到真实的节点

vuejs学习笔记(1)--属性,事件绑定,ajax

属性 v-for 类似于angular中的 ng-repeat ,用于重复生成html片段: <ul id="box"> <li v-for="(v, i) in list">{{v}}</li> </ul> <script> var vm = new Vue({ el: '#box', // 对应的元素选择器 或者是 指向元素的变量 data: { // data list: [1,2,3] } });

VBSCRIPT事件绑定(隐式)

很多新版的浏览器都开始不支持VBSCRIPT 所以系统开始不断地有script错误,开始比较多地接触VBSCRIPT vbscript 和javascript 事件绑定的类似方法为 vbscript:   txt_id.Attributes("onblur") = "vbscript:trim_space(me)" javascript:txt_id.Attributes("onblur") = "javascript:trim_spa