๊ทผ๋ฌด์๊ฐ ๊ณ์ฐํ ๋ ๊ณ์ฐ์ด ์ ๋ง๋.. ํ์ธํ ๋๋ง๋ค ์๊ฐ ๊ณ์ฐ์ ํ๋ ์ฌ์ดํธ๋ฅผ ๊ฒ์ํ๋๋ฐ
๊ทธ๊ฒ ๋ด๊ฐ ๋ฑ ํ์ํ! ๊ธฐ๋ฅ๋ง ์์ง๊ฐ ์์์ ๋ถํธํ ์ ์ด ์์ด ๊ทธ๋ฅ ์ด์ ๋๋ ๋ง๋ค์ด์ ์จ๋ณด์ง ๋ญ.. ํ๊ณ ์์ํ๊ฒ ๋์๋ค.
const [state, setState] = useState<TimeCalculatorState>({
time1: "00:00",
time2: "00:00",
result: "",
});
const handleAdd = () => {
const t1 = state.time1.split(":");
const t2 = state.time2.split(":");
const hours = parseInt(t1[0]) + parseInt(t2[0]);
const minutes = parseInt(t1[1]) + parseInt(t2[1]);
const toHours = Math.floor(minutes / 60);
const adjustedHours = hours + toHours;
const adjustedMinutes = minutes % 60;
const result = `${adjustedHours
.toString()
.padStart(2, "0")}:${adjustedMinutes.toString().padStart(2, "0")}`;
setState({ ...state, result });
};
const handleClear = () => {
setState({
...state,
time1: "00:00",
time2: "00:00",
result: "",
});
};
์ด๊ธฐ ํจ์๋ ์ด๋ ๊ฒ ์ค์ ํ๋ค.
์ผ๋จ ์ด๊ธฐ ๊ฐ์ useState๋ก ์ค์ ํ๊ณ , ํ์ ๋ ๋ฐ๋ก ์ง์ ํด์คฌ๋ค. (์ด์ฐจํผ ์ ๋ถ string์ด๋ผ ์ฌ๊ธฐ ์ ์ง ์์)
๊ทธ๋ฆฌ๊ณ ๋ํ๋ ํจ์๋ก input์ ์ซ์๋ฅผ ๋ฐ์ผ๋ฉด : ๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ผ ์์ ์(hours), ๋ค๋ ๋ถ(minutes)์ผ๋ก ์ค์ ํ๋ค.
๋ถ์ ๋ํ์ ๋ 60์ผ๋ก ๋๋ ์ ๋ชซ์ด ์๊ธฐ๋ฉด ๊ทธ ๊ฐ์ toHours์ ๋ด์ hours์ ๊ฐ์ด ๋ํด์ฃผ์๋ค.
๊ทธ๋์ result์ ํด๋น ๊ฐ์ ๋ฃ์๋ค. ( padStart ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ก ์ถ๊ฐ๋ ๊ธฐ๋ฅ )
<div className="container">
<div className="calculator">
<input
type="text"
placeholder="00:00"
value={state.time1}
onChange={(e) => setState({ ...state, time1: e.target.value })}
/>
<input
type="text"
placeholder="00:00"
value={state.time2}
onChange={(e) => setState({ ...state, time2: e.target.value })}
/>
<button className="button" onClick={() => handleAdd()}>
+
</button>
<button className="button" onClick={handleClear}>
C
</button>
<input type="text" value={state.result} readOnly />
</div>
</div>
์ ํจ์๋ค์ ๊ฐ๊ฐ html ๋ถ๋ถ์ ์ถ๊ฐํด์ฃผ์๊ณ , ์๋๊ฐ ํด๋น ๊ฒฐ๊ณผ๊ฐ ๋๋ค.
์ด์ ์๊ฐ์ด ์ ๋ํด์ง๊ธด ํ๋๋ฐ, ์ข ๋ ์ฐ๊ธฐ ํธํ๊ฒ ํ๋์ฉ ์๋ด์ผ ํ๋ค.
์์ง์ ๋๋ฌ๋๋ฌ ์์ผ๋ก ์ผ์ผ์ด ์์ฑํด์ผ๋ง ํจ.... ๊ทธ๋ผ ๋ง๋๋ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์!
์ผ๋จ ์ํฐ๋ฅผ ์ณค์ ๋ ๊ฒฐ๊ณผ๊ฐ์ด ๋์์ผ๋ฉด ์ข๊ฒ ๋ค.
Enter ํค๋ก ๊ฒฐ๊ณผ ๊ณ์ฐํ๊ธฐ
const handleInputKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === "Enter") {
handleAdd();
}
};
์ผ๋จ Enterํค๋ฅผ ๋๋ฅด๋ฉด ๋ํด์ง๋ ํจ์๋ฅผ ์ถ๊ฐํ๋ค.
<input
type="text"
placeholder="00:00"
value={state.time1}
onChange={(e) => setState({ ...state, time1: e.target.value })}
onKeyPress={(e) => handleInputKeyPress(e)}
/>
<input
type="text"
placeholder="00:00"
value={state.time2}
onChange={(e) => setState({ ...state, time2: e.target.value })}
onKeyPress={(e) => handleInputKeyPress(e)}
/>
๊ทธ๋ฆฌ๊ณ onKeyPress ์ ํด๋น ํจ์๋ฅผ ์คํํ๊ฒ ํด๋์๋ค.
์ํฐํค๋ฅผ ๋๋ฅด๋ฉด handleAddํจ์๊ฐ ์๋ํ๋ค.
๊ทผ๋ฐ 'onKeyPress' is deprecated.' ํ๋ ์๋ฌ๊ฐ ๋ ์ ์์๋ณด๋, ๋ง๊ทธ๋๋ก deprecated ๋๋ค๋ ๋ง์ด์์๋ค.
https://developer.mozilla.org/en-US/docs/Web/API/Element/keypress_event
Element: keypress event - Web APIs | MDN
The keypress event is fired when a key that produces a character value is pressed down.
developer.mozilla.org
๊ทธ๋์ ์ฝ๋๋ฅผ onKeyDown์ผ๋ก ์์ ํด์ฃผ์๋ค.
์ซ์ ์ ๋ ฅ ์ ์๋์ผ๋ก : (์/๋ถ ๊ตฌ๋ถ) ํ์ํ๊ธฐ
input ์ฐฝ์ ์๊ฐ์ ์ ๋ ฅํ ๋, ์ง๊ธ ํ์ฌ๋ ":"๋ฅผ ์์์ ํ๊ธฐํด์ฃผ์ด์ผ ์๊ฐ์ผ๋ก ์ธ์ํ์ฌ ๊ณ์ฐํ๋ค.
์ด๊ฑฐ ๋๋ฌด๋๋ฌด ๋ถํธํ๋, ์ ๋ ฅํ ๋ ์๋์ผ๋ก : ์ถ๊ฐํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ค๋ค.
์ด๋๋ input์ ์ ๋ ฅ๋ ์ซ์๊ฐ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ํน์ ํจํด์ ๋ฐ๋ผ์ผํ๋ onChange๋ฅผ ์ด์ฉํ๋ค.,
const formatInput = (input: string) => {
if (input.length > 2) {
input = input.slice(0, 2) + ':' + input.slice(2);
}
return input;
};
input์ ๊ธธ์ด๊ฐ 2๊ฐ ๋์ด๊ฐ๋ ์๊ฐ, ์๋ผ์ :๋ฅผ ์ถ๊ฐํด์ค๋ค.
(๋์ค์ ๋ฌธ์ ์ ๋ ฅ์ ์ฒ๋ฆฌ๊ฐ ์๋๋ ๊ฒ ๊น์ง ์ถ๊ฐํด์คฌ๋ค)
onChange={(e) => setState({ ...state, time2: formatInput(e.target.value) })}
onChange ํจ์์ ํด๋น ํฌ๋งท์ ๊ฐ์ธ์ค๋ค.