๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ ์ปดํฌ๋ํธ ์ํ์ ๋ณํ๊ฐ ์์ ๋๋ง๋ค ์คํํ๋ ๋ฉ์๋์ ๋๋ค.
์ด ๋ฉ์๋๋ค์ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ DOM์ ์ง์ ๊ฑด๋๋ ค์ผ ํ๋ ์ํฉ์์ ์ ์ฉํฉ๋๋ค.
์ถ๊ฐ๋ก ์ปดํฌ๋ํธ ์ ๋ฐ์ดํธ ์ฑ๋ฅ์ ๊ฐ์ ํ ๋๋ shouldComponentUpdate๊ฐ ์ค์ํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ 9์ข ๋ฅ
Will ์ ๋์ฌ๋ ์ด๋ค ์์ ์ ์๋ํ๊ธฐ ์ ์ ์คํ๋๋ ๋ฉ์๋ / Did ์ ๋์ฌ๋ ์ด๋ค ์์ ์ ์๋ํ ํ ์คํ๋๋ ๋ฉ์๋
์ด ๋ฉ์๋๋ค์ ์ฐ๋ฆฌ๊ฐ ์ปดํฌ๋ํธ ํด๋์ค์์ ๋ฎ์ด ์จ ์ ์ธํจ์ผ๋ก์จ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Mount : Dom์ด ์์ฑ๋๊ณ ์น ๋ธ๋ผ์ฐ์ ์์ ๋ํ๋๋ ๊ฒ
constructor : ์ปดํฌ๋ํธ๋ฅผ ์๋ก ๋ง๋ค ๋๋ง๋ค ํธ์ถ๋๋ ํด๋์ค ์์ฑ์ ๋ฉ์๋ ↓ getDerivedStateFromProps : props์ ์๋ ๊ฐ์ state์ ๋ฃ์ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋ (๐๊ฐ์ฅ ํท๊ฐ๋ฆผ) ↓ render : ์ฐ๋ฆฌ๊ฐ ์ค๋นํ UI๋ฅผ ๋๋๋งํ๋ ๋ฉ์๋ ↓ componentDidMount : ์ปดํฌ๋ํธ๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์ ๋ํ๋ ํ ํธ์ถํ๋ ๋ฉ์๋ |
Update : ์๋ 4๊ฐ์ง ๊ฒฝ์ฐ์ ์ ๋ฐ์ดํธ
- props๊ฐ ๋ฐ๋๋
- state๊ฐ ๋ฐ๋๋
- ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋
- this.forceUpdate๋ก ๊ฐ์ ๋ก ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ ๋
getDerivedStateFromProps : ์ด ๋ฉ์๋๋ ๋ง์ดํธ ๊ณผ์ ์์๋ ํธ์ถ๋๋ฉฐ, ์
๋ฐ์ดํธ๊ฐ ์์ํ๊ธฐ ์ ์๋ ํธ์ถ. props์ ๋ณํ์ ๋ฐ๋ผ state ๊ฐ์๋ ๋ณํ๋ฅผ ์ฃผ๊ณ ์ถ์๋ ์ฌ์ฉ ↓ shouldComponentUpdate : ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ ํด์ผ ํ ์ง ๋ง์์ผ ํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฉ์๋. ์ด ๋ฉ์๋์์๋ true/false ๊ฐ์ ๋ฐํ - true ๋ฐํ์ ๋ค์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ฅผ ๊ณ์ ์คํ - false ๋ฐํ์ ์์ ์ค์ง (์ฆ, ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋์ง ์์) ๋ง์ฝ ํน์ ํจ์์์ this.forceUpdate() ํจ์๋ฅผ ํธ์ถํ๋ค๋ฉด, ์ด ๊ณผ์ ์ ์๋ตํ๊ณ render ํจ์๋ฅผ ํธ์ถ ↓ render : ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง ↓ getSnapshotBeforeUpdate : ์ปดํฌ๋ํธ ๋ณํ๋ฅผ DOM์ ๋ฐ์ํ๊ธฐ ์ง์ ์ ํธ์ถํ๋ ๋ฉ์๋. ↓ componentDidUdpate : ์ปดํฌ๋ํธ์ ์ ๋ฐ์ดํธ ์์ ์ด ๋๋ ํ ํธ์ถํ๋ ๋ฉ์๋ |
Unmount : Mount์ ๋ฐ๋๊ณผ์ . ์ปดํฌ๋ํธ๋ฅผ DOM์์ ์ ๊ฑฐํ๋ ๊ฒ์ ์ธ๋ง์ดํธ๋ผ๊ณ ํ๋ค.
componentWillUnmount : ์ปดํฌ๋ํธ๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์์ ์ฌ๋ผ์ง๊ธฐ ์ ์ ํธ์ถ |
์์ ์ฝ๋
import { Component } from "react";
class LifeCycleSample extends Component {
state = {
number: 0,
color: null,
};
myRef = null;
//constructor : ์ปดํฌ๋ํธ๋ฅผ ์๋ก ๋ง๋ค ๋๋ง๋ค ํธ์ถ๋๋ ํด๋์ค ์์ฑ์ ๋ฉ์๋
constructor(props) {
super(props);
console.log("constructor");
}
//getDerivedStateFromProps : ์ด ๋ฉ์๋๋ ๋ง์ดํธ ๊ณผ์ ์์๋ ํธ์ถ๋๋ฉฐ, ์
๋ฐ์ดํธ๊ฐ ์์ํ๊ธฐ ์ ์๋ ํธ์ถ.
// props๋ก ๋ฐ์ ์จ ๊ฐ์ state์ ๋๊ธฐํ์ํค๋ ์ฉ๋๋ก ์ฌ์ฉ
static getDerivedStateFromProps(nextProps, prevState) {
console.log("getDerivedStateFromProps");
if (nextProps.color !== prevState.color) {
return { color: nextProps.color };
}
return null;
}
// componentDidMount : ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ , ์ฒซ ๋ ๋๋ง์ ๋ค ๋ง์น ํ ์คํ
// ์ด ์์์ ๋ค๋ฅธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ์ ํจ์๋ฅผ ํธ์ถ, ์ด๋ฒคํธ ๋ฑ๋ก, setTimeout, setInterval
// ๋คํธ์ํฌ ์์ฒญ ๊ฐ์ ๋น๋๊ธฐ ์์
์ฒ๋ฆฌ
componentDidMount() {
console.log("componentDidMount");
}
// shouldComponentUpdate : ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ ํด์ผ ํ ์ง ๋ง์์ผ ํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฉ์๋.
// props or state๋ฅผ ๋ณ๊ฒฝ์, ๋ฆฌ๋ ๋๋ง์ ์์ํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ฉ์๋.
// ๊ธฐ๋ณธ true ๊ฐ์ ๋ฐํํ๋ฉฐ, false ๋ฐํ์ ์
๋ฐ์ดํธ ๊ณผ์ ์ ์ฌ๊ธฐ์ ์ค์ง ( ์ฑ๋ฅ ์ต์ ํ, ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง์ false ๋ฐํ)
shouldComponentUpdate(nextProps, nextState) {
console.log("shouldComponentUpdate", nextProps, nextState);
return nextState % 10 !== 4;
}
// componentWillUnmount : ์ปดํฌ๋ํธ๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์์ ์ฌ๋ผ์ง๊ธฐ ์ ์ ํธ์ถ
// componetDidMount์์ ๋ฑ๋กํ ์ด๋ฒคํธ, ํ์ด๋จธ, ์ง์ ์์ฑํ DOM์ ์ฌ๊ธฐ์ ์ ๊ฑฐ ์์
์ ํด์ผํจ.
componentWillUnmount() {
console.log("componentWillUnmount");
}
handleClick = () => {
this.setState({ number: this.state.number + 1 });
};
// getSnapshotBeforeUpdate : ์ปดํฌ๋ํธ ๋ณํ๋ฅผ DOM์ ๋ฐ์ํ๊ธฐ ์ง์ ์ ํธ์ถํ๋ ๋ฉ์๋.
// ์
๋ฐ์ดํธํ๊ธฐ ์ง์ ์ ๊ฐ์ ์ฐธ๊ณ ํ ์ผ์ด ์์ ๋ ํ์ฉ.
getSnapshotBeforeUpdate(prevProps, prevState) {
console.log("getSnapshotBeforeUpdate");
if (prevProps.color !== prevState.color) {
return this.myRef.style.color;
}
return null;
}
// componentDidUdpate : ์ปดํฌ๋ํธ์ ์
๋ฐ์ดํธ ์์
์ด ๋๋ ํ ํธ์ถํ๋ ๋ฉ์๋
// prevProps, prevState๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ๊ฐ ์ด์ ์ ๊ฐ์ก๋ ๋ฐ์ดํฐ์ ์ ๊ทผ
// getSnapshopBeforeUpdate์์ ๋ฐํํ ๊ฐ์ด ์๋ค๋ฉด ์ฌ๊ธฐ์ snapshot ๊ฐ์ ์ ๋ฌ ๋ฐ์ ์ ์์.
componentDidUpdate(prevProps, prevState, snapshot) {
console.log("componentDidUpdate");
if (snapshot) {
console.log("์
๋ฐ์ดํธ๋๊ธฐ ์ง์ ์์: ", snapshot);
}
}
render() {
console.log("render");
const style = {
color: this.props.color,
};
return (
<>
{this.props.missing.value}
<h1
style={style}
ref={(ref) => {
this.myRef = ref;
}}
>
{this.state.number}
</h1>
<p>{this.state.color}</p>
<button onClick={this.handleClick}>๋ํ๊ธฐ</button>
</>
);
}
}
export default LifeCycleSample;