Mar*_*Duo 1 event-handling reactjs
我正在学习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>
)
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试如下所示的建议的最佳实践方法时,通过在构造函数中进行绑定,在呈现组件时会多次调用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>
)
}
Run Code Online (Sandbox Code Playgroud)
你this.selectMode(...)只要你的组件呈现立即执行。
<.. onClick={this.selectMode('commits')}..../> <-- function is called immediately
Run Code Online (Sandbox Code Playgroud)
您可以arrow function用来创建匿名函数,在其中可以调用方法。这样,您的this.selectMode方法仅在click事件发生时被调用:
<.. onClick={() => this.selectMode('commits')}..../>
Run Code Online (Sandbox Code Playgroud)
如果不想在每次渲染组件时都创建匿名函数,则可以将值存储到元素的属性。像这样 :
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' ..../>
..}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |