我有这个React组件,它包含从列表生成的项目(带有map函数)。每个元素都有一个按钮。我希望此按钮的onclick按钮传入一个参数,以识别单击了哪个列表项的按钮。
它看起来像这样。
var Component = React.createClass({
assignItem: function(item){
this.setState({item:item})
},
render: function(){
var listItems = list.map(function(item){
return <div>{item}
<button onClick={this.assignItem(item)>Click</button>
</div>
})
return <div>{listItems}</div>
}
})
当然,这不起作用。错误消息表明this.assignItem不是函数。 我知道官方的React文档表明了这一点:
var handleClick = function(i, props) {
console.log('You clicked: ' + props.items[i]);
}
function GroceryList(props) {
return (
<div>
{props.items.map(function(item, i) {
return (
<div onClick={handleClick.bind(this, i, props)} key={i}>{item}</div>
);
})}
</div>
);
}
ReactDOM.render(
<GroceryList items={['Apple', 'Banana', 'Cranberry']} />, mountNode
);
但是它适用于组件外部的函数。因为我希望我的函数操作状态,所以我想将它保留在React组件中。
我该怎么做?
答案 0 :(得分:11)
您可以bind
使用this
上的函数,就像React示例一样,但是,由于您要使用map
回调进行渲染,因此您需要pass in thisArg
或使用胖箭功能:
var Component = React.createClass({
assignItem: function(item){
this.setState({item:item})
},
render: function(){
// bind to this.assignItem
var listItems = list.map(function(item){
return <div>{item}
<button onClick={this.assignItem.bind(this, item)}>Click</button>
</div>
}, this); // pass in this, or use fat arrow map callback
return <div>{listItems}</div>
}
})
这是一个使用old React API的老问题和相应的旧答案。今天你应该使用class or functional React component API。要将参数传递给点击处理程序,您只需编写内联fat arrow function并使用您想要的任何参数调用。以上示例最终结果如下:
class MyComponent extends React.Component { // or React.PureComponent
assignItem = item => { // bound arrow function handler
this.setState({ item: item });
}
render() {
var listItems = list.map(item => {
// onClick is an arrow function that calls this.assignItem
return <div>{item}
<button onClick={e => this.assignItem(item)}>Click</button>
</div>
});
return <div>{ listItems }</div>
}
}
注意:assignItem
处理程序必须绑定,这是使用箭头函数class property完成的。