Rendering Element : 렌더링 요소
는 리액트 앱의 설계에 있어 최소단위의 요소이다.
개발자가 화면상에 보여주고자 하는
하나의 Element
는 이런 모습이다.const element = <h1>Hello,world</h1>;
.
브라우저의 DOM Elements
와는 다르게,React Elements
는 '단순한 객체'이며 생성 또한 간단하다.
.
React DOM
은 리액트 요소들과 매치되기 위해 DOM을 업데이트를 처리한다.
위에서 설명한 요소 : Elements
는 컴포넌트 : Components
와 명백히 다르다.
Elements
는 Components
의 구성요소 이다.
리액트 앱의 어딘가에 아래와 같은 코드가 담긴 HTML파일이 존재한다.
<div id="root"></div>
우리는 이것을
root DOM
노드라고 부른다.
이 내부에 들어가는 모든것들이React DOM
에 의해 처리되기 때문이다.
리액트로만 만들어진 앱들은 보통 단 하나의 root DOM node
를 가지고 있다.
하지만 만약 기존의 앱에 리액트를 접목하고자 할 땐, 필요한 많은 독립된 root DOM node
를 가질 수도 있다.
우리의 리액트 Elements
가 위에서 설명한 Root DOM
으로 전달되어 rendering
되기 위해선,
React.DOM.render( )
을 통해 루트 돔 내부에 전달되는 과정이 필요하다.
아래의 코드는
element
를root
라는 react root dom에 전달하기 위해ReactDOM.render( )
를 사용한 모습이다.const element = <h1>Hello, seongwoo</h1>; ReactDOM.render(element, document.getElementById('root'));
ReactDOM.render( 요소 , document.getElementById( 'root ID' ) );
리액트 요소
들은 불변한다. 즉, 일단 요소를 생성하고 나면, 우린 이것들의 자식이나 속성들을 바꿀 수 없다.
하나의 요소는 영화의 프레임 한장면과 같다.
다시 말해,
하나의 리액트 Element
는 정확히시간의 한 지점
에서만의 UI를 표현할 수 있다.function tick() { const element = ( <div> <h1>Hello, world!</h1> <h2>It is {new Date().toLocaleTimeString()}.</h2> </div> ); ReactDOM.render(element, document.getElementById('root')); } setInterval(tick, 1000);
위의 시계침 예제의 코드는,
setInterval()
함수 내에서tick()
내에 있는ReactDOM.render()
를
'매 초 (every second)' 마다 callback 한다
.
( call back? : https://velog.io/@he1256/JS%EC%9D%98-%EC%BD%9C%EB%B0%B1%ED%95%A8%EC%88%98Call-back-Simple-Note-javascript )
하지만 실전에서 우리는 위의 리액트의 본질적인 특징을 그대로 사용하지 않고, ReacDOM.render()를 단 한번만 호출하도록 만들어 사용하게 된다.
코드를stateful components : 상태 저장 컴포넌트
에 캡슐화 시켜, 단 한번의 render 호출만으로 위의 기능을 동작하도록 하는 것이다.
이 내용은 다음 섹션인 stateful components 에서 다룰 것 이다.
React DOM
은 새로운 요소와 그 자식을 이전 요소
와 비교하고 DOM을 원하는 상태로 가져오는 데 필요한 DOM 업데이트만 적용한다.
실제로 우리는 앞에서 매 초 마다 그리게 될 UI tree
전체를 묘사한 element
를 만들었지만, 실제로는 ReactDOM.render()
에 의해 업데이트되는 Text Node
컨텐츠만이 변화하는 것을 볼 수 있다.