详解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和PHP实现类似360功能开关效果
Feb 12 Javascript
JavaScript中的apply和call函数详解
Jul 20 Javascript
JQuery菜单效果的两个实例讲解(3)
Sep 17 Javascript
浅谈angularJS中的事件
Jul 12 Javascript
AngularJS动态加载模块和依赖的方法分析
Nov 08 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
Mar 08 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
Mar 07 Javascript
node和vue实现商城用户地址模块
Dec 05 Javascript
微信小程序时间戳转日期的详解
Apr 30 Javascript
深入了解js原型模式
May 30 Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 Javascript
vuex存取值和映射函数使用说明
Jul 24 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字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
js 幻灯片的实现
2011/12/06 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
Angular 5.x 学习笔记之Router(路由)应用
2018/04/08 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
简单介绍Python中的RSS处理
2015/04/13 Python
Python Web框架Tornado运行和部署
2020/10/19 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python工程师面试必备25条知识点
2018/01/17 Python
基于Python log 的正确打开方式
2018/04/28 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
测绘工程个人的自我评价
2013/11/23 职场文书
创业计划书的写作技巧及要点
2014/01/31 职场文书
经贸专业毕业生求职信
2014/03/23 职场文书
财务人员担保书
2014/05/13 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android
Python机器学习之底层实现KNN
2021/06/20 Python
关于ObjectUtils.isEmpty() 和 null 的区别
2022/02/28 Java/Android
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers