2017-03-15 8 views
0

基本的にフォームのないログインページがあり、ユーザーがenterを押したときにログインボタンのonClickをトリガーしたい。ReactでボタンのonClick on key pressをトリガーする

私はそうのようなページにイベントリスナーを追加してみました:

componentWillMount() { 
    const { handleKeyPress, username, password } = this.props; 
    document.addEventListener('keydown', (event, username, password) => handleKeyPress(event.key)); 
} 

問題はそのリスナーが時に小道具のユーザー名とパスワードが初期状態(にあることを意味する部品のマウントインスタンス化されていることです空の)。

同様の理由から、componentWillReceivePropsにイベントリスナーを追加することはできません。

基本的にこのソリューションでは、イベントリスナーの関数からユーザー名とパスワードを送信せず、代わりにイベントリスナーの関数が定義されているmapDispatchToPropsの状態からユーザー名とパスワードを取得する必要がありますが、醜い孤独。

<button 
    onEnterKeyPress={() => handleLogin(this.props.username, this.propspassword)} 
> 
    Log in 
</button> 

しかし、私の知る限りではそれを行う方法はありません..:

は私が初めに探していたことなど、基本的にonClickのに似て、ボタンにリスナーを追加しましたうまくいけば私は間違っている!誰かがアイディアを持っている場合は、共有してください。

答えて

1
constructor() { 
    super(); 
    this.handleKeyPress = this.handleKeyPress.bind(this); 
} 

componentWillMount() { 
    document.addEventListener('keydown', this.handleKeyPress); 
} 

handleKeyPress(event) { 
    if (event.keyCode !== 13) return; 

    const {handleLogin, username, password} = this.props; 

    handleLogin(username, password); 
} 

componentWillUnmount() { 
    document.removeEventListener('keydown', this.handleKeyPress); 
} 
+0

答え上記に加えて、このような作品としての機能にこれを結合: this.handleKeyPress = this.handleKeyPress.bind(この); MDTPで関数をインラインで作成するのと同じくらいうまくいきませんが、まともなソリューションです。ありがとう!あなたの答えを受け入れるには、あなたの答えを編集して、バインディングを加えてください。また、removeEventListener btwに2番目の引数を追加する必要があります。 –

+0

bindが追加されましたが、createClassを使用する場合は必要ありません:)幸いです! –

関連する問題