详解三种方式在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 相关文章推荐
JS location几个方法小姐
Jul 09 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
May 17 Javascript
提示$ is not defined错误分析及解决
Apr 09 Javascript
JS OffsetParent属性深入解析
Jan 13 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
Jun 01 Javascript
jQuery图片轮播功能实例代码
Jan 29 Javascript
JavaScript高阶函数_动力节点Java学院整理
Jun 28 Javascript
浅谈webpack-dev-server的配置和使用
May 17 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
Sep 19 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
用JS实现选项卡
Mar 23 Javascript
js实现自动锁屏功能
Jun 02 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
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
详解vue高级特性
2020/06/09 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
python代码区分大小写吗
2020/06/17 Python
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
微信营销策划方案
2014/02/24 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
python 对图片进行简单的处理
2021/06/23 Python
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
MySQL查询日期时间
2022/05/15 MySQL