使用.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