Pure Component
목차
- React의 중요한 컨셉
- Habit Tracker 다시 살펴보기
- Render 함수의 호출
- Component 정리
- PureComponent를 사용하는 이유
- React Dev Tools로 re-render 확인하기
- PureComponent와 memo
- Habit에 PureComponent 적용하기
React의 중요한 컨셉
1. 리액트는 Component들이다
2. 데이터가 조금이라도 업데이트 되면 전체적으로 어플리케이션이 다 re-render가 된다.
React Component
Class | Function |
---|---|
React.Component | function |
React.PureComponent | memo(function) |
React Hook |
Habit Tracker 다시 살펴보기
src/index.js
ReactDOM.render(
// ReactDOM 라이브러리 활용
<React.StrictMode>
<App /> // 실제로 우리의 컴포넌트가 시작되는 곳
</React.StrictMode>,
document.getElementById("root")
// "root"라는 ID를 가진 요소와 최상위 Component를 연결
);
src/app.jsx
class App extends Component {
state = {};
render() {
// state에 따라 어떻게 표기될건지 UI가 정의된 부분
return (
<>
// App에 포함된 자식요소 Navbar, Habits
<Navbar /> // 자식요소가 없는 순수 Component
<Habits // 자식요소를 가지고 있는 Component
habits={this.state.habits}
/>
</>
);
}
}
export default App;
src/components/habits.jsx
class Habits extends Component {
state = {};
render() {
return (
<>
// HabitAddForm과 Habit 자식요소를 가지고 있다.
<HabitAddForm />
<ul>
{this.props.habits.map((habit) => (
<Habit />
))}
</ul>
;<button></button>
</>
);
}
}
export default Habits;
Render 함수의 호출
app.jsx, habits.jsx, habit.jsx 등 각각의 Component render() 함수에
console.log()
를 넣어주어 각각의 컴포넌트에서 render함수는 언제 호출되는지 알아보자
페이지를 새로고침하였을 때
처음 각 Component의 render() 함수에 console.log()를 넣어주게 되면 console.log()가 두 번씩 출력되는 것을 볼 수 있다.
그 이유는 다음과 같다.
src/index.js
에서<React.StrictMode></React.StrictMode>
를 사용하면 한번 더 호출했을 때 잘못되는 건 없는지 검사하기 위해 두 번씩 호출한다.- 실제로 배포할 때는 정상적으로 한번만 동작한다. (개발하는 과정에서만 발생)
이번 시간에는 잘못되는 건 없는지 따로 검사해줄 필요가 없으므로
<React.StrictMode></React.StrictMode>
부분을 지우고 진행하였다.
app
navbar
habits
habit: Reading
habit: Running
habit: Coding
-
페이지를 새로고침 하면 모든 Component 가 다시 동작하여야 하므로 당연히 위와 같은 결과가 나올 것이라 예상하였을 것이다.
하지만, 다음과 같은 경우에는 또 어떻게 될까?
각 버튼을 클릭하였을 때
app
navbar
habits
habit: Reading
habit: Running
habit: Coding
-
habit Component의 버튼을 클릭하면 habit만 re-render 되는 것이 아니라 모든 Component가 re-render되는 것을 확인할 수 있다.
-
하지만 실제로는 React 자체에 VDOM(Virtual DOM)을 써서 업데이트 되어야 하는 요소만 DOM 요소에 업데이트 되기 때문에 성능에 문제가 없다.
-
Chrome 검사창에서 Elements창을 열어놓고 버튼을 누르며 실제로 DOM요소가 어떻게 변하는지 보자!
-> 변화가 일어나는 DOM요소 외에는 아무런 변화가 없는 것을 확인할 수 있을 것이다!