// 클래스형 컴포넌트
import React, { Component } from 'react'
export default class ClassComponent extends 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()
});
}
// Class 컴포넌트에서 그려줄 jsx를 리턴해줌
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
// 함수형 컴포넌트
export default function FunctionalComponent() {
// 함수형 컴포넌트에서의 state 관리 및 초기화를 하는 Hook
// 클래스 컴포넌트의 this.state = { date: new Date() };와 동일
const [date, setDate] = useState(new Date())
const tick = () => {
setDate(new Date())
}
// 마운트 되자마자 동작하게 하는 Hook
// 클래스 컴포넌트의 componentDidMount()와 동일
useEffect(() => {
const interval = setInterval(() => {tick()}, 1000)
// 클래스 컴포넌트의 componentWillUnmount()와 동일
return () => {
clearInterval(interval)
}
}, [])
return (
<div>
<h1>Hello, Function</h1>
<h2>It is {date.toLocaleTimeString()}.</h2>
</div>
);
}
모든 컴포넌트는 여러 종류의 "생명주기 메소드:를 가지며, 이 메소드를 오버라이딩 하여 특정 시점에 코드가 실행되도록 설정할 수 있다.
constructor()
render()
componentDidMount()
render()
componentDidUpdate()
componentWillUnmount()
import React, { Component } from 'react'
export default class LifeCycle extends Component {
constructor(props){
super(props);
console.log('constructor')
this.state = {date: new Date()};
}
componentDidMount(){
console.log('componentDidMount')
this.timerID = setInterval(() => this.tick(), 1000)
}
componentDidUpdate(){
console.log('componentDidUpdate')
}
componentWillUnmount(){
console.log('componentWillUnmount')
clearInterval(this.timerID)
}
tick(){
console.log('tick')
this.setState({date:new Date()})
}
render() {
console.log('render')
return (
<div>
</div>
)
}
}
// Constructor-> render-> componentDidMount -> componentWillUnmount -> componentDidMount -> tick -> render -> componentDidUpdate
// 함수형 컴포넌트에서 useState는 초기값을 정하고 그 값을 우리가 바꾸면 useEffect가 계속 불려와 짐
// 클래스형 컴포넌트에서는 마운트 시에 componentDidMount가, 업데이트 됏을때는 componentDidUpdate가 계속 불려짐
// 즉 클래스형 컴포넌트는 그때그때 변경에 따라 그려질때마다 자기가 선언해 둔 메소드를 사용함