React :: μλͺ μ£ΌκΈ° (Lifecycle)
μλͺ μ£ΌκΈ° λ©μλ
ν΄λμ€ Component μμ μλͺ μ£ΌκΈ° λ©μλλ₯Ό μ μΈνμ¬ μ»΄ν¬λνΈκ° λ§μ΄νΈλκ±°λ μΈλ§μ΄νΈ λ λμ μ€νν μ½λλ₯Ό μμ±ν μ μλ€.
μ¦ Component κ° λ³΄μ¬μ§κ³ , μ¬λΌμ§κ³ , μ λ°μ΄νΈ λ λ νΈμΆλλ API μ΄λ€.
λ§€μ° μ€μνκ³ , μ¬μ©νλ©΄ ν¨μ¨μ μΈ νλ‘κ·Έλλ°μ ν μ μμΌλ μ λ΄λμ.
componentDidMount()
μ»΄ν¬λνΈ μΆλ ₯λ¬Όμ΄ μ²μ DOM μ λ λλ§ λ νμ μ€νλλ ν¨μ.
μ£Όλ‘ μΈλΆ λΌμ΄λΈλ¬λ¦¬μμ μ°λ, Component μμ νμν λ°μ΄ν° μμ² λ±μ μ¬κΈ°μ μμ±νλ€.
componentDidMount() {
//DOM μ μ²μ Component κ° λ λλ§ λ λ μ€νλ¨
}
componentWillUnmount()
λ§μ΄νΈλ μ»΄ν¬λνΈκ° DOM μΌλ‘λΆν° ν λ²μ΄λΌλ μμ λ μ μλ€λ©΄ React λ μ΄ μλͺ μ£ΌκΈ° λ©μλλ₯Ό νΈμΆνλ€.
μ£Όλ‘ setTimeout μ κ±Έμ΄λμκ±Έ μμ κ±°λ, μ΄λ²€νΈ μ²λ¦¬, μΈλΆ λΌμ΄λΈλ¬λ¦¬ μΈμ€ν΄μ€ μ κ±° λ±μ μ¬κΈ°μ μμ±νλ€.
componentWillUnmount(){
//DOM μμ Component κ° μμ λλ©΄ μ€νλ¨
}
shouldComponentUpdate(nextProps, nextState)
μ΄ λ©μλλ μ΅μ ννλ λ°μ λ§μ΄ μ¬μ©νλ€.
React μμ μ΄λ€ μ»΄ν¬λνΈκ° 리λ λλ§λλ©΄ (μ λ°μ΄νΈλλ©΄) , κ·Έ μ»΄ν¬λνΈμ μμ μ»΄ν¬λνΈλ€λ 리λ λλ§λλ€.
(λ λλ§λλ€λ κ²μ render() ν¨μκ° μ€νλλ€λ κ²μ΄λ€)
λ¬Όλ‘ λ³κ²½ μνμ΄ μλ€λ©΄ μ€μ DOM μ‘°μμ μΌμ΄λμ§ μλ€. λ¨μ§ Virtual DOM μ λ λλ§μ μνν λΏμ΄λ€.
κ·Έλ λ€λ©΄ μμ Component κ° λ§λ€λ©΄, κ·Έλ§νΌ μμμ μ¬μ©ν΄μ λΆμμ μΈ, μΈλ°μλ μμ μ μννκ² λ μ μλ€.
λ°λΌμ μ λ°μ΄νΈκ° νμνμ§ μλ Component μ κ²½μ° μ΄ λ©μλμμ false λ₯Ό λ°νν΄μ£Όλ©΄ λλ€.
default λ true λ₯Ό λ°ννμ¬, μ λ°μ΄νΈλ₯Ό μννμ§λ§ false λ₯Ό λ°ννλ€λ©΄ ν΄λΉ 쑰건μμλ 리λ λλ§, μ¦ render() μ νΈμΆνμ§ μκ² λλ κ²μ΄λ€.
shouldComponentUpdate(nextProps, nextState){
return true; // default
// return false;
}
componentDidUpdate(prevProps, prevState, snapshot)
μ΄ λ©μλλ Component μμ render() μ νΈμΆνκ³ λ λ€μ νΈμΆλλ€.
μ΄ μμ μμλ props μ state κ° λ°λμ΄μκΈ° λλ¬Έμ, μΈμλ‘ prevProps μ prevState λ₯Ό λ³Ό μ μλ€.
snapshot κ°μ getSnapshotBeforeUpdate() λ©μλμμ λ°νν κ°μ΄λ€.
getSnapshotBeforeUpdate()
μ΄ λ©μλλ render() νΈμΆ ν, μ€μ DOM μ μ λ°μ΄νΈνκΈ° μ μ νΈμΆλλ€.
μ¦, λ€μκ³Ό κ°μ κ³Όμ μ΄ Component Update μ μ€νλλ€.
- λ λλ§ (render())
- getSnapshotBeforeUpdate()
- μ€μ DOM μ μ λ°μ΄νΈ (λ³ν)
- componentDidUpdate()
μ΄ λ©μλλ₯Ό ν΅ν΄ DOM λ³νκ° μΌμ΄λκΈ° μ§μ μ DOM μνλ₯Ό κ°μ Έμμ componentDidUpdate() μμ νμΈν μ μκ² λλ€.
μμ
React 곡μ λ¬Έμμ λμμλ μκ³ νμ΄λ¨Έ μμ λ₯Ό μ§μ ν΄λ³΄μ.
μλμ tick Component λ μκ°μ΄ λ³νλ κ²μ 1000ms λ§λ€ μ λ°μ΄νΈ ν΄μ£Όλ κΈ°λ₯μ μννλ€.
function tick() {
const element = (
<div>
<h1>Hello, world!</h1>
<h2>It is {new Date().toLocaleTimeString()}.</h2>
</div>
);
ReactDOM.render(
element,
document.getElementById('root')
);
}
setInterval(tick, 1000);
κ·Έλ°λ° tick Component λ μ»΄ν¬λνΈμ κΈ°λ₯μ μΈλΆμμ μ μ΄ν΄μ£Όκ³ μλ€.
κ·Έλμ μ΄λ₯Ό λ€μμ μꡬμ¬νμ λ§κ² λ³κ²½νκ³ μ νλ€.
- Component μ€μ€λ‘ νμ΄λ¨Έλ₯Ό μ€μ
- Component μ€μ€λ‘ λ§€μ΄ μ λ°μ΄νΈ
- νλλ‘ μμ ν μΊ‘μννκΈ°!
μ΄μ λΆν° μ΄ μꡬ μ¬νμ λ§μ‘±μν€λ Clock Component λ₯Ό μμ±ν κ²μ΄λ€.
μ°μ μ€μ€λ‘ νμ΄λ¨Έλ₯Ό μ€μ νκΈ° μ μΌ μ’μ μμ μ componentDidMount() μ΄κ³ , νμ΄λ¨Έλ₯Ό λ©μΆ μμ μ componentWillUnmount() κ° μ λΉνλ€.
μ¦, Clock Component κ° μ²μ DOM μ λ λλ§λλ μμ μ νμ΄λ¨Έλ₯Ό μ€μ νκ³ , Clock Component κ° DOM μμ μμ λλ μμ μ νμ΄λ¨Έλ₯Ό ν΄μ νλ €λ κ²μ΄λ€.
componentDidMount(){
this.timerId = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount(){
clearInterval(this.timerId);
}
this.props κ° React μ μν΄ μ€μ€λ‘ μ€μ λκ³ , this.stateκ° νΉμν μλ―Έκ° μμ§λ§
λ°μ΄ν° νλ¦ μμ ν¬ν¨λμ§ μλ νλͺ©μ 보κ΄ν νμκ° μλ€λ©΄,
μ¬κΈ° this.timerID μ²λΌ μμ λ‘κ² ν΄λμ€μ μλμΌλ‘ λΆκ°μ μΈ νλλ₯Ό μΆκ°ν΄λ λλ€.
κ·Έλ¦¬κ³ props λ‘ name μ λ°μμ "Hello, {name}!" μ 보μ¬μ£Όκ³ , "It is {μκ°}" γ μ 보μ¬μ€ κ²μ΄λ€.
λ°λΌμ, 1000ms λ‘ λ³ννλ μκ°μ Clock μ»΄ν¬λνΈμ state λ‘ κ°μ§κ³ , name μ porps μμ μ€ κ²μ΄λ€.
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {
date: new Date()
};
}
//μ€λ΅//
}
κ·ΈλΌ μ΄λ¬ν ννκ° λκ² λ€.
state μΌλ‘ μκ°μ λ΄μμ€ date λ₯Ό μ μνμλ€.
κ·ΈλΌ μ΄ date λ₯Ό 1000ms λ§λ€ μ λ°μ΄νΈν΄μΌ νλλ°, setState() λ‘ date λ₯Ό μ λ°μ΄νΈν tick() ν¨μλ₯Ό μμ±νμ.
tick(){
this.setState({
date: new Date()
});
}
μ΄μ λ€ λμλ€. μ 체 μ½λλ₯Ό λ³΄κ³ νλ¦μ μ 리ν΄λ³΄μ.
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {
date: new Date()
};
}
componentDidMount(){
this.timerId = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount(){
clearInterval(this.timerId);
}
tick(){
this.setState({
date: new Date()
});
}
render() {
return (
<div>
<h1>Hello, {this.props.name} !</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(
<Clock name="React"/>,
document.getElementById('root')
);
- ReactDOM μκ² Clock μ»΄ν¬λνΈκ° props = {name: "React"} λ‘ μ λ¬λλ©°, Clock μ»΄ν¬λνΈμ constructor λ₯Ό νΈμΆνλ€.
- constructor μμ this.state λ₯Ό μ΄κΈ°ννλ€.
- React λ Clock μ»΄ν¬λνΈμ render() λ©μλλ₯Ό νΈμΆνλ€. μ΄λ₯Ό ν΅ν΄ React λ νλ©΄μ νμν λ΄μ©μ μκ² λλ€.
- React λ Clock μ λ λλ§ μΆλ ₯κ°μ μΌμΉνκΈ° μν΄ DOM μ μ λ°μ΄νΈνλ€.
- Clock μΆλ ₯κ°μ΄ DOM μ μ½μ
λλ©΄ React λ componentDidMount() μλͺ
μ£ΌκΈ° λ©μλλ₯Ό νΈμΆνλ€.
(κ·Έ μμμ νμ΄λ¨Έλ₯Ό μ€μ νλ€. -λΈλΌμ°μ μ νμ΄λ¨Έ μμ²) - νμ΄λ¨Έλ₯Ό μ€μ ν λλ‘, λ§€μ΄ λΈλΌμ°μ κ° tick() λ©μλλ₯Ό νΈμΆν΄μ setState() λ₯Ό ν΅ν΄ νμ¬ μκ°μ ν¬ν¨νλ κ°μ²΄λ₯Ό νΈμΆνμ¬ UI μ λ°μ΄νΈλ₯Ό μ§ννλ€.
- setState() λ₯Ό ν΅ν΄ React λ state κ° λ³νν κ²μ μΈμ§νκ² λκ³ , νλ©΄μ νμλ (λ³κ²½λ) λ΄μ©μ μμλ΄κΈ° μν΄ render() λ©μλλ₯Ό λ€μ νΈμΆνλ€.
(μ΄ λ λ¬λΌμ§ this.state.date λ₯Ό DOM μ μ λ°μ΄νΈνλ€.) - Clock μ»΄ν¬λνΈκ° DOM μΌλ‘λΆν° ν λ²μ΄λΌλ μμ λ μ μ΄ μλ€λ©΄ React λ componentWillUnmount() μλͺ
μ£ΌκΈ° λ©μλλ₯Ό νΈμΆνλ€.
(-> νμ΄λ¨Έκ° λ©μΆκ² λλ€.)
λλ React CRA λ‘ μ App μ λ§λ€μμ λ μλμΌλ‘ μκΈ°λ ./my-app/src/App.js μμ μ΄ Clock μ»΄ν¬λνΈλ₯Ό μ¬μ©νλλ‘ μμ±ν΄μ£Όμλ€.
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
<div>
<Clock name="React"/> // here!!
</div>
</header>
</div>
);
}
κ·Έ κ²°κ³Ό μλμ κ°μ κ²°κ³Όλ¬Όμ μ»μ μ μμλ€.
κΈ°μ‘΄μ React νλ©΄μμ this.props.name κ³Ό λ§€μ΄ λ³ννλ μκ°μ μΆλ ₯ν μ μλ€.
Reference
React 곡μ λ¬Έμ ko.reactjs.org/docs/state-and-lifecycle.html
.