リンクをクリックした後にReactフォームを送信したい。
そのためには、リンクがクリックされた場合にプログラムでフォームを送信する必要があります。
私の問題は:onSubmit
ハンドラーがフォーム送信後に起動されないことです。
この目的のために作成したコードは次のとおりです。
var MyForm = React.createClass({
handleSubmit: function(e){
console.log('Form submited');
e.preventDefault();
},
submitForm : function(e){
this.refs.formToSubmit.submit();
},
render: function() {
return (
<form ref="formToSubmit" onSubmit={this.handleSubmit}>
<input name='myInput'/>
<a onClick={this.submitForm}>Validate</a>
</form>);
}
});
ReactDOM.render(
<MyForm name="World" />,
document.getElementById('container')
);
handleSubmit
は呼び出されず、デフォルトの動作(実行中のフォーム)が実行されます。これはReactJsのバグですか、それとも通常の動作ですか? onSubmitハンドラーを呼び出す方法はありますか?
私はこれで成功しています。これにより、クリック時にhandleSubmitがトリガーされます。お役に立てれば。
<form onSubmit={this.handleSubmit} ref={el => this.form = el}>
<a onClick={() => { this.form.dispatch(new Event('submit'))}}>Validate</a>
</form>
ここから見つかりました: https://github.com/facebook/react/issues/6796
現在のonSubmit
は、native形式ではなく、React SyntheticEvent のトリガーにバインドされていますそれは、this.refs.formToSubmit.submit();
がハンドラーをトリガーしない理由を説明します。私が知る限り、そのSyntheticEventを手動でトリガーしようとすることは、推奨または価値のある追求ではありません。
これを実現する慣用的な方法は、JSX/HTMLを構造化して<button>
または<input>
タイプの送信。どちらもhandleSubmit
ハンドラーをトリガーします。私の意見では、それは複雑さを軽減し、あなたのハンドラを統合し、あなたの最良の解決策であると思われます。
例えば.
<input type="submit" value="Validate" />
<button type="submit">Validate</button>
これと同じ問題がありましたが、修正できませんでした。 document.querySelector('form').submit()
を実行しても、onSubmit
ハンドラーはトリガーされません。目に見えない_<input type="submit">
_を含めてみましたが、それでも.submit()
はトリガーしません。そのため、不可視のサブミット(_style="display:none"
_)を保持し、その不可視のサブミットボタンで.click()
を実行するように変更しました。驚くことに、_display:none
_でも動作します。ただし、Firefoxでのみテストしました。
デフォルトでは、フォームrefがsubmit
に追加のコールバックをアタッチすることを期待すべきではありません。これは、DOM要素refs
などのプログラムで設定されたものを使用する場合、フレームワークの設計が不適切です。
ref
の未定の内部実装に依存する代わりに、必要なすべてのイベントを任意の順序でインスタンス化するには、ref
を使用する必要があります[form
要素によってインスタンス化される場合]。
これは動作します:
this.refs.formToSubmit.onSubmit();
this.refs.formToSubmit.submit();
実際のsubmit
は常に最後に来る必要があります。
アンカータグは送信イベントをトリガーしないため、アンカータグではなく送信タイプの入力タグを使用する必要があります。
render: function() {
return (
<form ref="formToSubmit" onSubmit={this.handleSubmit}>
<input name='myInput'/>
<input onClick={this.submitForm} type="submit" value="Validate" />
</form>
);
}
これはReactとは関係ありません。これはDOM APIの「機能」です。.submit()
メソッドはsubmit
イベントを実際に起動せず、入力検証もトリガーしません。 http://codetheory.in/javascript-fire-onsubmit-by-calling-form-submit/ を参照してください。
考えられる回避策は、提案されているように、送信ボタンを作成し、プログラムで.click()
を呼び出すことです。または、プログラムでsubmit
イベントをnew Event()
で作成し、.dispatchEvent()
を使用してディスパッチできます。ただし、new Event()
はIEでは使用できません。