详解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 相关文章推荐
日期 时间js控件
May 07 Javascript
关于可运行代码无法正常执行的使用说明
May 13 Javascript
购物车选中得到价格实现示例
Jan 26 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
Oct 16 Javascript
如何制作幻灯片(代码分享)
Jan 06 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
May 18 Javascript
简单谈谈require模块化jquery和angular的问题
Jun 23 jQuery
在vue里面设置全局变量或数据的方法
Mar 09 Javascript
Vue项目中Api的组织和返回数据处理的操作
Nov 04 Javascript
JS实现商品橱窗特效
Jan 09 Javascript
Vue3 响应式侦听与计算的实现
Nov 11 Javascript
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
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+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
Javascript 获取LI里的内容
2008/12/17 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
简单谈谈JavaScript的同步与异步
2015/12/31 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
webpack 静态资源集中输出的方法示例
2018/11/09 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
Django3中的自定义用户模型实例详解
2020/08/23 Python
Python类class参数self原理解析
2020/11/19 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
校庆接待方案
2014/03/18 职场文书
食品安全工作实施方案
2014/03/26 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
大国崛起观后感
2015/06/02 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python