冲突事件:onKeyPress&的onClick

时间:2017-04-09 07:05:47

标签: javascript html reactjs mobx mobx-react

我有一个像这样的人:

enter image description here

使用以下代码:

<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. 我用鼠标
  2. 点击login按钮
  3. 我按 Enter ,而登录按钮未聚焦
  4. 但是下面的第三种情况,由于登录操作被调用两次而给我错误:

    1. 当我按下 Enter 而登录按钮IS聚焦时(例如按 tab 键聚焦登录按钮)
    2. 我想知道什么是可以避免第三种情况错误的最佳做法。我查看了其他相关的SO问题,但我无法找出最佳实践。

      我忘了提及我在ReX中使用ReactJS。

2 个答案:

答案 0 :(得分:1)

通过将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>

答案 1 :(得分:1)

如果更适合您的用例,您还可以使用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>
    );
  }
}