详解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控制表格奇偶行及活动行颜色
Apr 20 Javascript
多个checkbox被选中时如何判断是否有自己想要的
Sep 22 Javascript
node.js中的fs.symlink方法使用说明
Dec 15 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
Mar 02 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
Sep 04 Javascript
jQuery实现二级下拉菜单效果
Jan 05 Javascript
JS 对象(Object)和字符串(String)互转方法
May 20 Javascript
基于JavaScript实现下拉列表左右移动代码
Feb 07 Javascript
JS对象深度克隆实例分析
Mar 16 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
Nov 20 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
Aug 27 Javascript
Vue 实现登录界面验证码功能
Jan 03 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
我的群发邮件程序
2006/10/09 PHP
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
html超链接打开窗口大小的方法
2013/03/05 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
vue 开发一个按钮组件的示例代码
2018/03/27 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
python中uuid模块实例浅析
2020/12/29 Python
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
学习雷锋倡议书
2014/04/15 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
苏州园林导游词
2015/02/03 职场文书
土建施工员岗位职责
2015/04/11 职场文书
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript