在ReactJS onclick中传递参数

时间:2016-04-11 18:56:57

标签: javascript reactjs

我有这个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组件中。

我该怎么做?

1 个答案:

答案 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>
    }
})

2017年更新:

这是一个使用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完成的。