Reactコンポーネントです。これは多かれ少なかれ、ユーザーが入力できるシンプルなテキストエリアです。これまでのコードは次のようになります。
import React from 'react';
import {connect} from 'react-redux';
function handleChange(event) {
const {setText} = this.props;
//is there some way I can detect [ENTER] here and call this.props.add instead?
setText(event.target.value);
}
class TextArea extends React.Component {
constructor(props) {
super(props);
}
render() {
const {value} = this.props;
return (
<div className="list-item">
<textarea
className="form-control"
value={value}
onChange={handleChange.bind(this)}
/>
</div>
);
}
}
function mapStateToProps(state) {
return {
value: state.value
}
}
function mapDispatchToProps(dispatch) {
return {
setText(text) {
const action = {
type: 'set-text',
text: text
};
dispatch(action);
},
add() {
const action = {
type: 'add'
};
dispatch(action);
}
}
}
export default connect(mapStateToProps, mapDispatchToProps)(TextArea)
このコンポーネントは、ユーザーがテキスト領域に何かを入力するたびに更新されるreduxストアに接続されます。 reduxストアは新しい値をtextareaコンポーネントに送り返し、textareaコンポーネントは再レンダリングして新しい値を表示します。
これはこれまでのところ機能していますが、Enterキーが押された場合、このコンポーネントの動作が異なることを望みます。変更イベントはkeyCodeを公開しないので(少なくとも私は気づいていませんが)、Enterキーが_の場合にhandleChange
関数がadd
propを呼び出す方法がわかりませんsetText
propを呼び出す代わりに押されました。
代わりにonKeyDown
ハンドラーをtextareaにアタッチして、enter keyCode(13)の検出に使用できましたが、keyCodeを変換するとテキストを正しく設定できませんでしたイベントに文字を添付して現在の値に追加した場合、大文字にするか小文字にするかを判断する方法はありません。
私はかなりここで立ち往生しています。変更イベントでEnterキーを検出する方法は本当にないと思います。また、keyDownイベントには、考えられるすべての入力を処理する方法がありません。おそらく2つを組み合わせることができる方法はありますか?
前もって感謝します!
両方のハンドラーを同時に使用できます。
OnKeyDownでは、キーを確認できます。 ENTERが押されている場合は、onChange
呼び出しを防ぐためにevent.preventDefault()
を呼び出します。そうでない場合は、何もしません。
Javascriptイベントキューには、change
イベントのデフォルトハンドラーが呼び出されるまで、keydown
イベントが含まれません。 onKeyDown
ハンドラーでevent.preventDefault()
を呼び出した場合、change
イベントは発生しません。