详解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 相关文章推荐
window.event快达到全浏览器支持了,以后使用就方便了
Nov 30 Javascript
JS中处理与当前时间间隔的函数代码
May 23 Javascript
浏览器的JavaScript引擎的识别方法
Oct 20 Javascript
js弹出确认是否删除对话框
Mar 27 Javascript
javascript模拟实现ajax加载框实例
Oct 15 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
Oct 16 Javascript
jquery+ajax+text文本框实现智能提示完整实例
Jul 09 Javascript
简单谈谈Vue 模板各类数据绑定
Sep 25 Javascript
浅谈angular.js跨域post解决方案
Aug 30 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
Nov 02 Javascript
JS验证输入的是否是数字及保留几位小数问题
May 09 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
Jul 05 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_Flame(Version:Progress)的原代码
2006/10/09 PHP
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
PHP chr()函数讲解
2019/02/11 PHP
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
利用Python自动监控网站并发送邮件告警的方法
2016/08/24 Python
python处理xml文件的方法小结
2017/05/02 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
django云端留言板实例详解
2019/07/22 Python
tensorflow如何批量读取图片
2019/08/29 Python
python 字符串常用方法汇总详解
2019/09/16 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
Python中如何引入第三方模块
2020/05/27 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
公司寄语大全
2014/04/10 职场文书
村级换届选举方案
2014/05/10 职场文书
转变工作作风心得体会
2016/01/23 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
Python 视频画质增强
2022/04/28 Python