β οΈ μ 리ν λ΄μ©μ μ€νλ μλͺ»λ μ λ³΄κ° μμ μ μμ΅λλ€. λκΈλ‘ μλ €μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.
μλͺ μ£ΌκΈ° λ©μλλ μ»΄ν¬λνΈκ° λΈλΌμ°μ μμ λνλκ³ , μ λ°μ΄νΈ λκ³ , μ¬λΌμ§κ² λ λ νΈμΆνλ λ©μλμ΄λ€. μΆκ°μ μΌλ‘ μ»΄ν¬λνΈμμ μλ¬κ° λ¬μ λ νΈμΆλλ λ©μλλ μλ€.
μλͺ μ£ΌκΈ° λ©μλλ ν΄λμ€ν μ»΄ν¬λνΈμμλ§ μ¬μ©ν μ μλ€.
μΆμ² http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/
μλ λ©μλλ€μ μ»΄ν¬λνΈμ μΈμ€ν΄μ€κ° μμ±λμ΄ DOM μμ μ½μ λ λμ μμλλ‘ νΈμΆλ©λλ€.
constructor β getDerivedStateFromProps β render β componentDidMount
constructor
λ μ»΄ν¬λνΈμ μμ±μ λ©μλμ΄λ€. μ»΄ν¬λνΈκ° λ§λ€μ΄μ§λ©΄ κ°μ₯ λ¨Όμ μ€νλλ λ©μλμ΄λ€.
constructor(props) {
super(props);
console.log("constructor");
}
constructor()
Β λ΄λΆμμΒ setState()
λ₯Ό νΈμΆνλ©΄ μ λλ€.
getDerivedStateFromProps
λ propsλ‘ λ°μμ¨ κ²μ stateμ λ£μ΄μ£Όκ³ μΆμ λ μ¬μ©νλ€. μ΄ λ©μλλ μκ°μ΄ νλ¦μ λ°λΌ λ³νλ propsμ stateκ° μμ‘΄νλ μμ£Ό λλ¬Έ μ¬λ‘λ₯Ό μν΄ μ‘΄μ¬νλ€.
μ°Έκ³ λ‘ μ»΄ν¬λνΈκ° μ²μ λ λλ§ λκΈ° μ μλ νΈμΆλκ³ κ·Έ μ΄ν 리λ λλ§ λκΈ° μ μλ λ§€λ² μ€νλλ€.
static getDerivedStateFromProps(nextProps, prevState) {
console.log("getDerivedStateFromProps");
if (nextProps.color !== prevState.color) {
return { color: nextProps.color };
}
return null;
}
μ»΄ν¬λνΈλ₯Ό λ λλ§νλ λ©μλμ΄λ€.
μ»΄ν¬λνΈμ 첫λ²μ§Έ λ λλ§μ΄ λ§μΉκ³ λλ©΄ νΈμΆλλ λ©μλμ΄λ€. μ΄ λ©μλκ° νΈμΆλλ μμ μλ μ»΄ν¬λνΈκ° νλ©΄μ λνλ μνμ΄λ€.
μΈλΆμμ λ°μ΄ν°λ₯Ό λΆλ¬μμΌ νλ€λ©΄, λ€νΈμν¬ μμ²μ 보λ΄κΈ° μ μ ν μμΉλ€.
props λλ stateκ° λ³κ²½λλ©΄ κ°±μ μ΄ λ°μνλ€. μλ λ©μλλ€μ μ»΄ν¬λνΈκ° λ€μ λ λλ§λ λ μμλλ‘ νΈμΆλλ€.
getDerivedStateFromProps β shouldComponentUpdate β render β getSnapshotBeforeUpdate β componentDidUpdate
λ§μ΄νΈ λ λμλ μ€λͺ νλ λ©μλ
shouldComponentUpdate
Β λ©μλλ μ»΄ν¬λνΈκ° 리λ λλ§ ν μ§ λ§μ§λ₯Ό κ²°μ νλ λ©μλμ΄λ€. μ£Όλ‘ μ΅μ ν ν λ μ¬μ©νλ λ©μλμ΄λ©° React.memo
μ λΉμ·νλ€.
shouldComponentUpdate(nextProps, nextState) {
console.log("shouldComponentUpdate", nextProps, nextState);
// μ«μμ λ§μ§λ§ μλ¦¬κ° 4λ©΄ 리λ λλ§νμ§ μμ΅λλ€
return nextState.number % 10 !== 4;
}
μ»΄ν¬λνΈλ₯Ό λ λλ§νλ λ©μλ
getSnapshotBeforeUpdate
Β λ μ»΄ν¬λνΈμ λ³νκ° μΌμ΄λκΈ° μ§μ μ DOM μνλ₯Ό κ°μ Έμμ νΉμ κ°μ λ°ννλ©΄ κ·Έ λ€μ λ°μνκ² λλΒ componentDidUpdate
Β ν¨μμμ λ°μμμ μ¬μ©μ ν μ μλ€.
ν¨μν μ»΄ν¬λνΈ + Hooksλ₯Ό μ¬μ©ν λ μ΄ λ©μλλ₯Ό λ체ν μ μλ κΈ°λ₯μ μμ§ μλ€.
getSnapshotBeforeUpdate(prevProps, prevState) {
console.log("getSnapshotBeforeUpdate");
if (prevProps.color !== this.props.color) {
return this.myRef.style.color;
}
return null;
}
componentDidUpdate
Β λ 리λ λλ§μ΄ λ§μΉκ³ , νλ©΄μ μ°λ¦¬κ° μνλ λ³νκ° λͺ¨λ λ°μλκ³ λ λ€ νΈμΆλλ λ©μλμ΄λ€. 3λ²μ§Έ νλΌλ―Έν°λ‘Β getSnapshotBeforeUpdate
Β μμ λ°νν κ°μ μ‘°ν ν μ μμ΅λλ€.
componentDidUpdate(prevProps, prevState, snapshot) {
console.log("componentDidUpdate", prevProps, prevState);
if (snapshot) {
console.log("μ
λ°μ΄νΈ λκΈ° μ§μ μμ: ", snapshot);
}
}
μΈλ§μ΄νΈλΌλκ²μ, μ»΄ν¬λνΈκ° νλ©΄μμ μ¬λΌμ§λκ²μ μλ―Ένλ€. μΈλ§μ΄νΈμ κ΄λ ¨λ μλͺ
μ£ΌκΈ° λ©μλλΒ componentWillUnmount
Β νλμ΄λ€.
componentWillUnmount
Β λ μ»΄ν¬λνΈκ° νλ©΄μμ μ¬λΌμ§κΈ° μ§μ μ νΈμΆλλ€. μ£Όλ‘ DOMμ μ§μ λ±λ‘νμλ μ΄λ²€νΈλ₯Ό μ κ±°νκ³ , λ§μ½μΒ setTimeout
μ κ±Έμκ²μ΄ μλ€λ©΄Β clearTimeout
μ ν΅νμ¬ μ κ±°λ₯Ό νλ€.
componentWillUnmount() {
console.log("componentWillUnmount");
}
μλ λ©μλλ€μ μμ μ»΄ν¬λνΈλ₯Ό λ λλ§νκ±°λ, μμ μ»΄ν¬λνΈκ° μλͺ μ£ΌκΈ° λ©μλλ₯Ό νΈμΆνκ±°λ, λλ μμ μ»΄ν¬λνΈκ° μμ±μ λ©μλλ₯Ό νΈμΆνλ κ³Όμ μμ μ€λ₯κ° λ°μνμ λμ νΈμΆλλ€.
μ΄ μλͺ μ£ΌκΈ° λ©μλλ νμμ μμ μ»΄ν¬λνΈμμ μ€λ₯κ° λ°μνμ λ νΈμΆλλ€. λ¨ render λ¨κ³μμ νΈμΆλλ―λ‘, λΆμ ν¨κ³Όλ₯Ό λ°μμν€λ©΄ μλλ€. ν΄λΉ κ²½μ°μλ componentDidCatchλ₯Ό λμ μ¬μ©νμ.
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// stateλ₯Ό κ°±μ νμ¬ λ€μ λ λλ§μμ λ체 UIλ₯Ό νμν©λλ€.
return { hasError: true };
}
render() {
if (this.state.hasError) {
// λ³λλ‘ μμ±ν λ체 UIλ₯Ό λ λλ§ν μλ μμ΅λλ€.
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
μ΄ μλͺ μ£ΌκΈ° λ©μλλ μμ μ»΄ν¬λνΈμμ μ€λ₯κ° λ°μνμ λμ νΈμΆλλ©°, 2κ°μ 맀κ°λ³μλ₯Ό μ λ¬λ°λλ€. λν μ»€λ° λ¨κ³μμ νΈμΆλλ€.
componentDidCatch(error, info) {
// error : λ°μν μ€λ₯
// info : μ΄λ€ μ»΄ν¬λνΈκ° μ€λ₯λ₯Ό λ°μνλμ§μ λν μ 보λ₯Ό ν¬ν¨ν componentStack ν€λ₯Ό κ°κ³ μλ κ°μ²΄
logComponentStackToMyService(info.componentStack);
}
μμμ μ€λͺ ν μλͺ μ£ΌκΈ° λ©μλλ€κ³Ό λ¬λ¦¬ μλμ λ©μλλ€μΒ μ¬μ©μκ°Β μ»΄ν¬λνΈ λ΄μμ μ§μ νΈμΆν μ μλ€.
μ»΄ν¬λνΈ stateμ λ³κ²½ μ¬νμ λκΈ°μ΄μ μ§μ΄λ£κ³ , Reactμκ² ν΄λΉ μ»΄ν¬λνΈμ κ·Έ μμλ€μ΄ κ°±μ λ stateλ₯Ό μ¬μ©νμ¬ λ€μ λ λλ§λμ΄μΌ νλ€κ³ μλ¦°λ€. μΈμ§ μ±λ₯(Perceived Performance)μ ν₯μμ μνμ¬ Reactλ μ΄ λ©μλμ μ€νμ μ§μ°μν€κ³ μ¬λ¬ μ»΄ν¬λνΈλ₯Ό νλ²μ κ°±μ ν μλ μλ€.
λ€μ μ±ν°μ μμΈν λ€λ€λ³΄κ² μ΅λλΉ~
component.forceUpdate(callback)
μ»΄ν¬λνΈμ state λλ propsκ° λ³κ²½λλ©΄, μ»΄ν¬λνΈκ° λ€μ λ λλ§λλ κ²μ΄ κΈ°λ³Έ λμμ΄λ€. μ΄λ€ μ»΄ν¬λνΈμΒ render()
Β λ©μλκ° λ€λ₯Έ λ°μ΄ν°κ°μ μμ‘΄νλ κ²½μ°, Reactλ‘ νμ¬κΈΒ forceUpdate()
λ₯Ό νΈμΆνμ¬ λ λλ§μ λ€μ μννλλ‘ λ§λ€ μ μλ€.
κ³μ 곡μλ¬Έμλ₯Ό μ½μΌλ©΄μ μλͺ
μ£ΌκΈ°μ λν λ΄μ©μ΄ λμμ κΌ μ΄ν΄λ³΄κ³ λμ΄κ°κ³ μΆμλ€. λΉλ‘ μ§κΈμ μμ£Ό μ¬μ©νμ§ μμ§λ§ λμ€μ νμ¬μ λ€μ΄κ°μ λ κ±°μ μ½λλ₯Ό λ§μ§κ² λ μλ μμΌλ μμλλ κ²μ΄ μ’μ κ² κ°μλ€.
κ·Έλμ ν¨μν μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ©΄μ useEffect
μ λν΄μ μκ³ λ§ μκ³ ν΄λμ€ν μ»΄ν¬λνΈμ λν΄μλ λͺ¨λ₯΄λ μνμλ€. μ΄λ² κΈ°νλ‘ μ΄λ€ λ©μλκ° μκ³ μΈμ νΈμΆλλμ§ μκ² λμλ€.