React js에서“마운팅”이란 무엇입니까?


128

ReactJS를 배우는 동안 "마운트"라는 용어를 너무 많이 들었습니다. 그리고이 용어에 대한 수명주기 방법과 오류가있는 것 같습니다. 마운트가 정확히 무엇을 의미합니까?

예 : 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에 DOM 컨테이너에 "마운트"하도록 지시 할 수 있습니다.

ReactDOM.render(foo, domContainer);

이것은 React에게 foo페이지 에 표시 할 시간임을 알려줍니다 . React는 FooComponent클래스 의 인스턴스를 만들고 render메서드를 호출합니다 . 를 렌더링한다고 가정 해 보겠습니다 <div />.이 경우 React는 div이를위한 DOM 노드를 생성하고 이를 DOM 컨테이너에 삽입합니다.

React 컴포넌트에 해당하는 인스턴스와 DOM 노드를 생성하고이를 DOM에 삽입하는 과정을 마운팅이라고합니다.

일반적으로 ReactDOM.render()루트 구성 요소를 마운트하기 위해서만 호출 합니다. 하위 구성 요소를 수동으로 "마운트"할 필요가 없습니다. 부모 컴포넌트가를 호출 setState()하고 그 render메서드가 특정 자식을 처음으로 렌더링해야한다고 말할 때마다 React는이 자식을 부모에 자동으로 "마운트"합니다.


9
나는 당신이 전화 React.createElement(FooComponent)할 때 당신이의 인스턴스를 만드는 것이 아니라는 점을 지적하고 싶습니다 FooComponent. React 요소라고도 foo하는 가상 DOM 표현입니다 FooComponent. 그러나 아마도 이것이 FooComponentReact type 이 의미하는 바일 것입니다 . 그럼에도 불구하고 React에서 컴포넌트를 마운트하지 않고 , DOM 트리에서 컴포넌트를 나타 내기 위해 실제 DOM 노드를 생성해야하는 경우 컴포넌트를 마운트 할 있는 render를 호출 합니다. 실제 장착은 이것이 처음으로 발생하는 이벤트입니다.
John Leidegren

5
마운팅은 후속 렌더 호출에서 트리 디핑 / 증분 렌더 업데이트를 수행하는 데 필요한 React 컴포넌트 인스턴스를 DOM 노드에 연결하는 것을 의미합니다.
John Leidegren

3
이 답변은 이미 받아 들여졌지만 꽤 많은 오해가 있었기 때문에 자유롭게 편집 할 수있었습니다 (예 : findDOMNodeReact 요소에서 실행할 수 없음 ).
Dan Abramov

1
@Rahamin 마운트 해제는 구성 요소가 제거 / 교체 될 때 발생하며, 렌더링이없는 방식으로 장면 사이를 탐색하는 경우 마운트 해제 신호가 보장되지 않습니다. componentWillUnmount는 페이지 언로드와 동일하지 않습니다.
John Leidegren

1
@Yossi 는 테스트 스위트에서 컴포넌트 를 명시 적으로 마운트 및 마운트 해제 하는 예입니다 . stackoverflow.com/a/55359234/6225838
CPHPython

38

React는 동형 / 유니버설 프레임 워크입니다. 즉, UI 구성 요소 트리의 가상 표현이 있으며 브라우저에서 출력하는 실제 렌더링과는 별개입니다. 문서에서 :

React는 DOM과 직접 대화하지 않기 때문에 너무 빠릅니다. React는 DOM의 빠른 메모리 내 표현을 유지합니다.

그러나 메모리 내 표현은 브라우저의 DOM에 직접 연결되어 있지 않으며 ( 유니버설 앱 프레임 워크에 대해 불행하고 혼란스러운 이름 인 Virtual DOM이라고하더라도 ) DOM과 유사한 데이터 일뿐입니다. 모든 UI 구성 요소 계층 및 추가 메타 데이터를 나타내는 구조입니다. 가상 DOM은 구현 세부 사항 일뿐입니다.

"우리는 React의 진정한 토대가 단순히 컴포넌트와 요소에 대한 아이디어라고 생각합니다. 렌더링하려는 것을 선언적 방식으로 설명 할 수있는 것입니다. 이들은 이러한 모든 다른 패키지에서 공유되는 부분입니다. 특정 렌더링에 특화된 React의 부분 타겟은 보통 우리가 React를 생각할 때 생각하는 것이 아닙니다. " -React js 블로그

따라서 결론은 React가 Rendering agnostic 이라는 것입니다. 이는 최종 출력이 무엇인지 신경 쓰지 않는다는 것을 의미합니다. 브라우저의 DOM 트리 일 수 있으며 XML, 네이티브 구성 요소 또는 JSON 일 수 있습니다.

"react-native, react-art, react-canvas, react-three와 같은 패키지를 살펴보면 React의 아름다움과 본질이 브라우저 나 DOM과 관련이 없다는 것이 분명해졌습니다." -React js 블로그

이제 React가 어떻게 작동하는지 알았으므로 질문에 쉽게 대답 할 수 있습니다. :)

마운팅 은 구성 요소의 가상 표현을 최종 UI 표현 (예 : DOM 또는 기본 구성 요소)으로 출력하는 프로세스입니다.

브라우저 에서 DOM 트리 의 실제 DOM 요소 (예 : HTML div 또는 li 요소) 로 React 요소를 출력하는 것을 의미 합니다. 네이티브 애플리케이션에서 React 요소를 네이티브 컴포넌트로 출력하는 것을 의미합니다. 용기가 있다면 자체 렌더러를 작성하고 React 구성 요소를 JSON 또는 XML 또는 XAML로 출력 할 수도 있습니다.

따라서 마운트 / 마운트 해제 핸들러는 React 애플리케이션에 중요합니다. 컴포넌트가 마운트 될 때만 출력 / 렌더링되는지 확인할 수 있기 때문 입니다. 그러나 componentDidMount핸들러는 실제 UI 표현 (DOM 또는 기본 구성 요소)으로 렌더링 할 때만 호출되지만을 사용하여 서버에서 HTML 문자열로 렌더링하는 경우에는 호출되지 않습니다 renderToString. 이는 구성 요소가 실제로 마운트 될 때까지 마운트되지 않기 때문입니다. 브라우저에서 실행됩니다.

그리고 예, Mounting 은 당신이 저에게 묻는다면 불행하고 혼란스러운 이름입니다. IMHO componentDidRendercomponentWillRender훨씬 더 나은 이름이 될 것입니다.


6
누군가가 다른 포럼에서이 답변을 알려주었습니다. 한 번 마운트 된 후 소품이 변경 될 때 구성 요소가 여러 번 렌더링 될 수 있기 때문에 componentDidRender대신 할 수 없다고 생각 componentDidMount합니다.
Gaurav

@TheMinister 동형으로 시작하지 않았기 때문에 "가상 DOM"라이브러리라고 불렸지만 실제로는 처음부터 DOM에 연결되었습니다. 동형으로 만드는 것은 나중에 생각한 것입니다.
Isiah Meadows

그래서 mountrender ? 이 경우, 구성 요소가되는 것이 사실이다 장착 / 렌더링 다음과 같은 가정 법적? 각 (id === that.id) ? <Component /> : null| /app/items/:id| this.setState(...).
Cody

1
/ react-js-the-king-of-universal-apps / 링크가 깨졌습니다
Michael Freidgeim

깨진 링크를 제거하기 위해 게시물을 두 번 편집했지만 /react-js-the-king-of-universal-apps/( 편집 주석이 깨진 링크라는 것을 명확하게 언급 함 ) 동료들은 두 번 모두 편집을 거부했습니다 . 누군가가 대답을 편집하고 끊어진 링크를 제거 할 때 무엇이 ​​잘못되었는지 안내 할 수 있습니까?
Aaditya Sharma

12

마운트는 문서의 일부에 첨부되는 React (생성 된 DOM 노드)의 구성 요소를 의미합니다. 그게 다야!

React를 무시하면 다음 두 가지 기본 함수를 마운트로 생각할 수 있습니다.

replaceChild

appendChild

React가 내부적으로 마운트하는 데 사용하는 가장 일반적인 함수는 무엇일까요?

에 대해 생각하다:

componentWillMount === 마운트 전

과:

componentDidMount === 마운트 후


마운팅이와 비슷하면 appendChild무엇 render입니까?
Deke 2018

render마운팅 자체를 수행하는 실제 방법 이라고 말할 수 있다고 생각합니다 . 그래서 componentWillMount== 이전, render==는 DOM 삽입을 수행하고 componentDidMount== 마운트 후 (또는 render구성 요소를 삽입하기 위해 DOM 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에 고유 한 것으로 보입니다. 나는 그것이 일반적인 자바 스크립트 개념이나 일반적인 브라우저 개념이라고 생각하지 않습니다.


마운트를 "배치"라고 할 수 있습니까?
게이트

그렇습니다.
Ross Presser 2015

업데이트로 인한 재 렌더링 이 아니라 초기 렌더링 후에 만 호출되기 때문에 인용문이 다소 오해의 소지가 있다고 말할 수 있습니다. 그런 다음 componentDidUpdate대신 호출됩니다.
Hannes Johansson

facebook.github.io/react/docs/…에 대한 +1 , 거기에 대한 설명은 그것이 배치되었음을 확인합니다;)
gates

5

Mounting은 React 구성 요소가 처음 렌더링 될 때 초기 페이지로드를 의미합니다. Mounting에 대한 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의 주요 목표는 재사용 가능한 구성 요소를 만드는 것입니다. 여기에서 구성 요소는 웹 페이지의 개별 부분입니다. 예를 들어, 웹 페이지에서 헤더는 구성 요소이고 바닥 글은 구성 요소이고 알림 알림은 구성 요소 등입니다. "마운트"라는 용어는 이러한 구성 요소가 DOM에서로드되거나 렌더링된다는 것을 알려줍니다. 이것들은 이것을 다루는 많은 최상위 API와 메소드입니다.

간단히 말해서, mount는 컴포넌트가 DOM에로드되었음을 의미하고 unmounted는 컴포넌트가 DOM에서 제거되었음을 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.