冲突事件:onKeyPress & onClick
Conflicting events: onKeyPress & onClick
我有这样的发件人:
使用以下代码:
<form onKeyPress={this.login.bind(this)}>
<input type="text" placeholder="username"/>
<input type="password" placeholder="password"/>
<button type="button" onClick={this.login.bind(this)}>Log In</button>
</form>
虽然我有如下 login()
方法:
login(e){
if((e.type==='keypress' && e.which===13) || e.type==='click'){
//Do login operations:
this.props.store.login()//the method inside MobX store
}
}
在以下情况下,没有错误,我可以登录:
- 我用鼠标点击
login
按钮
- 我在登录按钮未聚焦时按 Enter
但是下面的第三种情况,由于登录操作被调用两次而给我错误:
- 当我在登录按钮获得焦点时按 Enter(例如,登录按钮通过按 tab 键获得焦点)
我想知道避免第三种情况错误的最佳做法是什么。我查看了其他相关的 SO 问题,但我无法找出最佳做法。
我忘了说我正在使用 ReactJS 和 MobX。
通过将 onKeyPress
属性从 <form>
标签移动到文本类型 <input>
标签来解决问题:
<form>
<input type="text" placeholder="username" onKeyPress={this.login.bind(this)}/>
<input type="password" placeholder="password" onKeyPress={this.login.bind(this)}/>
<button type="button" onClick={this.login.bind(this)}>Log In</button>
</form>
如果 onSubmit
事件更适合您的用例,您也可以使用它:
示例 (JS Bin)
class App extends Component {
login = (e) => {
e.preventDefault();
console.log('login');
}
render() {
return (
<form onSubmit={this.login}>
<input type="text" placeholder="username" />
<input type="password" placeholder="password" />
<button type="submit">Log In</button>
</form>
);
}
}
我有这样的发件人:
使用以下代码:
<form onKeyPress={this.login.bind(this)}>
<input type="text" placeholder="username"/>
<input type="password" placeholder="password"/>
<button type="button" onClick={this.login.bind(this)}>Log In</button>
</form>
虽然我有如下 login()
方法:
login(e){
if((e.type==='keypress' && e.which===13) || e.type==='click'){
//Do login operations:
this.props.store.login()//the method inside MobX store
}
}
在以下情况下,没有错误,我可以登录:
- 我用鼠标点击
login
按钮 - 我在登录按钮未聚焦时按 Enter
但是下面的第三种情况,由于登录操作被调用两次而给我错误:
- 当我在登录按钮获得焦点时按 Enter(例如,登录按钮通过按 tab 键获得焦点)
我想知道避免第三种情况错误的最佳做法是什么。我查看了其他相关的 SO 问题,但我无法找出最佳做法。
我忘了说我正在使用 ReactJS 和 MobX。
通过将 onKeyPress
属性从 <form>
标签移动到文本类型 <input>
标签来解决问题:
<form>
<input type="text" placeholder="username" onKeyPress={this.login.bind(this)}/>
<input type="password" placeholder="password" onKeyPress={this.login.bind(this)}/>
<button type="button" onClick={this.login.bind(this)}>Log In</button>
</form>
如果 onSubmit
事件更适合您的用例,您也可以使用它:
示例 (JS Bin)
class App extends Component {
login = (e) => {
e.preventDefault();
console.log('login');
}
render() {
return (
<form onSubmit={this.login}>
<input type="text" placeholder="username" />
<input type="password" placeholder="password" />
<button type="submit">Log In</button>
</form>
);
}
}