详解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 相关文章推荐
javascript 获取图片尺寸及放大图片
Sep 04 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
Oct 17 Javascript
setTimeout自动触发一个js的方法
Jan 15 Javascript
学习JavaScript设计模式(代理模式)
Dec 03 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
Feb 17 Javascript
javascript实现标签切换代码示例
May 22 Javascript
easyui-combobox 实现简单的自动补全功能示例
Nov 08 Javascript
jQuery实现发送验证码并60秒倒计时功能
Nov 25 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 Javascript
基于Datatables跳转到指定页的简单实例
Nov 09 Javascript
利用Vue实现简易播放器的完整代码
Dec 30 Vue.js
js 实现验证码输入框示例详解
Sep 23 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
Home Coffee Roasting
2021/03/03 咖啡文化
php生成随机数的三种方法
2014/09/10 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
Vue.js实现价格计算器功能
2020/03/30 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
详解Python中类的定义与使用
2017/04/11 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
药学专业大学生自荐信
2013/09/28 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
《手指教学》反思
2014/02/14 职场文书
新学期决心书
2014/03/11 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
市政管理求职信范文
2014/05/07 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
乡镇干部党的群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
防灾减灾标语
2014/10/07 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书