私たちはフォームで検証を提供するために上位コンポーネントを使用しており、すべての変更イベントに対処する責任があります。私が抱えている問題は、onChange
ハンドラをラップされたコンポーネント自体に追加することができないことにあります。そのため、HoCはdivにラップします。我々は実際にはは余分なdivに感謝しないフレックスベースのグリッドシステムを持っています。Reactコンポーネントをルート要素のバブリング変更イベントにリッスンさせることはできますか?
HOCは基本的に次のようになります。
function withValidation(TargetComponent, options = {}) {
class ValidatingComponent extends Component {
...
render() {
return (
<div
ref={(_target) => { this._target = _target; }}
onChange={this.onChange}
>
<TargetComponent
{...this.props}
{...this.state}
onSubmit={this.onSubmit}
/>
</div>
);
}
}
return ValidatingComponent;
}
私が試した最初のものは、単に
render() {
return (
<TargetComponent
{...this.props}
{...this.state}
ref={(_target) => { this._target = _target; }}
onChange={this.onChange}
onSubmit={this.onSubmit}
/>
)
}
ラッパーを削除しかし、それはちょうど包まコンポーネントへの小道具としてonChange
を渡すとしました私はそれを手動で呼び出す必要はありません。私は、通常のバニライベントリスナーを取り付けることを試みた。
componentDidMount() {
findDOMNode(this._target).addEventListener('change', this.onChange);
}
しかし、それはうまくいかなかった。 onChange
は決して誘発されませんでした。私は、それが何か合成的イベントを捕まえていないと推測しています。
Reactコンポーネントが自分自身で変更イベントをリッスンする方法はありますか?私は関連する<input>
に到達してそこから呼び出すまで、そのコールバックをコンポーネントツリーの下に通す必要は本当にありません。
私はこの質問がthis oneに似ているように思っていますが、カスタムDOMイベントを扱っています。私はそうではありません。場合
EDIT
私はそれがhereだ、私もバイオリンを作った私がやろうとしているかについて明確にされていませんでした。 <TargetComponent />
がdiv
でラップされていて、onChangeハンドラがそのdivに接続されている場合、フォームは機能しますが、onChange
がTargetComponent自体の小道具として渡されたばかりです。実際にイベントを聞き、関数を渡すだけではなく、私のHoCに伝えるために何らかの方法が必要です。私はここに入力をラップしていません、私はフォーム全体をラッピングしています。
コンポーネントにイベントハンドラをアタッチする方法を尋ねていますか? 'on'で' onClick'や 'onChange'を実行するとどうなりますか? –
@ Sag1vはい、それは私が求めていることです。高位コンポーネントのラッパーは、プロジェクト全体を通して広範囲にわたって使用され、他のフォームコンポーネントをラップします。もし 'onChange'を直接' 'に添付すると、コードベース全体を 'onChange = {this.props.onChange } 'すべての形式のすべての ''に表示されます。むしろそうする必要はなく、イベントのバブリングに頼る必要があります。 – ivarni
よろしくお願いします.HOCを通すのはどうしたらいいですか? (あなたの例のように) –