useEffect
-> 최초렌더링, deps 요소 변경 시 콜백 호출된다. componentDidUpdate
를 구현하고 싶다면 사용자 훅을 만드는 과정이 필요하다.
const useCustomEffect=()=>{
// 재실행에도 초기화 x, 유지되는 로컬 변수(변경가능한객체)
const didMountRef = useRef(false);
const {
didUpdate=true,
didMount=true
}
useEffect(()=>{
if(didMountRef.current === false){
// mount가 되었는지를 점검
didMountRef.current = true;
// mount가 되었으므로, 다시 마운트 로직 할 필요없다. true
// didMount가 false라면 업데이트만 하고 싶은 상황
if(didMount){
effectFunction();
}
return ;
}
if(didUpdate){
effectFunction();
}
},deps)
}
useLayoutEffect는 돔 조작이 필요한 경우 사용하면 된다.
돔이 다 업데이트된 이후에 돔을 조작해야한다면,
useEffect가 아닌 useLayoutEffect에 구현해야
로직이 수행된 결과물을 볼 수 있다.
props
에 컴포넌트를 전달하여 전달받는 컴포넌트에 제어권을 위임하여 컴포넌트를 조합할 수 있다.
하지만 이 방식의 경우 props 값의 추가가 필요하며, 전달받는 컴포넌트에서의 if
로직이 더 길어짐, 내부에서 또 한번의 component tree
가 만들어지기에 depth
가 깊어진다.
리액트는 children
이라는 속성으로 컴포넌트를 전달하여 합성할 수 있다. 부모 컴포넌트에게 합성될(렌더링 될)컴포넌트의 제어권이 주어진다. component depth
가 일관되게 유지된다.
대신 한번에 여러개의 컴포넌트를 합성하는 경우 children
으로 모조리 들어가기에 레이아웃에 제약이 걸린다.