React组件中的绑定事件处理程序在呈现时触发onClick

时间:2016-09-25 22:11:52

标签: reactjs event-handling

我正在学习React。在我正在编写的测试应用程序中,我使用onClick方法渲染一些按钮。当它们像这样渲染时,它们会在单击时按预期工作并调用selectMode函数。

constructor(props) {
    super(props);
    this.state = { mode: 'commits', commits: [], forks: [], pulls: [] };
}    
...
selectMode(mode) {
    this.setState({ mode });
}    

render() {
...
return (<div>                
        <button onClick={this.selectMode.bind(this, 'commits')}>Show Commits</button><br/>
        <button onClick={this.selectMode.bind(this, 'forks')}>Show Forks</button><br/>
        <button onClick={this.selectMode.bind(this, 'pulls')}>Show Pulls</button>
        </div>
        )
}

但是当我尝试下面显示的建议最佳实践方法时,通过在构造函数中绑定,在呈现组件时会调用selectMode函数三次。为什么要调用onClick事件处理程序呢?我有什么不对?

constructor(props) {
    super(props);
    this.state = { mode: 'commits', commits: [], forks: [], pulls: [] };
    this.selectMode = this.selectMode.bind(this)
}
...
selectMode(mode) {
    this.setState({ mode });
}

render() {
...
return (<div>                
        <button onClick={this.selectMode('commits')}>Show Commits</button><br/>
        <button onClick={this.selectMode('forks')}>Show Forks</button><br/>
        <button onClick={this.selectMode('pulls')}>Show Pulls</button>
        </div>
        )
} 

2 个答案:

答案 0 :(得分:5)

每当呈现组件时,this.selectMode(...)都会立即执行。

<.. onClick={this.selectMode('commits')}..../> <-- function is called immediately

您可以使用arrow function创建一个匿名函数,您可以在其中调用您的方法。这样,只有在发生click事件时才会调用this.selectMode方法:

<.. onClick={() => this.selectMode('commits')}..../> 

如果您不想在每次渲染组件时创建匿名函数,则可以将值存储到元素的属性中。像这样:

constructor(props) {
 super(props);
 this.state = { mode: 'commits', commits: [], forks: [], pulls: [] };
 this.selectMode = this.selectMode.bind(this)
}
selectMode(event){
    this.setState({mode: e.target.name});
}
render(){
....
   <.. onClick={this.selectMode} name='commits' ..../> 
..}

答案 1 :(得分:1)

我不确定,但我认为这是因为你通过添加括号来调用每个onClick函数。如果您使用ES6,您可以尝试这样做:

onClick = () => { this.selectMode('commits') }
onClick = () => { this.selectMode('forks') }
onClick = () => { this.selectMode('pulls') }