[解決済み】ReactJS - "setState "が呼ばれるたびにrenderが呼び出されるのですか?
質問
Reactは毎回すべてのコンポーネントとサブコンポーネントを再レンダリングするのですか?
setState()
が呼び出されますか?
もしそうなら、なぜ?Reactは状態が変化したときに必要な分だけレンダリングするという考え方だと思ったのですが。
次の簡単な例では、テキストがクリックされると両方のクラスが再びレンダリングされます。ただし、onClick ハンドラは常に
state
を同じ値に設定します。
this.setState({'test':'me'});
レンダーが発生するのは
state
のデータが変更されました。
以下は例のコードです。 JS Fiddleとして と埋め込みスニペットです。
var TimeInChild = React.createClass({
render: function() {
var t = new Date().getTime();
return (
<p>Time in child:{t}</p>
);
}
});
var Main = React.createClass({
onTest: function() {
this.setState({'test':'me'});
},
render: function() {
var currentTime = new Date().getTime();
return (
<div onClick={this.onTest}>
<p>Time in main:{currentTime}</p>
<p>Click me to update time</p>
<TimeInChild/>
</div>
);
}
});
ReactDOM.render(<Main/>, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react-dom.min.js"></script>
解決方法は?
<ブロッククオートReactは、setStateが呼ばれるたびに、すべてのコンポーネントとサブコンポーネントを再レンダリングするのでしょうか?
デフォルトでは、「はい」です。
メソッドがあります。 boolean shouldComponentUpdate(object nextProps, object nextState) 各コンポーネントはこのメソッドを持っており、quot;コンポーネントを更新する必要があるかどうかを決定する役割を担っています。 レンダー 関数)?" を変更するたびに 状態 を渡すか、新しい プロップス を親コンポーネントから取得します。
の実装は自分で書くことができます。 shouldComponentUpdate しかし、デフォルトの実装は常に true を返します。つまり、常にレンダー関数を再実行することになります。
公式ドキュメントより引用 http://facebook.github.io/react/docs/component-specs.html#updating-shouldcomponentupdate
<ブロッククオートデフォルトでは、shouldComponentUpdateは、常にtrueを返すようになっています。 その場でステートが変更された場合の微妙なバグに注意する必要がありますが 常にステートをイミュータブルとして扱い、プロップとステートから読み取り専用にします。 を使用すれば、shouldComponentUpdateをオーバーライドできます。 古いプロップとステートを比較する実装があります。 を置換する。
質問の次の部分です。
もしそうなら、なぜ?私は、Reactは状態が変化したときに必要な分だけレンダリングするという考え方だと思っていました。
レンダーと呼ばれるものには、2つの段階があります。
-
仮想DOMのレンダリング:以下の場合 レンダー メソッドが呼び出されると、新しい 仮想ドーム の構造体を作成します。先に述べたように、この レンダー を呼び出すと、常にメソッドが呼び出されます。 setState() なぜなら shouldComponentUpdate はデフォルトで常に真を返します。つまり、デフォルトでは、Reactではここでの最適化は行われないのです。
-
ネイティブDOMレンダリング。Reactは、Virtual DOMで変更された場合のみ、必要な分だけブラウザ上の実DOMノードを変更します。これは、実DOMの変異を最適化してReactを高速化する、あの素晴らしいReactの機能です。
関連
-
[解決済み] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングした
-
[解決済み】jquery $.ajaxオブジェクトのresponseJSONプロパティを取得する方法 [重複]。
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】SyntaxError: 期待された式が、'<'を得た。
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?
-
[解決済み】module.exports "モジュールが定義されていません"
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み】JavaScriptのinnerHTMLで要素が更新されない
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み】WebSocket接続に失敗しました。WebSocket のハンドシェイク中にエラーが発生しました。予期しない応答コードです。400
-
[解決済み】TypeError: res.status は関数ではありません。
-
[解決済み】Syntax error: JavaScriptの不正なreturnステートメント
-
[解決済み] [Solved] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングする