React jsの「マウント」とは何ですか?


128

ReactJSの学習中に、「マウント」という用語を何度も聞いています。そして、この用語に関してライフサイクルの方法とエラーがあるようです。Reactはマウントとはどういう意味ですか?

例: componentDidMount() and componentWillMount()

回答:


138

Reactの主な仕事は、コンポーネントを画面にレンダリングしたいものと一致するようにDOMを変更する方法を理解することです。

Reactは、「マウント」(DOMへのノードの追加)、「アンマウント」(DOMからのノードの削除)、および「更新」(すでにDOMにあるノードに変更を加える)によってこれを行います。

ReactノードをDOMノードとして表す方法と、それがDOMツリーのどこにいつ表示されるかは、トップレベルのAPIによって管理されます。何が起こっているかについてのより良いアイデアを得るために、可能な最も簡単な例を見てください:

// JSX version: let foo = <FooComponent />;
let foo = React.createElement(FooComponent);

それで、それは何でfooあり、あなたはそれで何ができますか?foo現時点では、これはおおよそ次のような(単純化された)単純なJavaScriptオブジェクトです。

{
  type: FooComponent,
  props: {}
}

現在、ページのどこにもありません。つまり、DOM要素ではなく、DOMツリーのどこにも存在せず、React要素ノードであることを除いて、ドキュメント内で他の意味のある表現はありません。このReact要素がレンダリングされる場合、画面上にが必要かをReactに伝えるだけです。まだ「マウント」されていません。

以下を呼び出すことで、それをDOMコンテナーに「マウント」するようReactに指示できます。

ReactDOM.render(foo, domContainer);

これはfoo、ページに表示する時間であることをReactに伝えます。ReactはFooComponentクラスのインスタンスを作成し、そのrenderメソッドを呼び出します。それがをレンダリングするとしましょう。<div />その場合、ReactはdivDOMノードを作成し、それをDOMコンテナーに挿入します。

Reactコンポーネントに対応するインスタンスとDOMノードを作成し、それらをDOMに挿入するこのプロセスは、マウントと呼ばれます。

通常はReactDOM.render()、ルートコンポーネントをマウントするように呼び出すだけであることに注意してください。子コンポーネントを手動で「マウント」する必要はありません。親コンポーネントがを呼び出しsetState()、そのrenderメソッドが特定の子を初めてレンダリングする必要があると言うたびに、Reactはこの子を自動的に親に「マウント」します。


9
お電話の際にReact.createElement(FooComponent)は、のインスタンスを作成していないことを指摘しておきますFooComponentfooは、FooComponentReact要素とも呼ばれる仮想DOM表現です。しかし、多分それはあなたがFooComponentReactタイプによって意味したものです。かかわらず、あなたが反応に部品をマウントしていない、あなたは順番にそのレンダリングを呼び出すかもしれない実際のDOMノードは、DOMツリー内のコンポーネントを表すために作成する必要がある場合に部品を実装します。実際のマウントは、これが初めて発生するイベントです。
John Leidegren

5
マウントとは、ReactコンポーネントインスタンスをDOMノードにアタッチすることを指します。これは、後続のレンダーコールでツリーの差分/増分レンダーの更新を行うために必要です。
John Leidegren

3
この回答は既に受け入れられているため、自由に編集しましたが、かなりの誤解がありました(たとえばfindDOMNode、React要素で実行できない)。
Dan Abramov

1
@Rahaminのアンマウントは、コンポーネントが削除または交換されたときに発生します。レンダリングが行われないようにシーン間を移動した場合、アンマウント信号は保証されません。componentWillUnmountは、ページのアンロードと同じではありません。
John Leidegren

1
@Yossiはここに明示的にマウントしての例です国連テストスイートで部品を実装:stackoverflow.com/a/55359234/6225838
CPHPython

38

Reactは同形/普遍的なフレームワークです。これは、UIコンポーネントツリーの仮想表現があり、ブラウザで出力される実際のレンダリングとは別であることを意味します。ドキュメントから:

ReactはDOMと直接通信することがないため、非常に高速です。Reactは、DOMの高速なメモリー内表現を維持します。

ただし、そのインメモリ表現はブラウザーのDOMに直接関連付けられていません(たとえそれが仮想DOMと呼ばれていても、ユニバーサルアプリフレームワークでは残念で紛らわしい名前です)、それはDOMのようなデータです-すべてのUIコンポーネント階層と追加のメタデータを表す構造。仮想DOMは単なる実装の詳細です。

「私たちは、Reactの真の基礎は、コンポーネントと要素のアイデアにすぎないと考えています。レンダリングしたいものを宣言的な方法で説明できることです。これらは、これらすべての異なるパッケージで共有される部分です。特定のレンダリングに固有のReactの部分ターゲットは通常、Reactについて考えるときに私たちが考えるものではありません。」-React js Blog

したがって、結論は、Reactはレンダリングにとらわれないということです。つまり、最終出力が何であるかを気にしません。ブラウザのDOMツリーでも、XML、ネイティブコンポーネント、JSONでもかまいません。

「react-native、react-art、react-canvas、react-threeなどのパッケージを見ると、Reactの美しさと本質はブラウザーやDOMとは何の関係もないことが明らかになりました。」-React js Blog

これで、Reactの仕組みがわかったので、質問に簡単に答えることができます。

マウントは、コンポーネントの仮想表現を最終的なUI表現(DOMまたはネイティブコンポーネントなど)に出力するプロセスです。

DOMツリーの実際のDOM要素(HTML divまたはli要素など)にReact要素を出力することを意味するブラウザー。ネイティブアプリケーションでは、React要素をネイティブコンポーネントに出力することを意味します。勇気があれば、独自のレンダラーを記述して、ReactコンポーネントをJSONまたはXML、さらにはXAMLに出力することもできます。

したがって、コンポーネントがマウントされたときにのみコンポーネントが出力/レンダリングされることを確認できるので、ハンドラーのマウント/アンマウントはReactアプリケーションにとって重要です。ただし、componentDidMountハンドラーは、実際のUI表現(DOMまたはネイティブコンポーネント)にレンダリングする場合にのみ呼び出されますがrenderToString、を使用してサーバー上のHTML文字列にレンダリングする場合は呼び出されません。これは、コンポーネントが実際にマウントされるまで実際にマウントされないためです。ブラウザで実行します。

そして、はい、あなたが私に尋ねるなら、マウンティングは不幸な/紛らわしい名前でもあります。私見componentDidRendercomponentWillRenderはるかに良い名前になります。


6
誰かが別のフォーラムからこの答えを私に指摘した。コンポーネントが一度マウントされた後に小道具が変更さcomponentDidRenderれるcomponentDidMountと、コンポーネントが複数回レンダリングされる可能性があるため、代わりになるとは思いません。
Gaurav、

@TheMinister元々同形ではなかったため、「仮想DOM」ライブラリと呼ばれていましたが、実際には最初からDOMに関連付けられていました。同型にするのは後付けでした。
Isiah Meadows

だから、マウントレンダーと交換可能ですか?その場合、次の各仮説に対してコンポーネントがマウント/レンダリングされるのは本当ですか?(id === that.id) ? <Component /> : null| /app/items/:id| this.setState(...)
コーディ

1
/ react-js-the-king-of-universal-apps /へのリンクが壊れている
Michael Freidgeim

壊れたリンクを削除するために投稿を2回編集しました/react-js-the-king-of-universal-apps/編集コメントは壊れたリンクであることを明確に述べています)が、ピアは両方とも編集を拒否しました。誰かが回答を編集して壊れたリンクを削除する際の問題点を教えてくれますか?
Aaditya Sharma

12

マウントとは、React内のコンポーネント(作成されたDOMノード)がドキュメントの一部に添付されることを指します。それでおしまい!

Reactを無視すると、これらの2つのネイティブ関数をマウントと考えることができます。

replaceChild

appendChild

Reactが内部マウントに使用する最も一般的な機能はどれでしょうか。

のことを考える:

componentWillMount ===マウント前

そして:

componentDidMount ===アフターマウント


取り付けがに似ている場合appendChild、何renderですか?
Deke、

renderマウント自体を行う実際の方法と言えるでしょう。したがって、componentWillMount==前に、render== DOM挿入を行い、componentDidMount==マウント後に(またはrenderDOM APIを呼び出してコンポーネントを挿入し、その非同期操作が完全に完了しました)
Rob

8

https://facebook.github.io/react/docs/tutorial.html

ここで、componentDidMountは、コンポーネントがレンダリングされるときにReactによって自動的に呼び出されるメソッドです。

コンセプトは、ReactJSに「このこと、このコメントボックスまたは回転する画像など、ブラウザページに必要なものをすべて取り込んで、実際にブラウザページに配置してください。それが終わったら、私がバインドした私の機能 componentDidMount進むことができるように。」

componentWillMount反対です。コンポーネントがレンダリングされる直前に実行されます。

こちらもご覧ください くださいhttps://facebook.github.io/react/docs/component-specs.html

最後に、「マウント」という用語は、react.jsに固有のようです。私はそれが一般的なJavaScriptの概念、あるいは一般的なブラウザの概念でさえないと思います。


マウントは「配置済み」と呼ぶことができますか?
ゲート

そうだと思います。
ロスプレッサー、2015

この引用は、最初のレンダリング後にのみ呼び出され、更新によって引き起こされた再レンダリングでは呼び出されないため、多少誤解を招くと思います。次にcomponentDidUpdate代わりに呼び出されます。
Hannes Johansson

このfacebook.github.io/react/docs/…の +1、そこに記述されていることが確認されて配置されています;)
ゲート

5

マウントとは、Reactコンポーネントが最初にレンダリングされるときの最初のページの読み込みを指します。マウントのReactドキュメントから:componentDidMount:

Invoked once, only on the client (not on the server), immediately after the initial rendering occurs. At this point in the lifecycle, the component has a DOM representation which you can access via React.findDOMNode(this).

これは、Reactがレンダリングするたびに呼び出される(初期マウントを除く)componentDidUpdate関数と対照的です。


3

React jsの主な目的は、再利用可能なコンポーネントを作成することです。ここで、コンポーネントはWebページの個々の部分です。たとえば、ウェブページでは、ヘッダーはコンポーネント、フッターはコンポーネント、トースト通知はコンポーネントなどです。「マウント」という用語は、これらのコンポーネントがDOMにロードまたはレンダリングされることを示しています。これらは、これを処理する多くのトップレベルのAPIとメソッドです。

簡単に言うと、マウントとはコンポーネントがDOMにロードされたことを意味し、アンマウントとはコンポーネントがDOMから削除されたことを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.