onClick事件在点击之前触发反应

时间:2016-10-05 13:03:08

标签: javascript reactjs

我想在用户点击删除按钮时删除li。所以我传递了索引,但是在我点击它之前它被触发了,我想我传递的值是错误的。

http://jsfiddle.net/axhpuepq

var App = React.createClass({
   getInitialState(){
     return {
       items:[1,2,3],
       isEdit: false
     }
   },
   renderEditForm(){
   return(
   <div>
   <input type="text" />
   <button onClick={this.saveHandler}>save</button>
   </div>
   )
   },
   ItemCtrl(index){
   return(
   <div className="itemCtrlWrap">
   <button onClick={this.editHandler}>Edit</button>
   <button onClick={this.dltHandler(index)}>Delete</button>
   </div>
   )
   },
   editHandler(){
   this.setState({isEdit:true})
   },
   saveHandler(){
    this.setState({isEdit:false})
   },
   dltHandler(index){
     console.log(index) //shall recieve index here upon click
   },
   renderItem(){
     return(
       this.state.items.map((item,i)=>
         <li key={i}> {this.state.isEdit ? this.renderEditForm() : item} {this.ItemCtrl(i)}</li>)
     )
   },
   render(){
      return(
        <ul>
          {this.renderItem()}
        </ul>
      )
   }
})

React.render(<App />, document.getElementById('container'));

2 个答案:

答案 0 :(得分:1)

您正在执行该功能,而不仅仅是设置它,在这里:

onClick={this.dltHandler(index)}

如果你想传递一些参数绑定它们。像:

onClick={this.dltHandler.bind(this, index)}

或使用箭头功能:

onClick={() => this.dltHandler(index)}

如果您注意到,我们在设置函数时将其声明为onClick。而这个函数只是执行dltHandler

答案 1 :(得分:0)

当您像这样定义onClick时,它会在实例化时调用该函数。您需要使用bind或定义匿名函数:

   <button onClick={this.dltHandler.bind(this, index)}>Delete</button>

   <button onClick={() => this.dltHandler(index)}>Delete</button>

这两个函数都将函数传递给onClick处理程序 - 但是在onClick被触发之前它们不会执行。请注意,执行此操作将导致在每个渲染调用上生成新函数。如果你经常渲染,这在计算上可能很昂贵。

如果性能成为问题,那么将按钮重构为具有已定义dltHandler函数的单独组件是更好的解决方案。