Project/Toy-project

์‹œ๊ฐ„ ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ (1) Enterํ‚ค๋กœ ์‹œ๊ฐ„ ๋”ํ•˜๊ธฐ + 'onKeyPress' is deprecated.

Dong _ hwa 2023. 10. 2. 23:18

๊ทผ๋ฌด์‹œ๊ฐ„ ๊ณ„์‚ฐํ•  ๋•Œ ๊ณ„์‚ฐ์ด ์ž˜ ๋งž๋‚˜.. ํ™•์ธํ•  ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„ ๊ณ„์‚ฐ์„ ํ•˜๋Š” ์‚ฌ์ดํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ

๊ทธ๊ฒŒ ๋‚ด๊ฐ€ ๋”ฑ ํ•„์š”ํ•œ! ๊ธฐ๋Šฅ๋งŒ ์žˆ์ง€๊ฐ€ ์•Š์•„์„œ ๋ถˆํŽธํ•œ ์ ์ด ์žˆ์–ด ๊ทธ๋ƒฅ ์ด์ •๋„๋Š” ๋งŒ๋“ค์–ด์„œ ์จ๋ณด์ง€ ๋ญ.. ํ•˜๊ณ  ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

  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 ํ•จ์ˆ˜์— ํ•ด๋‹น ํฌ๋งท์„ ๊ฐ์‹ธ์ค€๋‹ค.