기본적으로 Tree는 평상시 접하는
<html>
<head>
...
</head>
<body>
<div>
...
</div>
</body>
</html>
식의 HTML 구현 방식 같은 부모, 자식 형태로 이루어진 구조다. 여기서는 <html> 하위에 <head>, <body>가 있고 다시 <body> 하위에 <div>가 있는 구조다.
사족으로, 이 문서에서 Tree에 대해 이해할 때 염두에 두어야 할 것은 ‘시점’의 개념이다.
가령 ‘<button> 클릭하면 글자색이 변화한다.’ 라는 기능을 구현했다고 치자. 일단 <button> 클릭 전 뭔가 구현된 화면이 있을 것인데 이 구조를 Tree1이라고 한다면 <button> 클릭 후 글자색을 정의하는 어떠한 값이 바뀌고 그에 맞춰 짜진 결과물이 있을 것이다. 이를 Tree2라고 한다면 각각의 Tree1, Tree2가 개별 Tree가 되는 것이고, Tree1 → Tree2로 변경하는 방법에도 여러가지가 있을 텐데 그에 대해 이 문서에서 서술하는 것이다.
기본적으로 React는 Root Element부터 비교한다. (= 상위 Element로부터 비교를 시작한다.)
<div>
<span>
....
</span>
</div>
이 경우 React는 이전 Tree를 완전히 삭제하고 새롭게 구성한다.
//Tree.1
<div>
<Counter />
</div>
//Tree.2
<span>
<Counter />
</span>
이 경우 속성을 확인해서 동일한 것은 유지하고, 변경된 것만 갱신한다.
//Tree.1
<div className="before" title="stuff" />
//Tree.2
<div className="after" title="stuff" />
만약 CSS Style이 갱신되었다면 style 전체를 갱신하지 않고 style 내부에서 변경된 속성 값만 갱신한다.
//Tree.1
<div style={{color : 'white', fontWeight : 'bold'}} />
//Tree.2
<div style={{color : 'red', fontWeight : 'bold'}} />
<div>와 같은 DOM 노드에 대한 처리가 끝났다면 노드의 자식들을 처리한다.
DOM 노드의 자식을 처리할 때 변경 전과 변경 후 Tree 구조를 비교하며 차이가 있다면 변경한다.
<ul>
<li>List1</li>
</ul>
React 를 통해 List를 만들었고, 거기에 새로운 항목을 추가한다고 가정해보자.
//Tree.1
<ul>
<li>First</li>
<li>Second</li>
</ul>
//Tree.2
<ul>
<li>First</li>
<li>Second></li>
<li>Third</li>
</ul>
//Tree.1
<ul>
<li>Duke</li>
<li>Villanova</li>
</ul>
//Tree.2
<ul>
<li>Connecticut</li>
<li>Duke</li>
<li>Villanova</li>
</ul>