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, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Clock />);
https://codepen.io/gaearon/pen/amqdNr?editors=0010
root.render()
로 전달되었을 때 constructor가 호출되고 현재 시각이 업데이트 된다.render()
메서드가 호출된다. 이를 통해 DOM이 업데이트 된다.componentDidMount
메서드가 호출된다. 그 안에서 setInterval을 통해 1초마다 tick() 메서드가 호출되게 된다.componentWillUnmount
메서드가 호출되고 타이머가 멈추게 된다.function Clock(){
const [state, setState] = React.useState({date: new Date()});
const [timerId, setTimerId] = React.useState();
React.useEffect(() => {
setTimerId(setInterval(()=>tick(), 1000))
return () => {
clearInterval(timerID);
}
}, []);
function tick(){
setState({date: new Date()})
}
return(
<div>
<h1>Hello, world!</h1>
<h2>It is {state.date.toLocaleTimeString()}.
</h2>
</div>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Clock />);
https://codepen.io/milk717/pen/jOxRqby
function Clock(){
const [state, setState] = React.useState({date: new Date()});
const [timerId, setTimerId] = React.useState();
const [count, setCount] = React.useState(0);
const [input, setInput] = React.useState(0);
React.useEffect(() => {
setTimerId(setInterval(()=>tick(), 1000))
return () => {
clearInterval(timerID);
}
}, []);
function tick(){
setState({date: new Date()})
}
const handleCountButtonClick = () =>{
setCount(count + 1);
}
const handleCountReset = () =>{
setCount(0);
}
const handleCount = (e, number) =>{
console.log(number)
setCount(number);
}
const handleChangeInput = (e) =>{
setInput(Number(e.target.value));
}
return(
<div>
<h1>Hello, world!</h1>
<h2>It is {state.date.toLocaleTimeString()}.
</h2>
<p>{count}</p>
<button onClick={handleCountButtonClick}>count 증가</button>
<button onClick={handleCountReset}>count 초기화</button>
<button onClick={(e) =>handleCount(e, count-1)}>count 감소</button>
<br/>
<input type="number" onChange={handleChangeInput}/>
<button onClick={(e) =>handleCount(e, input)}>count 입력</button>
</div>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Clock />);
https://codepen.io/milk717/pen/poVByxL?editors=1011