美文网首页程序员
React map生成元素添加点击事件绑定this

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

作者: 是阿离 | 来源:发表于2017-10-24 20:56 被阅读0次

问题

使用.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出来的元素添加事件无法使用

有个疑问
在该问题中this报的是undefined,是在webpack打包时使用了严格模式?

参考文章

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

相关文章

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

    问题 使用.map(function(Item)生成元素添加onClick事件:onClick={this.pro...

  • (React)绑定事件(this的使用)

    前言 React开发中,给按钮添加点击事件,响应用户的点击 一、绑定事件 按照上述的方式,在事件绑定的方法内部,是...

  • jquery委托事件

    为未来新添加的节点绑定事件 以下例子只能通过点击第一个 p元素 来创建节点,点击 新生成的p元素 是不会有反应的。...

  • 对未来新添加的节点绑定事件

    为未来新添加的节点绑定事件 以下例子只能通过点击第一个 p元素 来创建节点,点击 新生成的p元素 是不会有反应的。...

  • 用::after添加文字后,不能点击

    一个元素绑定了点击事件,然后需要在元素上加一个文字。通过伪元素after实现,但是添加了之后,点击元素可以执行,但...

  • click点击一次,执行多次的bug

    累加绑定:在页面中为一个元素绑定事件,事件执行后页面未刷新且元素还在,然后你再次点击,元素又被绑定个一次点击事件,...

  • js为动态生成/添加的元素绑定事件

    有一段时间没有写js代码了,今天就说说js为动态生成/添加的元素绑定事件。 原理: 定位到需要绑定的元素(重点)-...

  • React事件

    react的事件绑定跟dom元素的事件绑定很相似,不过有些区别: React事件命名是驼峰而不是小写 用JSX语法...

  • vue使用腾讯地图(二)事件

    地图中添加点击事件 添加点击事件 qq.maps.event.addListener(map, 'click', ...

  • 事件高级一

    事件高级(一) 给元素添加事件的问题 事件绑定的意义当一个元素添加两个以上事件的时候 事件绑定:IE - atta...

网友评论

    本文标题:React map生成元素添加点击事件绑定this

    本文链接:https://www.haomeiwen.com/subject/hvvxpxtx.html