详解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 相关文章推荐
json2.js的初步学习与了解
Oct 06 Javascript
JS文本框不能输入空格验证方法
Mar 19 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
May 02 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
Jun 06 Javascript
jquery数组过滤筛选方法grep()简介
Jun 06 Javascript
jQuery中outerHeight()方法用法实例
Jan 19 Javascript
浅谈jQuery中的事件
Mar 23 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
Aug 07 Javascript
HTML页面,测试JS对C函数的调用简单实例
Aug 09 Javascript
Angular2库初探
Mar 01 Javascript
4 种滚动吸顶实现方式的比较
Apr 09 Javascript
javascript实现画板功能
Apr 12 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实现猴子选大王问题算法实例
2015/04/20 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
javascript与cookie 的问题详解
2013/11/11 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
Python编写检测数据库SA用户的方法
2014/07/11 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
解决python 上传图片限制格式问题
2019/10/30 Python
Python hmac模块使用实例解析
2019/12/24 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
幼儿园春游活动方案
2014/01/19 职场文书
物理研修随笔感言
2014/02/14 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
对标管理实施方案
2014/03/12 职场文书
收款授权委托书
2014/10/02 职场文书
安全生产工作汇报
2014/10/28 职场文书
质量整改报告范文
2014/11/08 职场文书
结婚司仪主持词
2015/06/29 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
MySQL 时间类型的选择
2021/06/05 MySQL
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL