๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/React

์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

Daehyunii 2022. 12. 22. 03:26
๋ฆฌ์•กํŠธ์˜ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ

  ๋ฆฌ์•กํŠธ์˜ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์€ ์›น ๋ธŒ๋ผ์šฐ์ €์˜ HTML ์ด๋ฒคํŠธ์™€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋ฒ•์ด ๊ฝค ๋น„์Šทํ•˜๋‹ค. ๋‹ค๋งŒ ์ฃผ์˜ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๋ช‡ ๊ฐ€์ง€ ์กด์žฌ ํ•œ๋‹ค.

  • ์ด๋ฒคํŠธ ์ด๋ฆ„์€ ์นด๋ฉœ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด HTML์˜ onclick์€ ๋ฆฌ์•กํŠธ์—์„œ๋Š” onClick์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด๋ฒคํŠธ์— ์‹คํ–‰ํ•  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•จ์ˆ˜ ํ˜•ํƒœ์˜ ๊ฐ์ฒด ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
  • DOM ์š”์†Œ์—๋งŒ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ง์ ‘ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ด๋ฒคํŠธ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— onClick ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๊ทธ๋ƒฅ ์ด๋ฆ„์ด onClick์ธ props๋ฅผ ์ „๋‹ฌํ•ด ์ค„ ๋ฟ์ด๋‹ค.
input ์—ฌ๋Ÿฌ ๊ฐœ ๋‹ค๋ฃจ๊ธฐ

  setState๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์–ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” input์— ๋“ค์–ด์˜จ ๊ฐ’๋“ค์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. input์ฐฝ์ด ๋ช‡ ๊ฐ€์ง€ ์—†๋‹ค๋ฉด ๊ฐ input์— ๋“ค์–ด์˜จ ๊ฐ’๋“ค์€ useState ํ•˜๋‚˜์”ฉ ๊ด€๋ฆฌํ•ด๋„ ๋˜๊ฒ ์ง€๋งŒ input์ฐฝ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ์•„๋ฌด๋ž˜๋„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•˜๋Š” ํŽธ์ด ๊ฐ€๋…์„ฑ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๊ฐ’์„ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ๋ฐ”๋กœ event.target.name์ด๋‹ค. event.target.name์€ ํ•ด๋‹น ์ธํ’‹์˜ name์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 

 

์ฝ”๋“œ๋กœ ํ™•์ธํ•ด ๋ณด์ž

import { useState } from "react";

const Practice = () => {
  const [form, setForm] = useState({
    username: "",
    message: "",
  });

  const { username, message } = form;

  const handleChange = (event) => {
    const nextForm = {
      ...form,
      [event.target.name]: event.target.value,
    };
    setForm(nextForm);
  };

  return (
    <div>
      <div>{username}</div>
      <div>{message}</div>
      <input name="username" onChange={handleChange} />
      <input name="message" onChange={handleChange} />
    </div>
  );
};

export default Practice;

  ์œ„์˜ ์˜ˆ์‹œ๋Š” ๋‚ด๊ฐ€ ๊ธ‰ํ•˜๊ฒŒ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์‹œ์— ์ ํ•ฉํ•œ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, handleChange ํ•จ์ˆ˜๋ถ€๋ถ„์„ ์ž˜ ์‚ดํŽด ๋ณด๋ฉด ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์—ฌ๋Ÿฌ input์ฐฝ์ด ์กด์žฌํ•จ์—๋„ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ํ•˜๋‚˜์˜ state๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ต‰์žฅํžˆ ๊ฐ„๊ฒฐํ•ด ์ง€๋Š” ์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.