前提

es6写法的类方法默认没有绑定this,不手动绑定this值为undefined。

因此讨论以下几种绑定方式。

一、构造函数constructor中用bind绑定

class App extends Component {constructor (props) {super(props)this.state = {t: 't'}// this.bind1 = this.bind1.bind(this) 无参写法this.bind1 = this.bind1.bind(this, this.state.t)}// 无参写法 // bind1 () {//   console.log('bind1', this)// }bind1 (t, event) {console.log('bind1', this, t, event)}render () {return (<div><button onClick={this.bind1}>打印1</button></div>)}
}

二、在调用的时候使用bind绑定this

 bind2 (t, event) {console.log('bind2', this, t, event)}render () {return (<div><button onClick={this.bind2.bind(this, this.state.t)}>打印2</button></div>)}
// 无参写法同第一种

三、在调用的时候使用箭头函数绑定this

bind3 (t, event) {console.log('bind3', this, t, event)}render () {return (<div>// <button onClick={() => this.bind3()}>打印3</button> 无参写法<button onClick={(event) => this.bind3(this.state.t, event)}>打印3</button></div>)}

四、使用属性初始化器语法绑定this

  bind4 = () =>{console.log('bind4', this)}render () {return (<div><button onClick={this.bind4}>打印4</button>// 带参需要使用第三种方法包一层箭头函数</div>)}

附加::方法(不能带参,stage 0草案中提供了一个便捷的方案——双冒号语法)

  bind5(){console.log('bind5', this)}render() {return (<div><button onClick={::this.bind5}></button></div>)}

方法一优缺点

优点:

只会生成一个方法实例;
并且绑定一次之后如果多次用到这个方法也不需要再绑定。

缺点:

即使不用到state,也需要添加类构造函数来绑定this,代码量多;
添加参数要在构造函数中bind时指定,不在render中。

方法二、三优缺点

优点:

写法比较简单,当组件中没有state的时候就不需要添加类构造函数来绑定this。

缺点:

每一次调用的时候都会生成一个新的方法实例,因此对性能有影响;
当这个函数作为属性值传入低阶组件的时候,这些组件可能会进行额外的重新渲染,因为每一次都是新的方法实例作为的新的属性传递。

方法四优缺点

优点:

创建方法就绑定this,不需要在类构造函数中绑定,调用的时候不需要再作绑定;
结合了方法一、二、三的优点。

缺点:

带参就会和方法三相同,这样代码量就会比方法三多了。

总结

方法一是官方推荐的绑定方式,也是性能最好的方式。

方法二和方法三会有性能影响,并且当方法作为属性传递给子组件的时候会引起重新渲染问题。

方法四和附加方法不做评论。

大家根据是否需要传参和具体情况选择适合自己的方法就好。

谢谢阅读。

更多专业前端知识,请上 【猿2048】www.mk2048.com

React事件绑定几种方法测试相关推荐

  1. js中事件绑定3种方法以及事件委托

    ###事件绑定 首先,我先来介绍我们平时绑定事件的三种方法. 1.嵌入dom <button onclick="open()">按钮</button>< ...

  2. React绑定事件的四种方法

    今天给大家分享一下react绑定事件的四种方法,也许会有不准确的地方,欢迎指点出来,大家一起进步~ 首先要先了解,在js中class的方法默认不会绑定this,默认情况下是undefined,所以就需 ...

  3. 在html中搜索按钮事件,html中button绑定点击事件的几种方法介绍

    HTML中为button绑定事件的方式有三种. 例如以下标签: submit 一.使用jquery进行绑定$('#btn_submit').click(function(){ }); 二.使用原生js ...

  4. javascript中为某个对象(控件)绑定事件的几种方法

    今天学习了javascirpt的一些基础知识,有关事件绑定的一些方法: 1.<input type="button" οnclick="clickHandler() ...

  5. js 绑定事件的几种方法 addEventListener()

    看代码 <!DOCTYPE html> <html><head><meta charset="UTF-8"><title> ...

  6. svg鼠标响应事件的四种方法(其中两种可支持火狐)

    svg鼠标响应事件的四种方法 鼠标响应事件的四种方法,以click事件为例. Mouse Events - SMIL <?xml version="1.0" encoding ...

  7. 模拟键盘鼠标事件有两种方法

    实现一个鼠标或者键盘模拟器,可以完成很多功能,比如做一个简单的游戏外挂^_^.通常,模拟键盘鼠标事件有两种方法: 1.keybd_event, mouse_event 2.SendMessage, P ...

  8. js循环添加事件的两种方法

    js循环添加事件的两种方法 选择下拉列表中的一个li将文本传到框中 问题:写此二级菜单时用到的方法不好,对此进行优化 原始js代码: <script>// 思路:1.点击下拉框a时,ul中 ...

  9. jQuery中绑定事件的几种方法

    以click事件为例,jQuery中绑定事件有三种方法: (1)target.click(function(){});  (2)target.bind("click",functi ...

最新文章

  1. 读写锁ReadWriteLock
  2. tcp out of order解决_分布式集群解决方案 学习笔记
  3. 运维的基本知识点及分类工作
  4. dsp广告和信息流广告区别_一文搞懂DSP-蘑菇街DSP广告实践
  5. 快速实现Apache二级域名的方法
  6. java 不能执行mysql存储过程_java无法执行mysql中的函数及存储过程的.sql备份文件...
  7. SQL SERVER-约束
  8. perl语言编程 第四版_被称作“胶水语言”的PERL,在芯片设计和验证中可以这样使用...
  9. ajax control toolkit vs2013,VS2008 .net framework 3.5使用Ajax Control Toolkit完整解决方案
  10. isp和3a的联系与区别是什么?
  11. Vuforia开发完全指南
  12. NYOJ463 - 九九乘法表
  13. Caffe学习1 :ProtoBuffer
  14. react 拆分组件于组件
  15. 高级运维工程师证书_华为认证云运维高级工程师(HCIP-CDCO)
  16. 用 js判断 一个数是否是素数(质数)_Javascript 判断一个数是不是素数
  17. 16MHz贴片晶振智能电子产品的好帮手
  18. 计算机网络 | 实验二 WINPCWP编程
  19. oracle数据库语句
  20. 记录一次docker基础操作错误Error response from daemon: You cannot remove a running container

热门文章

  1. swiper如何防止冲突_冲突管理:化冲突为机会的8个谈话技巧,从此告别争吵和冷战...
  2. (3.5)HarmonyOS鸿蒙多按钮点击事件
  3. python开源流程图软件_Dia
  4. uniapp 子组件 props拿不到数据_来吧!一文彻底搞定Vue组件!
  5. 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。...
  6. shiro 认证思路
  7. 专业软件 —— 硬件评测
  8. JavaFX上手--第1天
  9. mvc的视图中显示DataTable的方法
  10. tensorflow的优化器Optimizer