详解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 相关文章推荐
Javascript 遍历对象中的子对象
Jul 03 Javascript
javascript 快速排序函数代码
May 30 Javascript
javascript抽象工厂模式详细说明
Dec 16 Javascript
PHP+jQuery+Ajax实现多图片上传效果
Mar 14 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
Nov 29 Javascript
node.js 中间件express-session使用详解
May 20 Javascript
Angular浏览器插件Batarang介绍及使用
Feb 07 Javascript
微信小程序实现带缩略图轮播效果
Nov 04 Javascript
javascript中的相等操作符(==与===区别)
Dec 21 Javascript
es6 for循环中let和var区别详解
Jan 12 Javascript
vue页面更新patch的实现示例
Mar 25 Javascript
CocosCreator如何实现划过的位置显示纹理
Apr 14 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开发入门教程之面向对象
2006/12/05 PHP
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
php查询whois信息的方法
2015/06/08 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
详解如何使用Python编写vim插件
2017/11/28 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
python制作抖音代码舞
2019/04/07 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
Python测试Kafka集群(pykafka)实例
2019/12/23 Python
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
运动会开幕式邀请函
2014/02/03 职场文书
中学生演讲稿
2014/04/26 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
建筑施工安全责任书
2014/07/24 职场文书
五心教育心得体会
2014/09/04 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
个人整改方案范文
2014/10/25 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
python使用glob检索文件的操作
2021/05/20 Python
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
python图像处理 PIL Image操作实例
2022/04/09 Python