详解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 相关文章推荐
jquery 插件 任意位置浮动固定层
Dec 25 Javascript
JS去除数组重复值的五种不同方法
Sep 06 Javascript
使用JavaScript获取地址栏参数的方法
Dec 19 Javascript
ECMAScript6函数默认参数
Jun 12 Javascript
js实现温度计时间样式代码分享
Aug 21 Javascript
jQuery网页右侧广告跟随滚动代码分享
Apr 20 Javascript
jQuery解析XML 详解及方法总结
Sep 28 Javascript
浅谈React Native Flexbox布局(小结)
Jan 08 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
Feb 26 Javascript
微信小程序自定义组件实现tabs选项卡功能
Jul 14 Javascript
阿望教你用vue写扫雷小游戏
Jan 20 Javascript
Map与WeakMap类型在JavaScript中的使用详解
Nov 18 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
vue实现通讯录功能
2018/07/14 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
python的re模块应用实例
2014/09/26 Python
Python中的条件判断语句基础学习教程
2016/02/07 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
Python3解释器知识点总结
2019/02/19 Python
python 动态调用函数实例解析
2019/10/21 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
建筑专业毕业生推荐信
2013/11/21 职场文书
招标保密承诺书
2015/01/20 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
python自动化八大定位元素讲解
2021/07/09 Python