详解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继承的实现
Oct 24 Javascript
5个javascript的数字格式化函数分享
Dec 07 Javascript
JS+CSS实现可拖动的弹出提示框
Feb 16 Javascript
js淡入淡出的图片轮播效果代码分享
Aug 24 Javascript
JavaScript实现时钟滴答声效果
Jan 29 Javascript
JavaScript实现的选择排序算法实例分析
Apr 14 Javascript
详解Vue如何支持JSX语法
Nov 10 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
Apr 09 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
Jul 09 Javascript
在vue项目中,将juery设置为全局变量的方法
Sep 25 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
Oct 08 Javascript
vue+layui实现select动态加载后台数据的例子
Sep 20 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动态生成虚拟现实VRML网页
2006/10/09 PHP
用PHP实现ODBC数据分页显示一例
2006/10/09 PHP
php的memcached客户端memcached
2011/06/14 PHP
sina的lightbox效果。
2007/01/09 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
py中的目录与文件判别代码
2008/07/16 Python
Python字符遍历的艺术
2008/09/06 Python
python实现的文件同步服务器实例
2015/06/02 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
python使用zip将list转为json的方法
2018/12/31 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
python实现猜拳游戏
2020/03/04 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
新驾驶员个人自我评价
2014/01/03 职场文书
办护照工作证明
2014/10/01 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
旅行社计调工作总结
2015/08/12 职场文书
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
react 路由Link配置详解
2021/11/11 Javascript
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers