react μ€ν°λμμ 리μ‘νΈλ₯Ό λ€λ£¨λ κΈ°μ μ΄λΌλ μ± μ μ μ νκ³ μ΄ μ± μ μ½κ³ λ°°μ΄ κ²μ λ°νμΌλ‘ μμ±λμλ€.
Mount
, Update
, Unmount
DOMμ΄ μμ±λκ³ μ»΄ν¬λνΈκ° λΈλΌμ°μ μμ λνλλ κ²μ λ§μ΄νΈλΌκ³ νλ€.
constructor
getDerivedStateFromProps
render
componentDidMount
state
λ₯Ό μ ν μ μλ€.props
κ°μ state
μ λ£μ΄μ£Όκ³ μΆμ λ μ¬μ©νλ€.static
ν€μλλ₯Ό λΆμ¬μΌ νκ³ ,μ΄ μμμλ this
λ₯Ό μ‘°νν μ μλ€.state
λ‘ μ€μ λκ³ , λ°λ©΄ null
μ΄ λ°νλλ©΄ μ무 μΌλ λ°μνμ§ μλλ€.static getDerivedStateFromProps(nextProps, prevState){
if (nextProps.value !== prevState.value){
return { color: nextProps.color };
}
return null;
}
this.props
μ this.state
μ μ κ·Όν μ μμΌλ©°, react element
λ₯Ό λ°ννλ€.μ£Όμ!
render
λ©μλ μμμλ μ΄λ²€νΈ λ±λ‘μ΄ μλ κ³³μμsetState
λ₯Ό μ¬μ©νλ©΄ μ λκ³ , λΈλΌμ°μ μDOM
μ μ κ·Όν΄μλ μ λλ€.DOM
μ 보λ₯Ό κ°μ Έμ€κ±°λstate
μ λ³νλ₯Ό μ€ λλcomponentDidMount
μμ μ²λ¦¬ν΄μΌ νλ€.
axios
, fetch
λ±μ ν΅νμ¬ ajax
μμ²DOM
μ μμ±μ μ½κ±°λ μ§μ λ³κ²½setTimeout
, setInterval
, λ€νΈμν¬ μμ² κ°μ λΉλκΈ° μμ
μ²λ¦¬props
κ° λ°λ λstate
κ° λ°λ λ (setState()
)this.forceUpdate()
κ° νΈμΆλμμ λprops
λ³νμ λ°λΌ state
κ°μλ λ³νλ₯Ό μ£Όκ³ μΆμ λ μ¬μ©props
λλ state
λ₯Ό λ³κ²½νμ λ, μ»΄ν¬λνΈλ₯Ό 리λ λλ§ ν μ§ λ§μ§ κ²°μ νλ λ©μλtrue
νΉμ false
λ₯Ό λ°νν΄μΌ νλ©°,true
λ₯Ό λ°ννλ©΄ λ€μ μλͺ
μ£ΌκΈ° λ©μλκ° κ³μ μ€νλκ³ , false
λ₯Ό λ°ννλ©΄ μμ
μ μ€μ§νλ€.this.forceUpdate()
ν¨μκ° νΈμΆλμ΄ μ
λ°μ΄νΈκ° μ§νλλ μνλΌλ©΄ μ λ©μλλ μ€νλμ§ μκ³ , λ°λ‘ render
ν¨μλ₯Ό νΈμΆνλ€.shouldComponentUpdate(nextProps, nextState){
console.log("shouldComponentUpdate", nextProps, nextState);
// μ«μμ λ§μ§λ§ μλ¦¬κ° 4λ©΄ 리λ λλ§νμ§ μμ΅λλ€
return nextState.number % 10 !== 4;
}
render
λ©μλμ μν΄ λ§λ€μ΄μ§ κ²°κ³Όλ¬Όμ΄ λΈλΌμ°μ νλ©΄μ λνλκΈ° μ§μ μ νΈμΆλλ€.DOM
μνλ₯Ό κ°μ Έμ€κΈ° λλ¬Έμ μ£Όλ‘ μ
λ°μ΄νΈνκΈ° μ§μ μ κ°μ μ°Έκ³ ν μΌμ΄ μμ λ μ¬μ©λλ€. (μ: μ€ν¬λ‘€λ° μμΉ μ μ§)componentDidUpdate
μ μΈ λ²μ§Έ νλΌλ―Έν°(snapshot
)λ‘ μ λ¬ν μ μλ€.getSnapshotBeforeUpdate(prevState, prevState){
if (prevState.array !== this.state.array){
const { scrollTop, scrollHeight } = this.list;
return { scrollTop, scrollHeight };
}
}
prevProps
, prevState
νλΌλ―Έν°λ₯Ό ν΅ν΄ μ
λ°μ΄νΈ μ μ μ»΄ν¬λνΈμ props
μ state
κ°μ μ κ·Όν μ μλ€.getSnapshotBeforeUpdate
λ©μλμμ λ°νλ κ°μ΄ μλ€λ©΄ μ¬κΈ°μ snapshot
κ°μ μ λ¬λ°μ μ μλ€.// μ€ν¬λ‘€λ° μ μ§
componentDidUpdate(prevProps, prevState, snapshot){
if (snapshot){
const { scrollTop } = this.list;
if (scrollTop === snapshot.scrollTop) return;
const diff = this.scrollHeight - snapshot.scrollHeight;
this.list.scrollTop += diff;
}
}
μ»΄ν¬λνΈλ₯Ό DOM
μμ μ κ±°νλ κ²μ μΈλ§μ΄νΈλΌ νλ€.
DOM
μμ μ κ±°λκΈ° μ§μ μ νΈμΆλλ€.DOM
μ μ§μ λ±λ‘λμλ μ΄λ²€νΈλ₯Ό μ κ±°νκ³ , λ§μ½μ setTimeout
, setInterval
λ©μλλ‘ νμ΄λ¨Έλ₯Ό λ±λ‘νλ€λ©΄ clearTimeout
, clearInterval
μ ν΅ν΄ μ κ±°ν΄μΌ νλ€.dispose
κΈ°λ₯μ΄ μλ€λ©΄ μ΄ λ©μλ μμμ νΈμΆνλ©΄ λλ€.v16
μμ μλ‘κ² λμ
λμμΌλ©°, μ»΄ν¬λνΈ λ λλ§ λμ€μ μλ¬κ° λ°μνμ λ νΈμΆλλ€.class ErrorBoundary extends Component {
state = {
error: false
};
constructor (props){
super(props);
}
componentDidCatch(error,info){
this.setState({
error: true;
});
}
render() {
if (this.state.error){
return <h1>Error!</h1>
}
return this.props.children;
}
}
export default ErrorBoundary;
μ°Έκ³ : React lifecycle methods diagram