详解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 相关文章推荐
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
Jan 24 Javascript
Javascript中设置默认参数值示例
Sep 11 Javascript
javascript删除一个html元素节点的方法
Dec 20 Javascript
前端JS面试中常见的算法问题总结
Dec 23 Javascript
微信小程序 video详解及简单实例
Jan 16 Javascript
微信小程序 数据交互与渲染实例详解
Jan 21 Javascript
Vue实现本地购物车功能
Dec 05 Javascript
vue 中 命名视图的用法实例详解
Aug 14 Javascript
简单了解vue中的v-if和v-show的区别
Oct 08 Javascript
javascript开发实现贪吃蛇游戏
Jul 31 Javascript
微信小程序使用前置摄像头拍照
Oct 22 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制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
xmlHTTP实例
2006/10/24 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
python实现的解析crontab配置文件代码
2014/06/30 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
零基础学python应该从哪里入手
2020/08/11 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
非功能性需求都包括哪些方面
2013/10/29 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
给民警的表扬信
2014/01/08 职场文书
小学生读书感言
2014/02/12 职场文书
老公爱的承诺书
2014/03/31 职场文书
法制教育演讲稿
2014/09/10 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
怒海潜将观后感
2015/06/11 职场文书
Vue全家桶入门基础教程
2021/05/14 Vue.js
go goroutine 怎样进行错误处理
2021/07/16 Golang
Redis读写分离搭建的完整步骤
2021/09/14 Redis