본문 바로가기
React

lifecycle hook, useEffect

by 루에 2021. 11. 2.
반응형

컴포넌트의 생명주기(lifecycle) 중간 중간 액션을 넣을 수 있는 기능

가령 onCreate(), onDistroy() 등등의 기능을 임의적으로 넣을 수 있다.

 

이전 방식(lifecycle hook)

class Detail2 extends React.Component {
    // 가장 많이 쓰는 라이프사이클 훅
    componentDidMount() {   // 화면에 보일 때
    }
    componentWillUnmount() {    // 시야에서 사라질 때
    }

    // 현재 살아있는 라이프사이클 훅
    componentDidCatch(error, errorInfo) {
        // 에러 발생 시
    }
    componentDidUpdate(prevProps, prevState, snapshot) {
        // 컴포넌트 업데이트 시
    }
    shouldComponentUpdate(nextProps, nextState, nextContext) {
        // props값이 바꼈거나 컴포넌트가 업데이트 되었을 때 re-rendering을 할지 말지 결정
    }

    // 레거시 함수들(사용 X 권장)
    componentWillMount() {
    }
    componentWillUpdate(nextProps, nextState, nextContext) {
    }
    componentWillReceiveProps(nextProps, nextContext) {
    }

    // 컴포넌트 업데이트 시 호출되는 순서
    /*
    static getDerivedStateFromProps()
    shouldComponentUpdate()
    render()
    getSnapshotBeforeUpdate()
    componentDidUpdate()
     */
}

경험상 이러한 함수들은 자주 쓴다, 안쓴다보다는 어떠한 케이스에 어떠한 함수 안에 기능을 작성할 것인가를 일률적으로 유지하는 것이 중요하다. 컴포넌트의 상태를 변경하는데 하나는 A, 다른 하나는 B에 작성하게 되면 규모가 커졌을 때 유지보수 측면에서 좋지 않다.

 

새로운 방식(useEffect)

function Detail(props) {
	let [alertDiv, setAlertDiv] = useState(true);
    // 보일 때, 업데이트 될 때 등등 자주 실행됨
    useEffect(() => {
        console.log("111111");
        setTimeout(() => {
            console.log("2초 지남");
        }, 2000)

        return function onUndock() {
            console.log("사라질 때");
        }
    });
    useEffect(() => {	// 위 useEffect와 비슷한 기능을 하지만 state를 이용하여 dom 제어
		setTimeOut(() => {
        	setAlertDiv(false);
        }, 3000)
    }, [alertDiv])
    // 여러 개 쌉가능
    // 순서대로 실행됨
    useEffect(() => {

    })
    useEffect(() => {	// props.count가 변경될 때만 실행

    }, [props.count])
    useEffect(() => {	// 빈 배열로 넘기면 최초에 1번, 사라질 때 한 번 실행

    }, [])
    
    return(
    	<>
    	<div id="alert2">test</div>
        {
        	(alertDiv === true)
            ? <div className="alert-div"></div>
            : null
        }
        </>
    )
}

useEffect는 여러 개 작성해도 무방하다.

반응형

댓글