1. state를 설정하면 렌더링이 트리거된다.
2. 렌더링은 그 시점의 스냅샷을 찍는다.
3. 시간 경과에 따른 state
KeyNote
- state 변수는 읽고 쓸 수 있는 일반 JavaScript 변수처럼 보일 수 있다.
- 하지만 state는 스냅샷처럼 동작한다.
- state 변수를 설정해도 이미 가지고 있는 state 변수는 변경되지 않고, 대신 리렌더링이 실행된다.
// 예시
import { useState } from 'react';
export default function Form() {
const [isSent, setIsSent] = useState(false);
const [message, setMessage] = useState('Hi!');
if (isSent) {
return <h1>Your message is on its way!</h1>
}
return (
<form onSubmit={(e) => {
e.preventDefault();
setIsSent(true);
sendMessage(message);
}}>
<textarea
placeholder="Message"
value={message}
onChange={e => setMessage(e.target.value)}
/>
<button type="submit">Send</button>
</form>
);
}
function sendMessage(message) {
// ...
}
setIsSent(true)
가 React에 UI를 다시 렌더링하도록 지시한다.onSubmit
이벤트 핸들러가 실행된다.setIsSent(true)
가 isSent
를 true
로 설정하고 새 렌더링을 큐에 대기시킨다.isSent
값에 따라 컴포넌트를 다시 렌더링한다.
Illustrated by Rachel Lee Nabors
Illustrated by Rachel Lee Nabors
import { useState } from 'react';
export default function Counter() {
const [number, setNumber] = useState(0);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(number + 5);
alert(number);
}}>+5</button>
</>
)
}
setNumber(0 + 5);
alert(0);
import { useState } from 'react';
export default function Counter() {
const [number, setNumber] = useState(0);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(number + 5);
setTimeout(() => {
alert(number);
}, 3000);
}}>+5</button>
</>
)
}
setNumber(0 + 5);
setTimeout(() => {
alert(0);
}, 3000);
onClick
내에서, setNumber(number + 5)
가 호출된 후에도 number
의 값은 계속 0
이다.import { useState } from 'react';
export default function Form() {
const [to, setTo] = useState('Alice');
const [message, setMessage] = useState('Hello');
function handleSubmit(e) {
e.preventDefault();
setTimeout(() => {
alert(`You said ${message} to ${to}`);
}, 5000);
}
return (
<form onSubmit={handleSubmit}>
<label>
To:{' '}
<select
value={to}
onChange={e => setTo(e.target.value)}>
<option value="Alice">Alice</option>
<option value="Bob">Bob</option>
</select>
</label>
<textarea
placeholder="Message"
value={message}
onChange={e => setMessage(e.target.value)}
/>
<button type="submit">Send</button>
</form>
);
}
https://developer.mozilla.org/ko/