π£ νΌμ 곡λΆνλ μ©λλ‘ λΈλ‘κ·Έλ₯Ό 보면μ μμ±ν κ±°λΌ λ΄μ©μ΄ μλΉμλΉν λΉμ·ν©λλ€. νΉμλ λ³΄κ² λ μ¬λμ΄ μμΌμλ€λ©΄ μ°Έκ³ λ°λλλ€!
μ»΄ν¬λνΈ μ΄κΈ° μμ±
μ»΄ν¬λνΈκ° λΈλΌμ°μ μ λνλκΈ° μ , νμ νΈμΆλλ API
constructor(props) {
super(props);
μ»΄ν¬λνΈ μμ±μ ν¨μ, μ»΄ν¬λνΈκ° μλ‘ λ§λ€μ΄μ§ λλ§λ€ νΈμΆλλ ν¨μμ΄λ€.
componentWillMoumt() {
}
μ΄ API λ μ»΄ν¬λνΈκ° νλ©΄μ λκ°κΈ° μ§μ μ νΈμΆλλ API,μ£Όλ‘ λΈλΌμ°μ κ° μλ νκ²½μμλ (μλ²μ¬μ΄λ) νΈμΆνλ μ©λλ‘ μ¬μ©νμλλ°, v16.3 μμλ ν΄λΉ API κ° deprecated λμλ€. κ·Έλ₯ μμꡬλ~ v16.3 μ΄νλΆν°λ UNSAFE_componentWillMount()
λΌλ μ΄λ¦μΌλ‘ μ¬μ©λλ€.
componentDidMount() {
// μΈλΆ λΌμ΄λΈλ¬λ¦¬ μ°λ: D3, masonry, etc...
// μ»΄ν¬λνΈμμ νμν λ°μ΄ν° μμ²: Ajax, GraphQL, etc...
// DOM μ κ΄λ ¨λ μμ
: μ€ν¬λ‘€ μ€μ , ν¬κΈ° μ½μ΄μ€κΈ° λ±...
}
μ΄ API λ μ»΄ν¬λνΈκ° νλ©΄μ λνλκ² λμ λ νΈμΆλλ€. μ£Όλ‘ ν΄λΉ μ»΄ν¬λνΈμμ νμλ‘νλ λ°μ΄ν°λ₯Ό μμ²νκΈ° μν΄μ axios, fetch λ±μ ν΅νμ¬ ajax μμ²μ νκ±°λ, DOM μ μμ±μ μ½κ±°λ μ§μ λ³κ²½νλ μμ μ νλ€.
μ»΄ν¬λνΈ μ λ°μ΄νΈ
μ»΄ν¬λνΈ μ λ°μ΄νΈλ props λ³ν, state μ λ³νμ λ°λΌ κ²°μ λλ€. μ λ°μ΄νΈκ° λκΈ° μ κ³Ό λ νμ νΈμΆλλ API
componentWillReceiveProps(nextProps) {
// this.props λ μμ§ λ°λμ§ μμ μν
}
μ΄ API λ μ»΄ν¬λνΈκ° μλ‘μ΄ props λ₯Ό λ°κ²λμ λ νΈμΆλλ€. μ£Όλ‘ state κ° props μ λ°λΌ λ³ν΄μΌ νλ λ‘μ§μ μμ±νλ€. μλ‘ λ°κ² λ props λ nextProps λ‘ μ‘°νν μ μμΌλ©°, this.props λ μ
λ°μ΄νΈ λκΈ° μ μ props, v16.3λΆν° deprecate λμ΄, UNSAFE_componentWillReceiveProps()
λ‘ μ¬μ©λλλ€.
static getDerivedStateFromProps(nextProps, prevState) {
// μ¬κΈ°μλ setState λ₯Ό νλ κ²μ΄ μλλΌ
// νΉμ props κ° λ°λ λ μ€μ νκ³ , μ€μ νκ³ μΆμ state κ°μ 리ν΄νλ ννλ‘ μ¬μ©
/*
if (nextProps.value !== prevState.value) {
return { value: nextProps.value };
}
return null; // null μ 리ν΄νλ©΄ λ°λ‘ μ
λ°μ΄νΈ ν κ²μ μλ€λΌλ μλ―Έ
/*
}
v16.3 μ΄νμ λ§λ€μ΄μ§ λΌμ΄νμ¬μ΄ν΄ APIμ΄λ€. propsλ‘ λ°μμ¨ κ°μ stateλ‘ λκΈ°ννλ μμ μ ν΄μ€μΌ νλ κ²½μ°μ μ¬μ©λλ€.
shouldComponentUpdate(nextProps, nextState) {
// return false νλ©΄ μ
λ°μ΄νΈ μ ν¨
// return this.props.checked !== nextProps.checked
return true;
}
μ΄ API λ μ»΄ν¬λνΈλ₯Ό μ΅μ ννλ μμ μμ λ§€μ° μ μ©νκ² μ¬μ©λλ€!!! 리μ‘νΈμμλ λ³νκ° λ°μνλ λΆλΆλ§ μ λ°μ΄νΈλ₯Ό ν΄μ€μ μ±λ₯μ΄ κ½€ μ λμ€λλ° λ³νκ° λ°μν λΆλΆλ§ κ°μ§ν΄ λ΄κΈ° μν΄μλ Virtual DOM μ ν λ² κ·Έλ €μ€μΌ νλ€.
μ¦, νμ¬ μ»΄ν¬λνΈμ μνκ° μ λ°μ΄νΈλμ§ μμλ, λΆλͺ¨ μ»΄ν¬λνΈκ° 리λ λλ§λλ©΄, μμ μ»΄ν¬λνΈλ€λ λ λλ§ λλ€.
μΈλ°μμ΄ λλΉλκ³ μλ CPU μ²λ¦¬λμ μ€μ¬μ£ΌκΈ° μν΄μ shouldComponentUpdate
λ₯Ό μ¬μ©νλ€.
μ΄ ν¨μλ κΈ°λ³Έμ μΌλ‘ true
λ₯Ό λ°ννλ€. 쑰건μ λ°λΌ false
λ₯Ό 리ν΄ν΄μ ν΄λΉ 쑰건μλ render ν¨μλ₯Ό νΈμΆνμ§ μμ νλ©΄μ 리λ λλ§νλ λλΉλ₯Ό μ€μ¬ CPU μ²λ¦¬λμ μ€μΌ μ μλ€..
componentWillUpdate(nextProps, nextState) {
// μ λ맀μ΄μ
ν¨κ³Όλ₯Ό μ΄κΈ°ννκ±°λ
// μ΄λ²€νΈ 리μ€λλ₯Ό μμ λ μμ
μ νλ€.
}
μ΄ API λ shouldComponentUpdate
μμ true
λ₯Ό λ°ννμ λλ§ νΈμΆλλ€. v16.3 μ΄ν deprecate λμ΄μ κΈ°μ‘΄μ κΈ°λ₯μ getSnapshotBeforeUpdate
λ‘ λ체λ μ μλ€.
μ΄ API κ° λ°μνλ μμ μ
μ΄ API λ₯Ό ν΅ν΄μ, DOM λ³νκ° μΌμ΄λκΈ° μ§μ μ DOM μνλ₯Ό κ°μ Έμ€κ³ , μ¬κΈ°μ 리ν΄νλ κ°μ componentDidUpdate
μμ 3λ²μ§Έ νλΌλ―Έν°λ‘ λ°μμ¬ μ μλ€.
getSnapshotBeforeUpdate(prevProps, prevState) {
// DOM μ
λ°μ΄νΈκ° μΌμ΄λκΈ° μ§μ μ μμ μ΄λ€.
// μ¬κΈ°μ return νλ κ°μ componentDidMount μμ snapshot κ°μΌλ‘ λ°μμ¬ μ μλ€.
return ;
}
componentDidUpdate(prevProps, prevState, snapshot) {
}
μ΄ API λ μ»΄ν¬λνΈμμ render() λ₯Ό νΈμΆνκ³ λ λ€μμ νΈμΆλλ€. μ΄ μμ μμλ this.props
μ this.state
κ° λ°λμ΄μλ€. κ·Έλ¦¬κ³ prevProps, prevState λ₯Ό μ‘°νν μ μλ€. κ·Έλ¦¬κ³ getSnapshotBeforeUpdate
μμ λ°νν snapshot κ°μ λ°μμ¨λ€.
μ»΄ν¬λνΈ μ κ±°
μ»΄ν¬λνΈκ° λ μ΄μ νμνμ§ μκ² λλ©΄ λ¨ νλμ APIκ° νΈμΆλλ€.
componentWillUnmount() {
// μ΄λ²€νΈ, setTimeout, μΈλΆ λΌμ΄λΈλ¬λ¦¬ μΈμ€ν΄μ€ μ κ±°
}
μ΄ API μμλ, μ£Όλ‘ λ±λ‘νμλ μ΄λ²€νΈλ₯Ό μ κ±°νκ³ , λ§μ½ setTimeout
μ κ±Έμλ€λ©΄ clearTimeout
μ ν΅νμ¬ μ κ±°λ₯Ό νλ€.
μΆκ°μ μΌλ‘, μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νκ±°λ ν΄λΉ λΌμ΄λΈλ¬λ¦¬μ dispose
κΈ°λ₯μ΄ μλ€λ©΄ μ¬κΈ°μ νΈμΆνλ©΄ λλ€.
μ»΄ν¬λνΈμ μλ¬ λ°μ
render ν¨μμμ μλ¬κ° λ°μνλ€λ©΄, 리μ‘νΈ μ‘μ΄ ν¬λμ¬ λμ΄λ²λ¦°λ€(===μ±μ΄ μκΈ°μΉ μμ μ€λ₯ λλ μμΈλ‘ λμμ λ©μΆκ³ μλνμ§ μλ μνκ° λλ€)
μΌλ°μ μΌλ‘ λ λλ§ λΆλΆμμ μ€λ₯κ° λ°μνλ κ²μ μ¬μ μ λ°©μ§ν΄μΌνλ€. μ£Όλ‘ μλ¬κ° λ°μνλ μ΄μ λ
this.props.onClick();
this.props.object.value; // object is undefined
this.props.array.length; // array is undefined
μ΄λ¬ν κ²λ€μ render ν¨μμμ λ§μ μ€ μ μλ€!!!
render() {
if (!this.props.object || !this.props.array || this.props.array.length === 0) return null;
// object λ array λ₯Ό μ¬μ©νλ μ½λ
}
componentDidCatch(error, info) {
this.setState({
error: true
});
}
μλ¬κ° λ°μνκ² λλ©΄ μ΄λ κ² componentDidCatch
κ° μ€ννκ³ , state.error
λ₯Ό true
λ‘ μ€μ νκ³ render ν¨μμͺ½μμ μ΄μ λ°λΌ μλ¬λ₯Ό λμμ£Όλ©΄ λλ€.
μ£Όμν μ μ, μ»΄ν¬λνΈ μμ μ render ν¨μμμμ μλ¬κ° λ°μνλ κ²μ μ‘μλΌ μ μμ§λ§ λμ μ μμ μ»΄ν¬λνΈ λ΄λΆμμ λ°μνλ μλ¬λ€μ μ‘μ μ μλ€.
componentDidCatch
API λ₯Ό μ¬μ©νλ©΄ render λΆλΆμμ λ°μνλ μ€λ₯λ‘ μ±μ΄ μ’
λ£λ λ λΉ νμ΄μ§λ₯Ό μΆλ ₯νλ κ²μ΄ μλλΌ μλ¬κ° λ°μνλ€λ 문ꡬλ₯Ό λμ°λ©΄μ UXλ₯Ό λμΌ μ μλ κ² κ°λ€
-> μ΄ λΆλΆμ μΆκ°μ μΈ μ½λ μ€μ΅μ React μ€μ λ§μΉκ³ ν΄λ³΄μ
μ°Έκ³ μλ£