가보자고~
useState()
는 배열을 제공한다.([value, modifier] 를 제공)const [<상태 값 저장 변수>, <상태 값 갱신 함수>] = useState(<상태 초기 값>);
setCounter
함수는 그 값으로 업데이트하고 리렌더링을 일으킨다.// ex)
function App() {
const [conuter, setCounter] = useState(0);
const onClick = () => {
setCounter(counter +1);
}
return(
<div>
<h3>Total Clicks: {counter}</h3>
<button onClick={onClick}>Click me</button>
</div>
);
}
counter
라는 데이터를 받음(초기값 0)counter
의 값을 바꿔줄 버튼이 클릭되면, counter
값을 바꿔줄 setCounter
함수가 호출counter
의 새로운 값을 가지고 setCounter()
가 호출되며 업데이트,리렌더링 발생setCounter
에 써준 값.return
값이 새로운 state가 되는 것(setState((cureent) => cureent +1))-minutes <-> hours / km <-> mile 각각 변환해주는 계산기를 만들어보자
function App () {
const [minutes, setMinutes] = useState(0);
const onChange = (event) => {
// input의 입력값을 가져와 업데이트
setMinutes(event.target.value)
};
const reset = () => setMinutes(0);
return(
<div>
<div>
<h1>Supber Converter</h1>
<label htmlFor="minutes"> Minutes</label>
<input
value={minutes}
className="minutes"
placeholder="Minutes"
type="number"
onChange={onChange}
/>
</div>
<div>
<label htmlFor="hours"> Hours </label>
<input
value={Math.round(minutes/60)}
className="hours"
placeholder="Hours"
type="number"
onChange={onChange}
/>
</div>
<button onClick={reset}>Reset</button>
</div>
);
}
for
,id
는 JS 용어로, JSX에서는 JSX문법에 따라 작성해주어야 한다.for
=> htmlFor
id
=> className
disabled
기능을 추가하여 hours도 minutes로 변환해주자input
태그의 disabled 속성 : 기본값 false(입력 불가 상태) /true(입력 가능상태)function App () {
const [amount, setAmount] = useState(0);
const [fliped, setFliped] = useState(false);
// → state값으로 input을 enabled할지 disabled 할지를 결정할 수 있음
const onChange = (event) => {
// input의 입력값을 가져와 업데이트
setAmount(event.target.value)
};
const reset = () => setAmount(0);
const onFlip = () => setFliped((cureent) => !cureent);
// →현재 state 값을 넣어주고, 결과는 그 반대를 도출하라 선언
return(
<div>
<div>
<h1>Supber Converter</h1>
<label htmlFor="minutes"> Minutes</label>
<input
value={amount}
className="minutes"
placeholder="Minutes"
type="number"
onChange={onChange}
disabled={flipped}
//→ 만약 fliped가 true 라면 disabled 처리
// disabled={flipped === true}와 같다
/>
</div>
<div>
<label htmlFor="hours"> Hours </label>
<input
value={Math.round(amount/60)}
className="hours"
placeholder="Hours"
type="number"
disabled={!flipped}
//→ 만약 fliped가 fasle라면 disabled 처리
// disabled={flipped === false}와 같다
/>
</div>
<button onClick={reset}>Reset</button>
<button onClick={onFlip}>Flip</button>
</div>
);
}
디폴트 값이 false 라고 정했으므로 Hours는 disabled 되어야함
disabled={!flipped}
, Minuets에는 반대로 disabled={flipped}
Minuets에는 에 값을 적어주었을 때만 hours 의 값이 변환되고,
hours에 값을 적어주었을 때만 Minuets 값이 변하게 하기위해 '삼항연산자' 사용.
<input
value={fliped ? amount : Math.round(minutes/60)}
className="hours"
placeholder="Hours"
type="number"
disabled={!flipped}
onChange={onChange}
/>
<input
value={fliped ? amount * 60 : amount}
className="minutes"
placeholder="Minutes"
type="number"
onChange={onChange}
disabled={flipped}
/>
onFlip()
함수에 reset();
함수를 추가const onFlip = () => {
reset();
setFliped((cureent) => !cureent);
}
<button onClick={onFlip}>{fliped ? "Turn Back" : "flip"}</button>
function App() {
const [amount, setAmount] = useState(0);
const [fliped, setFliped] = useState(false);
const onChange = (event) => {
setAmount(event.target.value)
};
const reset = () => setAmount(0);
const onFlip = () => {
reset();
setFliped((cureent) => !cureent);
};
return(
<div>
<div>
<h1>Supber Converter</h1>
<label htmlFor="minutes"> Minutes </label>
<input
value={fliped ? amount * 60 : amount}
className="minutes"
placeholder="Minutes"
type="number"
onChange={onChange}
disabled={flipped}
/>
</div>
<div>
<label htmlFor="hours"> Hours </label>
<input
value={fliped ? amount : Math.round(minutes/60)}
className="hours"
placeholder="Hours"
type="number"
disabled={!flipped}
/>
</div>
<button onClick={reset}>Reset</button>
<button onClick={onFlip}>{fliped ? "Turn back" : "Invert"}</button>
</div>
);
}
function KmToMiles() {
const [units, setUints] = React.useState(0);
const [inverted2, setInverted2] = React.useState(false);
const onChange2 = (event) => {
setUints(event.target.value);
};
const reset2 = () => setUints("");
const onFlip2 = () => {
reset2();
setInverted2((A) => !A);
};
return (
<div>
<div>
<label htmlFor="Km">Km </label>
<input
value={inverted2 ? units*1.609344 : units}
id="km"
placeholder="0"
type="number"
onChange={onChange2}
disabled={inverted2 === true}
/>
</div>
<div>
<label htmlFor="miles">Miles </label>
<input
value={inverted2 ? units : units*0.609344}
id="miles"
placeholder="0"
type="number"
onChange={onChange2}
disabled={inverted2 === false}
/>
</div>
<button onClick={reset2}>Reset</button>
<button onClick={onFlip2}>{inverted2 ? "Turn back" : "Invert"}</button>
</div>
);
};
function App() {
const [index, setIndex] = React.useState("xx");
const onSelect = (event) => {
setIndex(event.target.value);
}
return(
<div>
<h1>Super Converter</h1>
<select value={index} onChange={onSelect}>
<option value="xx">Select your units</option>
<option value="0">Minutes & Hours</option>
<option value="1">Km & Miles</option>
</select>
<hr/>
{index === "xx" ? "Please select your units" : null}
{index === "0" ? <MinutesToHours /> : null}
{index === "1" ? <KmToMiles /> : null}
</div>
);
};
select
와 option
사용해 2개의 메뉴로 분리)