React map生成元素添加點擊事件綁定this

問題

使用.map(function(Item)生成元素添加onClick事件:onClick={this.provinceChange.bind(this, "99")}時,前臺訪問報錯:Uncaught TypeError: Cannot read property 'provinceChange' of undefined
provinceChange是在class中定義的方法:javascript

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

解決

原調用provinceChange方法代碼以下:html

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
修改方法有:
一、bind(this)java

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

二、將this作爲參數傳入:閉包

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

三、在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>
  );
}

四、將waveProvinceArr.map(function(waveProvinceItem)方法換成在render或者方法中使用push生成:
能夠參考:【原】React中,map出來的元素添加事件沒法使用this

參考文章

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

相關文章
相關標籤/搜索