冲突事件: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
    }
}

在以下情况下,没有错误,我可以登录:

  1. 我用鼠标点击login按钮
  2. 我在登录按钮未聚焦时按 Enter

但是下面的第三种情况,由于登录操作被调用两次而给我错误:

  1. 当我在登录按钮获得焦点时按 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>
    );
  }
}