详解react关于事件绑定this的四种方式


Posted in Javascript onMarch 09, 2018

在react组件中,每个方法的上下文都会指向该组件的实例,即自动绑定this为当前组件,而且react还会对这种引用进行缓存,以达到cpu和内存的最大化。在使用了es6 class或者纯函数时,这种自动绑定就不复存在了,我们需要手动实现this的绑定

React事件绑定类似于DOM事件绑定,区别如下:

1.React事件的用驼峰法命名,DOM事件事件命名是小写

2.通过jsx,传递一个函数作为event handler,而不是一个字符串。

3.React事件不能通过返回false来阻止默认事件,需要显式调用preventDefault()

如下实例:

<a href="#" onclick="console.log('The link was clicked.'); return false">
Click me
</a>

class ActionLink extends React.Component {
constructor(props) {
super(props);
}

handleClick(e) {
e.preventDefault();
console.log('The link was clicked.');
}

render() {
return (
<a href="#" onClick={this.handleClick.bind(this)}>Click Me...</a>
);
}

}

ps:React组件类的方法没有默认绑定this到组件实例,需要手动绑定。

以下是几种绑定的方法:

bind方法

直接绑定是bind(this)来绑定,但是这样带来的问题是每一次渲染是都会重新绑定一次bind;

class Home extends React.Component {

 constructor(props) {
  super(props);
  this.state = {
  };
 }

 del(){
  console.log('del')
 }

 render() {
  return (
   <div className="home">
    <span onClick={this.del.bind(this)}></span>
   </div>
  );
 }
}

构造函数内绑定

在构造函数 constructor 内绑定this,好处是仅需要绑定一次,避免每次渲染时都要重新绑定,函数在别处复用时也无需再次绑定

class Home extends React.Component {

 constructor(props) {
  super(props);
  this.state = {

  };
  this.del=this.del.bind(this)
 }

 del(){
  console.log('del')
 }

 render() {
  return (
   <div className="home">
    <span onClick={this.del}></span>
   </div>
  );
 }
}

::不能传参

如果不传参数使用双冒号也是可以

class Home extends React.Component {

 constructor(props) {
  super(props);
  this.state = {

  };
 }

 del(){
  console.log('del')
 }

 render() {
  return (
   <div className="home">
    <span onClick={::this.del}></span>
   </div>
  );
 }
}

箭头函数绑定

箭头函数不仅是函数的'语法糖',它还自动绑定了定义此函数作用域的this,因为我们不需要再对它们进行bind方法:

class Home extends React.Component {

 constructor(props) {
  super(props);
  this.state = {

  };

 }

 del=()=>{
  console.log('del')
 }

 render() {
  return (
   <div className="home">
    <span onClick={this.del}></span>
   </div>
  );
 }
}

以上几种方法都可以实现this绑定,使用那种各自的习惯;希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用js获取QueryString的方法小结
Feb 28 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
Jun 11 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
Feb 02 Javascript
js利用prototype调用Array的slice方法示例
Jun 09 Javascript
javascript原型模式用法实例详解
Jun 04 Javascript
javascript淘宝主图放大镜功能
Oct 20 Javascript
详解JS几种变量交换方式以及性能分析对比
Nov 25 Javascript
两种简单的跨域方法(jsonp、php)
Jan 02 Javascript
原生JS实现跑马灯效果
Feb 20 Javascript
关于foreach循环中遇到的问题小结
May 08 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
Nov 12 Javascript
JavaScript实现页面高亮操作提示和蒙板
Jan 04 Javascript
vue+vuex+axios实现登录、注册页权限拦截
Mar 09 #Javascript
Vue2.0结合webuploader实现文件分片上传功能
Mar 09 #Javascript
vue + vuex todolist的实现示例代码
Mar 09 #Javascript
vue实现在表格里,取每行的id的方法
Mar 09 #Javascript
vue移动端UI框架实现QQ侧边菜单组件
Mar 09 #Javascript
vue的安装及element组件的安装方法
Mar 09 #Javascript
11行JS代码制作二维码生成功能
Mar 09 #Javascript
You might like
php生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
全面理解闭包机制
2016/07/11 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
vue中tab选项卡的实现思路
2018/11/25 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
python操作gmail实例
2015/01/14 Python
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
Python易忽视知识点小结
2015/05/25 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
python 解决函数返回return的问题
2020/12/05 Python
销售人员自我评价怎么写
2013/09/19 职场文书
挂职自我鉴定
2014/02/26 职场文书
远程培训的心得体会
2014/09/01 职场文书
Python实现socket库网络通信套接字
2021/06/04 Python
php实例化对象的实例方法
2021/11/17 PHP
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers