详解三种方式在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 相关文章推荐
stream.js 一个很小、完全独立的Javascript类库
Oct 28 Javascript
js判断选择的时间是否大于今天的代码
Aug 20 Javascript
Js判断CSS文件加载完毕的具体实现
Jan 17 Javascript
JavaScript实现的一个日期格式化函数分享
Dec 06 Javascript
jQuery中wrapAll()方法用法实例
Jan 16 Javascript
javascript中Date对象应用之简易日历实现
Jul 12 Javascript
jQuery中delegate()方法的用法详解
Oct 13 Javascript
原生JavaScript实现AJAX、JSONP
Feb 07 Javascript
AngularJS路由实现页面跳转实例
Mar 03 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
Apr 28 Javascript
Vue实现搜索结果高亮显示关键字
May 28 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
Nov 01 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中文汉字验证码
2007/04/08 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
php生出随机字符串
2017/07/06 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
Angular2之二级路由详解
2018/08/31 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
在Python中使用第三方模块的教程
2015/04/27 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
Python3爬虫学习入门教程
2018/12/11 Python
对Python _取log的几种方式小结
2019/07/25 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
韩国现代百货官网:Hmall
2018/03/21 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
最新教师自我评价分享
2013/11/12 职场文书
运动会广播稿50字
2014/01/26 职场文书
节能环保标语
2014/06/12 职场文书
JavaScript实现两个数组的交集
2022/03/25 Javascript