详解三种方式在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 相关文章推荐
jquery 弹出登录窗口实现代码
Dec 24 Javascript
JavaScript Event学习第三章 早期的事件处理程序
Feb 07 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
Jul 01 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
Jul 21 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
Sep 04 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
Mar 02 Javascript
Node学习记录之cluster模块
May 31 Javascript
JavaScript实现三级联动效果
Jul 15 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
Aug 08 Javascript
JS中DOM元素的attribute与property属性示例详解
Sep 04 Javascript
Vue利用Blob下载原生二进制数组文件
Sep 25 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边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
Adodb的十个实例(清晰版)
2006/12/31 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
原生JS实现pc端轮播图效果
2020/12/21 Javascript
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
python中wheel的用法整理
2020/06/15 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
HTML5通用接口详解
2016/06/12 HTML / CSS
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
new修饰符是起什么作用
2015/06/28 面试题
初中三年毕业生的自我评价分享
2014/02/14 职场文书
企业授权委托书范本
2014/09/22 职场文书
2014年仓库工作总结
2014/11/20 职场文书
小学母亲节活动总结
2015/02/10 职场文书
python requests模块的使用示例
2021/04/07 Python
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
python神经网络ResNet50模型
2022/05/06 Python