详解三种方式在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 相关文章推荐
悄悄用脚本检查你访问过哪些网站的代码
Dec 04 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
Nov 14 Javascript
异步javascript的原理和实现技巧介绍
Nov 08 Javascript
Jquery对数组的操作技巧整理
Mar 25 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
Dec 04 Javascript
使用 stylelint检查CSS_StyleLint
Apr 28 Javascript
第三篇Bootstrap网格基础
Jun 21 Javascript
完美实现八种js焦点轮播图(下篇)
Apr 20 Javascript
BootStrap tooltip提示框使用小结
Oct 26 Javascript
微信小程序实现滚动消息通知
Feb 02 Javascript
JS设计模式之访问者模式定义与用法分析
Feb 05 Javascript
RxJS在TypeScript中的简单使用详解
Apr 13 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
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
javascript中的隐式调用
2018/02/10 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
python刷投票的脚本实现代码
2014/11/08 Python
用Python创建声明性迷你语言的教程
2015/04/13 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
Python 变量类型详解
2018/10/10 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
python实现简单井字棋游戏
2020/03/04 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
python redis存入字典序列化存储教程
2020/07/16 Python
python判断变量是否为列表的方法
2020/09/17 Python
广州地球村科技数据库题目
2016/04/25 面试题
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
英语自荐信范文
2013/12/11 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
六查六看心得体会
2014/10/14 职场文书
2014年材料员工作总结
2014/11/19 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
2016年师德学习心得体会
2016/01/12 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书