我想在用户点击删除按钮时删除li。所以我传递了索引,但是在我点击它之前它被触发了,我想我传递的值是错误的。
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'));
答案 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
函数的单独组件是更好的解决方案。