[解決済み] JSX propsは.bind()を使用しないでください - bindを使用しないようにするにはどうしたらいいですか?
質問
コンテナで、フォームを表示したり、成功ページを表示したりするUIフォームを変更する必要があります。
コンテナには state.showSuccess があり、MyFormModule が状態を変更するためにコンテナを呼び出すことができるようにする必要があります。
以下のコードは動作しますが、以下の警告が表示されます。
JSXプロップは
.bind()
.bind()を使わずに動作させるにはどうしたらいいですか?
...
const myPage = class extends React.Component {
state = { showSuccess: false };
showSuccess() {
this.setState({
showSuccess: true,
});
}
render() {
const { showSuccess } = this.state;
if (showSuccess) {...}
....
<MyFormModule showSuccess={this.showSuccess.bind(this)} />
解決方法は?
まず 理解する WHY これは悪い習慣です .
ここでの主な理由は
.bind
は新しい関数参照を返しています。
この現象は、それぞれの
render
を呼び出すと、パフォーマンスが低下する可能性があります。
2つの選択肢があります。
-
コンストラクタを使用して
bind
ハンドラ(これは 一度だけ ).constructor(props) { super(props); this.showSuccess = this.showSuccess.bind(this); }
-
また、ハンドラを作成する場合は 矢印関数 を使用するようにします。 のレキシカルコンテキストを使用します。
this
そのためbind
それらを をすべて( babelプラグインが必要です。 ):showSuccess = () => { this.setState({ showSuccess: true, }); }
あなたは ではなく は、このパターンを使用します(他の方のご指摘の通りです)。
showSuccess={() => this.showSuccess()}
なぜなら、これはレンダリングごとに新しい関数を作成するのと同じだからです。
そのため、警告を回避することはできても、バッドプラクティスの設計でコードを書いていることになります。
から ESLintドキュメント :
JSXプロップ内のバインドコールや矢印関数は、まったく新しい 関数がレンダリングされるたびに発生します。これはパフォーマンスにとって悪いことです。 ガベージコレクタが必要以上に呼び出されることになります。 必要です。また、新しい 関数がプロップとして渡され、そのコンポーネントが参照用の の等価性チェックを行い、更新すべきかどうかを判断します。
関連
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】Javascript - ERR_CONTENT_LENGTH_MISMATCH
-
[解決済み] 正規表現で変数を使うには?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] ES6インポートで中括弧を使用するのはどのような場合ですか?
-
[解決済み】 {this.props.children} に props を渡すには?}
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み] エラー。モジュールhtmlが見つからない
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】XMLパースエラー:ルート要素が見つからない コンソールの場所 FF
-
[解決済み】ES6マップオブジェクトをソートすることは可能ですか?
-
[解決済み】Syntax error: JavaScriptの不正なreturnステートメント
-
[解決済み】TypeError: AngularJSで未定義のプロパティ'get'を読み取れない