React map生成元素添加点击事件绑定this

问题

使用.map(function(Item)生成元素添加onClick事件:onClick={this.provinceChange.bind(this,"99")}时,前台访问报错:Uncaught TypeError: Cannot read property 'provinceChange' of undefined
provinceChange是在class中定义的方法

provinceChange: function(selectedProvince){
  this.setState({
    province : selectedProvince
  });
},

解决

调用provinceChange方法代码如下:

render: function() {
  let waveProvinceArr = this.state.waveProvinceList;
  return (
    <div>
      <div>
        {
          waveProvinceArr.map(function(waveProvinceItem){
            return <button type="button" onClick={this.provinceChange.bind(this,waveProvinceItem)}>{waveProvinceItem}</button>
          })
        }
      </div>
    </div>
  );
}

通过分析为this在嵌套函数中,而嵌套函数可以通过闭包捕获父函数的变量,但是这个函数没有继承this,所以导致this指向不明报错undefined
修改方法有:
1、bind(this)

{
  waveProvinceArr.map(function(waveProvinceItem){
    return <button type="button" onClick={this.provinceChange.bind(this,waveProvinceItem)}>{waveProvinceItem}</button>
  }.bind(this))
}

2、将this做为参数传入:

{
  waveProvinceArr.map(function(waveProvinceItem){
    return <button type="button" onClick={this.provinceChange.bind(this,waveProvinceItem)}>{waveProvinceItem}</button>
  },this)
}

3、在render中将this捕获为self,使用this时改为使用self

render: function() {
  let waveProvinceArr = this.state.waveProvinceList;
  let self = this;
  return (
    <div>
      <div>
        {
          waveProvinceArr.map(function(waveProvinceItem){
            return <button type="button" onClick={self.provinceChange.bind(self,waveProvinceItem)}>{waveProvinceItem}</button>
          })
        }
      </div>
    </div>
  );
}

4、将waveProvinceArr.map(function(waveProvinceItem)方法换成在render或者方法中使用push生成
可以参考:【原】React中,map出来的元素添加事件无法使用

参考文章

JavaScript中的this陷阱的最全收集--没有之一
严格模式详解
MDN中Function.prototype.bind()

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...