详解三种方式在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 相关文章推荐
javascript打开新窗口同时关闭旧窗口
Jan 16 Javascript
javascript实现图片切换的幻灯片效果源代码
Dec 12 Javascript
浏览器兼容console对象的简要解决方案分享
Oct 24 Javascript
分享两段简单的JS代码防止SQL注入
Apr 12 Javascript
Vue.js实现简单动态数据处理
Feb 13 Javascript
jQuery实现动态显示select下拉列表数据的方法
Feb 05 jQuery
Vue实现active点击切换方法
Mar 16 Javascript
vue filters的使用详解
Jun 11 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
Jul 06 Javascript
微信小程序点击列表跳转到对应详情页过程解析
Sep 26 Javascript
Vue.js 无限滚动列表性能优化方案
Dec 02 Javascript
js实现列表向上无限滚动
Jan 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
php 变量未定义等错误的解决方法
2011/01/12 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
dedecms集成财付通支付接口
2014/12/28 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
js动态生成指定行数的表格
2013/07/11 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
python3调用R的示例代码
2018/02/23 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
python打包成so文件过程解析
2019/09/28 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
搬家公司的创业计划书
2014/01/01 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
留学推荐信范文
2014/05/10 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
办公用品管理制度
2015/08/04 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技