바닐라JS는 데이터가 바뀔 때마다 전체를 업데이트하지만,
React는 바뀐 부분만 인지해서 업데이트 한다.
-> 업데이트 시간을 단축할 수 있음.
📌 핵심
데이터(state)가 바뀔 때마다 React가 바뀐 값을 가진 컴포넌트를 리렌더링 하고 UI를 refresh한다.
- UI를 업데이트 하고 싶을 때(데이터가 바뀌었을 때)는 리렌더링 해주어야 함.
useState
를 사용한다.const [데이터, 데이터수정함수] = React.useState(기본값);
예시
function App(){
const [counter, setCounter] = React.useState(0);
const onClick = () => {
setCounter(counter+1); // 클릭할 때마다 counter에 1을 더해서 리렌더링 해줌.
}
return(
<div>
<h3>Total clicks : {counter}</h3>
<button onClick = {onClick}>Click me</button>
</div>
)
}
단점 : 어디선가 예상치 못한 업데이트가 일어났을 때 영향을 받아 혼동을 줄 수 있음.
장점: 더 안전함. 확실히 현재 값임을 알 수 있어서 혼동을 방지할 수 있음.
function App(){
const [counter, setCounter] = React.useState(0);
const onClick = () => {
// 방법 1. setCounter(counter+1);
// 방법 2. setCounter((current) => current + 1);
}
return(
<div>
<h3>Total clicks : {counter}</h3>
<button onClick = {onClick}><Click me/button>
</div>
)
}
<h1 className="hi">hello</h1>
for -> htmlFor
JSX에 변수 추가하고 싶을 때는 { }
안에 넣어주면 된다.
event.target.value
를 쓴다.disabled
쓰면 아무것도 입력할 수 없게 된다.예제
function App(){
const [amount, setAmount] = React.useState(0);
const [flipped, setFlipped] = React.useState(false);
const onChange = (event) => {
setAmount(event.target.value)
}
const reset = () => setAmount(0);
const onFlip = () => {
reset(); // flip할 때마다 값이 랜덤으로 바뀌어서 리셋해줌
setFlipped((current) => !current);
}
return(
<div>
<h1 className = "hi">super converter</h1>
<label htmlFor = "minutes">Minutes</label>
<input
value = {flipped ? amount * 60 : amount} // input 값을 보여줌
id="minutes"
placeholder = "Minutes"
onChange = {onChange} // 입력값 업데이트
disabled = {flipped === true} // flip됐을 때 입력할 수 없게
// disabled = {flipped} 위에랑 같은 의미
/>
<label htmlFor = "hours">Hours</label>
<input
value = {flipped ? amount : amount / 60} // 분을 60으로 나눠서 시간으로
id="hours"
placeholder = "Hours"
onChange = {onChange} // 입력값 업데이트
disabled = {flipped === false} // flip되지 않았을 때 입력할 수 없게
// disabled = {!flipped} 위에랑 같은 의미
/>
<button onClick = {reset}>Reset</button>
<button onClick = {onFlip}>{flipped ? "Turn back" : "Flip"}</button>
</div>
)
}