详解三种方式在React中解决绑定this的作用域问题并传参


Posted in Javascript onAugust 18, 2020

在React中时常会遇到this指向的作用域问题 从而导致undefined报错

先来个Demo:
功能很简单 点击按钮改变文字

import React from 'react';

export default class BindWithThis extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      msg:"BindWithThis"
    }
  }

  render() { 
    return <div>
      <input type="button" value="Way1" onClick={this.changeMsg1}/>
      <hr/>
      <h3>{this.state.msg}</h3>
    </div>
  }

  changeMsg1(){
    console.log(this)
    this.setState({
      msg:"Way1"
    })
  }
}

但会遇到问题:Cannot read property ‘setState' of undefined

详解三种方式在React中解决绑定this的作用域问题并传参

这是因为 在changeMsg1方法内部的this指向的并不是外面的组件 因而根本就不会有setState()方法了 自然会报错

为此 有三种解决方法

方式一:在事件处理函数中使用.bind()

只要这样即可:

render() { 
    return <div>
      <input type="button" value="Way1" onClick={this.changeMsg1.bind(this)}/>
      <hr/>
      <h3>{this.state.msg}</h3>
    </div>
  }

bind()的作用是为前面的函数修改函数内部的this的指向 从而使得函数内部的this指向bind中的第一个参数

bind()还可以传值:
bind第一个参数后面的所有参数都会作为调用bind前面的函数的参数传递

render() { 
  return <div>
    <input type="button" value="Way1" onClick={this.changeMsg1.bind(this,"壹","贰")}/>
    <hr/>
    <h3>{this.state.msg}</h3>
  </div>
}

changeMsg1(arg1,arg2){
  this.setState({
    msg:"Way1"+arg1+arg2
  })
}

除了bind()之外 还有call()和apply() 它们都能改变函数内部的this的指向
不过bind()和call()/apply()的区别是:bind()并不会立即调用 而call()/apply()会立即调用

方式二:在构造函数中使用.bind()

当为一个函数调用bind 从而改变this的指向之后 bind函数的返回值是这个被改变this指向的函数的改变后的引用
bind并不会修改原函数的this的指向 而是返回一个修改后的函数的指向 因此需要重新接收方可生效

import React from 'react';

export default class BindWithThis extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      msg:"BindWithThis"
    }

    // 当为一个函数调用bind 改变this的指向之后 bind函数的返回值是这个被改变this指向的函数的改变后的引用 因此需要重新接收
    this.changeMsg2 = this.changeMsg2.bind(this,"壹","贰")
  }

  render() { 
    return <div>
      <input type="button" value="Way2" onClick={this.changeMsg2}/>
      <hr/>
      <h3>{this.state.msg}</h3>
    </div>
  }

  changeMsg2(arg1,arg2){
    this.setState({
      msg:"Way2"+arg1+arg2
    })
  }
}

方式三:使用箭头函数

利用了箭头函数的特性:箭头函数内部的this永远指向调用者方的this

render() { 
  return <div>
    <input type="button" value="Way3" onClick={() => {this.changeMsg3("壹","贰")}}/>
    <hr/>
    <h3>{this.state.msg}</h3>
  </div>
}

changeMsg3 = (arg1,arg2) => {
  this.setState({
    msg:"Way3"+arg1+arg2
  })
}

当然 更推荐使用更加方便的箭头函数

到此这篇关于详解三种方式在React中解决绑定this的作用域问题并传参的文章就介绍到这了,更多相关React绑定this作用域内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
IE event.srcElement和FF event.target 功能比较
Mar 01 Javascript
关于JS中prototype的理解
Sep 07 Javascript
三种带箭头提示框总结实例
Jun 14 Javascript
Bootstrap 填充Json数据的实例代码
Jan 11 Javascript
js+html5实现侧滑页面效果
Jul 15 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
Oct 15 Javascript
tween.js缓动补间动画算法示例
Feb 13 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
Jul 12 jQuery
vue 下列表侧滑操作实例代码详解
Jul 24 Javascript
微信小程序button标签open-type属性原理解析
Jan 21 Javascript
vue实现短信验证码输入框
Apr 17 Javascript
Vue+axios封装请求实现前后端分离
Oct 23 Javascript
javascript实现移动端上传图片功能
Aug 18 #Javascript
八种Vue组件间通讯方式合集(推荐)
Aug 18 #Javascript
小程序实现上传视频功能
Aug 18 #Javascript
如何在selenium中使用js实现定位
Aug 18 #Javascript
vue实现移动端input上传视频、音频
Aug 18 #Javascript
React冒泡和阻止冒泡的应用详解
Aug 18 #Javascript
JavaScript数组排序的六种常见算法总结
Aug 18 #Javascript
You might like
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
jQuery使用CSS()方法给指定元素同时设置多个样式
2015/03/26 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
layui实现三级联动效果
2019/07/26 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
Python threading的使用方法解析
2019/08/28 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
上海天奕面试题笔试题
2015/04/19 面试题
Servlet如何得到服务器的信息
2015/12/22 面试题
优秀毕业自我鉴定
2014/02/15 职场文书
海飞丝广告词
2014/03/20 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
Python中super().__init__()测试以及理解
2021/12/06 Python
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python