현재 리액트 공식 문서에서는 함수형 컴포넌트와 Hook을 사용하는 것을 권장하고 있습니다. 클래스 컴포넌트는 라이프 사이클 기능과 state 관리 기능이 코드에 구현되며, 함수형 컴포넌트는 hook 을 통해 라이프 사이클 기능과 state 관리 기능 코드를 짤 수 있는데요
클래스형 컴포넌트를 사용할 경우에는 render
함수가 필수적으로 사용되어야 합니다.
render()
함수가 필요 없어서 컴포넌트 마운트 속도가 더 빠르고, 가독성이 좋은 장점이 있다.와닿지 않아서 예시로 보자
class ProfilePage extends React.Component {
showMessage = () => {
alert(`${this.props.user} 를 팔로우 했습니다`);
}
handleClick = () => {
// const {user} = this.props; 이렇게 미리 할당해둬서 해결은 가능
// setTimeout(() => this.showMessage(user), 3000);
setTimeout(this.showMessage, 5000); // this.showMessage 대신 user 넣으면 해결 가능
}
render() {
return <button onClick={this.handleClick}>Follow</button>;
}
}
A 유저를 팔로우 한 후 빛의 속도로 3초만에 B 유저 프로필로 이동하면, "B를 팔로우했습니다" 라는 alert 메세지가 나타납니다. 그러나 나는 A 유저를 팔로우 했습니다!🤷
showMessage()
가 호출되었을 때의 유저를 바라보고 있기 때문에 생긴 버그this
가 클래스에서 존재하는 목적이죠. 리액트가 시간이 지남에 따라 this
render
나 라이프사이클 메서드를 호출할 때 업데이트된 값들을 읽어 올 수 있는 것입니다.아래에 class 컴포넌트 문제를 해결하는 다양한 방법이 친절하게 나와있어요! 클로저 사용 등. 이 블로그에서 가져온 예제이기 때문에 읽어보는 것을 추천~
function ProfilePage(props) {
showMessage = () => {
alert(`${props.user}를 팔로우 했습니다`);
}
handleClick = () => {
setTimeout(showMessage, 5000);
}
return (
<button onClick={handleClick}>Follow</button>
)
}
페이지를 B로 이동해도 팔로우를 눌렀을 시점의 유저 이름이 정상적으로 출력됩니다.
💡 확인해보고 싶다면 **[라이브 데모 참고!](https://codesandbox.io/s/pjqnl16lm7)**즉, this는 mutable하지만, props는 immutable합니다. + state도 불변값
리랜더링 될 때의 값을 유지합니다. 즉, immutable 하다는 것. (위의 예제참고)
함수형 컴포넌트는 props에 따른 랜더링 결과를 보장받습니다.
매개변수로 받는 props의 destructuring을 활용해 가독성을 보장받을 수 있습니다.
함수의 모든 장점을 이용할 수 있습니다. (결국 함수니까)
함수형 컴포넌트를 사용했을 때 코드가 간결해지고 가독성도 좋습니다!
리액트 공식문서에 따르면 “리액트는 성능을 위해 setState()를 단일 업데이트(batch update)로 한꺼번에 처리”할 수있습니다.
batch update기능의 주된 아이디어는 리액트의 이벤트 핸들러와 생명주기 메서드를 사용해 얼마나 많은 setState를 호출하든 간에 단 하나의 업데이트로 일괄처리하여 re-render가 한번만 발생하도록 해, 불필요한 렌더링을 방지합니다.
함수형과 클래스형 컴포넌트 모두에서 이벤트 핸들러 내부의 업데이트에 batch update가 적용됩니다.
https://overreacted.io/ko/how-are-function-components-different-from-classes/
궁금했던 사항이었는데 도움받고 갑니다!