Component Initialization & Mounting
constructor
=>componentWillMount
getDerivedStateFromProps
render
componentDidMount
Component Updation
=>componentWillReceiveProps
getDerivedStateFromProps
shouldComponentUpdate
render
=>componentWillUpdate
getSnapshotBeforeUpdate
DOM
에 적용componentDidUpdate
Component Unmounting
componentWillUnmount
DOM
에서 요소들이 랜더링 되기 직전에 호출된다.props
에 기반한 state
객체를 저장한다.state
를 인자로 받고, state
가 변하면 객체를 반환한다.<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Example</title> <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> <body> <div id="root"></div> <script type="text/babel"> class App extends React.Component { state = { age: 24, } interval = null; constructor(props) { super(props) console.log("constructor", props) } render() { console.log("render") return ( <div> <h2> Hello {this.props.name} - {this.state.age} </h2> </div> ) } static getDerivedStateFromProps(nextProps, prevState) { console.log("getDerivedStateFromProps", nextProps, prevState); return { age: 390, } } componentDidMount() { console.log("componentDidMount") this.interval = setInterval(() => { this.setState(state => ({...state, age: state.age + 1})) }, 1000); } shouldComponentUpdate(nextProps, nextState) { console.log("shouldComponentUpdate", nextProps), nextState; return true; } componentDidUpdate(prevProps, prevState) { console.log("componentDidUpdate", prevProps, prevState); } componentWillUnMount() { clearInterval(this.interval); } } ReactDOM.render(<App name="Mark" />, document.querySelector("#root")) </script> </body> </html>
실행 결과
$ npx serve
이 메소드는 업데이트 되기 전의 props
와 state
에 접근할 수 있다.
update
이후에도 update
이전의 값들을 확인할 수 있다는 것을 의미한다.getSnapshotBeforeUpdate()
메소드가 존재하면 componentDidUpdate()
메소드도 포함해야 한다. 그렇지 않으면 에러가 발생한다.UI
등을 생각해볼 수 있습니다.null
을 반환합니다.<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Example</title> <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> <body> <div id="root"></div> <script type="text/babel"> let i=0; class App extends React.Component { state = { list: []}; render() { return ( <div id="list" style={{ height: 100, overflow: "scroll" }}> {this.state.list.map((i) => { return <div>{i}</div>; })} </div> ); } componentDidMount() { setInterval(() => { this.setState((state) => ({ list: [...state.list, i++], })); }, 1000); } getSnapshotBeforeUpdate(prevProps, prevState) { if (prevState.list.length === this.state.list.length) return null; const list = document.querySelector("#list"); return list.scrollHeight - list.scrollTop; } componentDidUpdate(prevProps, prevState, snapshot) { console.log(snapshot); if (snapshot === null) return; const list = document.querySelector("#list"); list.scrollTop = list.scrollHeight - snapshot; } } ReactDOM.render(<App name="Mark" />, document.querySelector("#root")) </script> </body> </html>
getSnapshotBeforeUpdate
를 이용하여 데이터가 업데이트하게 되면 스크롤 위치가 자동으로 변하게 되는 로직을 구현한 코드입니다.
실행 결과
$ npx serve
componentDidCatch
로 해당 컴포넌트로 오류가 발생하게 되면 해당 화면을 보여줄 수 있게 되었습니다.class App extends React.Component { state = { hasError: false, }; render() { if (this.state.hasError) { return <div>예상치 못한 에러가 발생했다.</div>; } return <WebService />; } componentDidCatch(error, info) { this.setState({ hasError: true }); } }