详解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 each()方法的使用方法
Mar 18 Javascript
js setTimeout opener的用法示例详解
Oct 23 Javascript
利用jq让你的div居中的好方法分享
Nov 21 Javascript
js动态修改整个页面样式达到换肤效果
May 23 Javascript
JavaScript中DOM详解
Apr 13 Javascript
JavaScript实现点击文字切换登录窗口的方法
May 11 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
Jun 01 Javascript
js实现右键菜单功能
Nov 28 Javascript
详解用vue.js和laravel实现微信支付
Jun 23 Javascript
JavaScript中的return布尔值的用法和原理解析
Aug 14 Javascript
React 实现拖拽功能的示例代码
Jan 06 Javascript
vue cli 3.x 项目部署到 github pages的方法
Apr 17 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
使用 MySQL Date/Time 类型
2008/03/26 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
python 类详解及简单实例
2017/03/24 Python
Python函数式编程
2017/07/20 Python
基于python log取对数详解
2018/06/08 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
python中xlutils库用法浅析
2020/12/29 Python
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
联想C++笔试题
2012/06/13 面试题
公司市场部岗位职责
2013/12/02 职场文书
房产销售经理职责
2013/12/20 职场文书
先进班级集体事迹材料
2014/01/30 职场文书
新闻报道策划方案
2014/06/11 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
工作保证书
2015/01/17 职场文书
护士求职简历自我评价
2015/03/10 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
2015年话务员工作总结
2015/04/29 职场文书
2015年共青团工作总结
2015/05/15 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
贷款收入证明范本
2015/06/12 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python