[React] 리랜더링
글 작성자: 망고좋아
반응형
🎯 리랜더링
- 바닐라 JS -> 변경으로 인한 Element를 다시 그림
- React -> 변경된 부분만 다시 그림
- 리액트의 장점은 리랜더링에 있다.
📝 JS로 만든 랜덤 버튼
const rootElement = document.getElementById("root");
function random () {
const number = Math.floor(Math.random() * (10 - 1) + 1);
const element = `
<button>${number}</button>
`;
rootElement.innerHTML = element;
}
setInterval(random, 1000);
- 계속해서 element를 다시 그린다.
- tap을 하면 포커스가 되는데 1초 뒤 숫자가 변경되면서 포커스가 풀린다.
- 태그가 새롭게 만들어진다.
📝 React로 만든 랜덤 버튼
function random() {
const number = Math.floor(Math.random() * (10 - 1) + 1);
const element = <button>{number}</button>;
ReactDOM.render(element, rootElement);
}
setInterval(random, 1000);
// -------------------
const rootElement = document.getElementById("root");
function random() {
const number = Math.floor(Math.random() * (10 - 1) + 1);
const element = (
<>
//<button>{number}</button>
<button childrem={number} /> // 동일하게 동작
<button>{number}</button>
</>
);
ReactDOM.render(element, rootElement);
}
setInterval(random, 1000);
- 바뀌는 버튼만 변경된다. → 버튼이 새로 만들어지는 게 아니라 글자만 바뀌는 거다.
- tap해도 숫자가 변경되어서 포커스가 풀리지 않는다. 버튼은 냅두고 안에 있는 숫자만 바뀌고 있다.
- JS는 변화한 그림을 새롭게 그리는데, 리액트는 바뀐 곳만 타켓팅하여 바꿔준다.
📝 리액트는 어떤 알고리즘으로 랜더링 해주는 걸까?
- 두 개의 트리(바뀌기 전과 후)를 비교할 때, React는 두 엘리먼트의 루트(root) 엘리먼트부터 비교한다.
- 리액트 엘리먼트는 불변 객체(immutable)이다.
- 불변 객체란 변하지 않는 객체이다. 우리는 그저
ReactDOM.render(element, rootElement);
로 전달할 뿐 변경 판단 및 반영은 리액트가 알아서 한다.
- 불변 객체란 변하지 않는 객체이다. 우리는 그저
엘리먼트 타입이 다른 경우
- 두 루트 엘리먼트의 타입이 다르면, React는 이전 트리를 버리고 완전히 새로운 트리를 구축한다.
- 즉, 엘리먼트 타입이 바뀌면 이전 엘리먼트는 버리고 새로 그린다.
DOM 엘리먼트의 타입이 같은 경우
- 두 엘리먼트의 속성(props)을 확인하여, 동일한 내역은 유지하고 변경된 속성들만 갱신한다.
- 즉, key를 먼저 비교하고 props를 비교해서 변경사항을 반영한다.
리액트는 DOM을 어떻게 비교할까?
- 리액트는 가상 돔을 가지고 있다.
- 이전 가상 돔과 최근 가상 돔을 가지고 재조정 알고리즘을 통해서 업데이트한다.
🏷 요약
- 개발은 trade-off다.
- 얻는 게 있으면 하나를 잃는다. 무조건적으로 리액트가 JS보다 좋은 것은 아니다. 하나의 장점을 얻으면 하나를 잃는다.
- 리액트 엘리먼트 -> 불변 객체
- 변경 사항 반영 -> 리액트에게 일임
- 리액트의 비교 -> Reconciliation
- Virtual DOM -> 비교 시 활용
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);
- 바뀌는 시간 부분만 변경된다.
📌 참고
반응형
'프로그래밍 > React' 카테고리의 다른 글
[React] 컴포넌트 상태 다루기 :: useState (0) | 2021.09.13 |
---|---|
[React] 리액트 이벤트 핸들러 (0) | 2021.09.11 |
[React] JS와 JSX 섞어 쓰기 (0) | 2021.09.11 |
[React] Element 찍어내기 (0) | 2021.09.11 |
[React] 멀티 Element 생성하기 :: React.Fragment (0) | 2021.09.11 |
댓글
이 글 공유하기
다른 글
-
[React] 컴포넌트 상태 다루기 :: useState
[React] 컴포넌트 상태 다루기 :: useState
2021.09.13 -
[React] 리액트 이벤트 핸들러
[React] 리액트 이벤트 핸들러
2021.09.11 -
[React] JS와 JSX 섞어 쓰기
[React] JS와 JSX 섞어 쓰기
2021.09.11 -
[React] Element 찍어내기
[React] Element 찍어내기
2021.09.11