私は複雑なReactコンポーネント(反応ウィジェットのCombobox)を持っており、その動作の一部を変更したいと思います - onKeyDownイベントをオーバーライドしたいと思います。 Enterを押すと、私はそれを自分で処理したいのですが、コンボボックスはキーを押さないでください。それとは別に、私はドロップインの代わりになることを望んでいます。私は強く反応知っイベントハンドラをオーバーライドするサブクラスのコンポーネントですか?
は相続上の組成を推奨していますが、この場合には作曲が悪いようだ - 私はコンボボックスを含む新しいコンポーネントを作成する場合、私は、コンボボックスに、すべての小道具を転送する必要があると思います:
class MyCombobox extends Component {
render() {
return (<Combobox data={this.props.data}
value={this.props.value}
onChanged={this.props.onChanged}
...
/>);
}
}
このここ
// in MyContainer.render:
return (
<div className="MyContainer">
<Combobox data={...} onKeyDown={this.handleKeyDown} />
</div>
);
を:オリジナルのコンボボックスは、まだイベントを取得し、私のコンテナは、それを取得し、あまりにも - 私も普通のコンボボックスを含めて、その容器にonKeyDownメソッド設定しようとしたが、それは、イベントを上書きしませんでしたほぼ点の作品:
class MyCombobox extends Combobox {
handleKeyDown(event) {
console.log('MyCombobox.handleKeyDown', event);
console.log(this); // this: null!
if (event.key === 'Enter') {
event.preventDefault();
// super.close(); // fails
}
}
render() {
let result = super.render();
return React.cloneElement(result, {onKeyDown: this.handleKeyDown});
}
}
私はイベントをインターセプトし、それを処理してからコンボボックスを防ぐことができます。ただし、this
はnull
です。 handleKeyPress
を矢印関数にすると、this
(MyCombobox
オブジェクト)にアクセスできますが、Combobox
のいずれのプロパティにもアクセスできません。特にsuper.close()
は機能しません(「関数またはクラス以外の「スーパー」を取得します)。
ありがとうございました。本当にきちんとした、今私は構図を使用することができます...しかし、私は 'onKeyDown = {this.handleKeyDown}'を使ってイベントをフックしようとすると、私のコンポーネントと元のコンボボックスの両方がイベントを取得します。 – jdm
質問を更新して、その構成をどのように実行するかを示すことができますか? – pie6k
まあ、あなたが書いたとおりに試しましたが、うまくいきません。子コンポーネントのハンドラの前にハンドラをインストールする方法がないようです... – jdm