GiantStepDEV
article thumbnail

  • ๋ฆฌ์•กํŠธ์—์„œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์€ HTML๊ณผ '๋น„์Šท'ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” JSX ์š”์†Œ์˜ props๋กœ ์ „๋‹ฌ๋˜๋ฉฐ, ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ ๋ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ์ •์˜
    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ์— ์—ฐ๊ฒฐ
    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์—์„œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
import React, {useState} from "react";

const EventHandler = () => {
  const [message,setMessage] = useState("์•ˆ๋…•ํ•˜์„ธ์š”."); // ๊ฐ’์ด ์•„๋‹Œ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒํƒœ๊ฐ€ ๋ณ€ํ–ˆ๋Š”์ง€ ํŒ๋‹จํ•จ.
  const changeMessage= (e) => {
    setMessage(e.target.value);
  }
  return (
    <>
      <h1>์ด๋ฒคํŠธ ์—ฐ์Šต</h1>
      <input type="text" name="message" placeholder="์ž์œ ๋กญ๊ฒŒ ์ž…๋ ฅํ•˜์„ธ์š”." onChange={changeMessage}/>
      <h2>์ž…๋ ฅ ๋ฐ›์€ ๋ฉ”์‹œ์ง€ : {message}</h2>
    </>
  );
}

export default EventHandler;

โ›”๏ธ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜์‚ฌํ•ญ

  1. ์ด๋ฒคํŠธ ์ด๋ฆ„์€ Camel ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ž‘์„ฑ ํ•ฉ๋‹ˆ๋‹ค.
    ๐Ÿ‘‰ ์˜ˆ) HTML์˜ onclick์€ ๋ฆฌ์•กํŠธ์—์„œ๋Š” onClick์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด๋ฒคํŠธ์— ์‹คํ–‰ํ•  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•จ์ˆ˜ ํ˜•ํƒœ์˜ ๊ฐ’์„ ์ „๋‹ฌ ํ•ฉ๋‹ˆ๋‹ค.
    ๐Ÿ‘‰ HTML์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” ํฐ๋”ฐ์˜ดํ‘œ ์•ˆ์— ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ๋„ฃ์—‡์ง€๋งŒ.. ๋ฆฌ์•กํŠธ์—์„œ๋Š” ํ•จ์ˆ˜ ํ˜•ํƒœ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ „๋‹ฌ ํ•ฉ๋‹ˆ๋‹ค.
    ๐Ÿ‘‰ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฌธ๋ฒ•์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋„ ๋˜๊ณ , ๋ Œ๋”๋ง ์™ธ๋ถ€์— ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ „๋‹ฌํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.
  3. DOM ์š”์†Œ์—๋งŒ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๐Ÿ‘‰ div, button, input, form, span ๋“ฑ์˜ DOM ์š”์†Œ์—๋Š” ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ์—๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  4. ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ช…๋งŒ ์„ ์–ธํ•ด์ค๋‹ˆ๋‹ค.

์˜ˆ์‹œ.  HTML

<button onclick="activateLasers()">
  Activate Lasers
</button>f

์˜ˆ์‹œ. React

<button onClick={activateLasers}>
  Activate Lasers
</button>

OnChange

import React, {useState} from "react";

const EventHandler = () => {
  const [userName, setUserName] = useState("");
  const [message, setMessage] = useState("");
  const onChangeUserName = e => setUserName(e.target.value);
  const onChangeMessage = e => setMessage(e.target.value);
  const onClick = () => {
    alert(userName + " : " + message);
    // input ์ฐฝ์„ ์ง€์šฐ๊ธฐ ์œ„ํ•ด ๋นˆ ๊ฐ’ ์ง€์ •.. -> ๋น„์›Œ์ง„ ํ›„ ๋ Œ๋”๋ง
    setUserName("");
    setMessage("");
  }
  
  const onKeyPress = e => {
    if(e.key === "Enter") onClick();
  }

  return (
    <>
      <h1>์ด๋ฒคํŠธ ์—ฐ์Šต</h1>
      <input type="text" name="userName" placeholder="์‚ฌ์šฉ์ž ์ด๋ฆ„" value={userName} 
       onChange={onChangeUserName}/>
      <input type="text" name="message" placeholder="๋ฉ”์‹œ์ง€ ๋‚ด์šฉ" value={message} 
       onChange={onChangeMessage} onKeyDown={onKeyPress}/>
      <button onClick={onClick}>ํ™•์ธ</button>
    </>
  );
}

export default EventHandler;

SelectBox

import React, {useState} from "react";

// Select ์ฝค๋ณด ๋ฐ•์Šค ์‚ฌ์šฉํ•˜๊ธฐ
const FruitSelect = () => {
  const [value, setValue] = useState("๐Ÿ‡");
  
  const handleChange = e => setValue(e.target.value);
  const handleSubmit = e => {
    alert("์„ ํƒํ•œ ๊ณผ์ผ : " + value);
    e.preventDefault(); // โœจ ์ฐฝ์ด ์ƒˆ๋กœ๊ณ ์นจ ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์Œ.
  }

  return (
    <form onSubmit={handleSubmit}>
      <label>
        ๊ณผ์ผ์„ ์„ ํƒํ•˜์„ธ์š”.๐Ÿฉท <br />
        <select value={value} onChange={handleChange}>
          <option value="apple">๐ŸŽ</option>
          <option value="orange">๐ŸŠ</option>
          <option value="banana">๐ŸŒ</option>
          <option value="kiwi">๐Ÿฅ</option>
          <option value="blueberry">๐Ÿซ</option>
          <option value="grape">๐Ÿ‡</option>
        </select>
      </label>
      <button type="submit">์ œ์ถœ</button>
    </form>
  );
}

export default FruitSelect;

RadioBox

import React, {useState} from "react";

const RadioButton = () => {
  const [value, setValue] = useState("");

  const handleChange = e => setValue(e.target.value);

  return (
    <div>
      <input type="radio" name="fruits" value="๐ŸŽ" onChange={handleChange} />
      <label>๐ŸŽ</label>
      <br />
      <input type="radio" name="fruits" value="๐ŸŠ" onChange={handleChange} />
      <label>๐ŸŠ</label>
      <br />
      <input type="radio" name="fruits" value="๐ŸŒ" onChange={handleChange} />
      <label>๐ŸŒ</label>
      <br />
      <input type="radio" name="fruits" value="๐Ÿฅ" onChange={handleChange} />
      <label>๐Ÿฅ</label>
      <br />
      <p>์„ ํƒํ•œ ๊ณผ์ผ์€ [{value}] ์ž…๋‹ˆ๋‹ค.</p>
    </div>
  );
}

export default RadioButton;


Table(ํ‘œ) - ๊ธฐ๋ณธ

import React from "react";
import './App.css';

// โœจ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ map์œผ๋กœ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ณ , ํ‘œ์‹œ๋œ ํ™”๋ฉด ์˜์—ญ์— ์ด๋ฒคํŠธ ์—ฐ๊ฒฐํ•˜๊ธฐ
const TableMap = () => {
  const data = [
    {id: 100, name: "Elon", age: 38},
    {id: 200, name: "Skat", age: 25},
    {id: 300, name: "Braven", age: 15}
  ];
  const tableClickEvent = (item) => {
    console.log(item); // ๋ˆŒ๋ €์„ ๋•Œ ํŠน์ • ํŽ˜์ด์ง€(๋ฉ”๋‰ด)๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•์€ '๋ผ์šฐํ„ฐ' ํ•  ๋•Œ ๋ฐฐ์šธ ์˜ˆ์ •
  }
  return (
    <table>
      <thead>
        <tr>
          <th>ID</th>
          <th>์ด๋ฆ„</th>
          <th>๋‚˜์ด</th>
        </tr>
      </thead>
      <tbody>
        {
          data.map(item => (
            // โœจ map์€ key๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ถ€๋ฅผ ๋Œ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์œ ์ผํ•œ id๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ํ•จ.
            <tr key={item.id} onClick={()=>tableClickEvent(item)}>
              <td>{item.id}</td>
              <td>{item.name}</td>
              <td>{item.age}</td>
            </tr>
          ))
        }
      </tbody>
    </table>
  );
}

export default TableMap;

Table(ํ‘œ) - ์‹ค์ œ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋Š” ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ

import { useState, useEffect} from "react";
import "./App.css";

// ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ map์œผ๋กœ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ณ , ํ‘œ์‹œ๋œ ํ™”๋ฉด ์˜์—ญ์— ์ด๋ฒคํŠธ ์—ฐ๊ฒฐํ•˜๊ธฐ
const TableMap = () => {
    const data = [
        {id : 100, name : "์นด์ฆˆํ•˜", age : 21},
        {id : 200, name : "์œ ๋‚˜", age : 21},
        {id : 300, name : "์•ˆ์œ ์ง„", age : 21}
    ];
    const [mapData, setMapData] = useState("");
    
    useEffect(() => {    
        setMapData(data);
    },[]);

    const tableClickEvent = (item) => {
        console.log(item);
    }

    return(
        <table>
            <thead>
                <tr>
                    <th>ID</th>
                    <th>์ด๋ฆ„</th>
                    <th>๋‚˜์ด</th>
                </tr>
            </thead>
            <tbody>
                {mapData && mapData.map(item => (
                    <tr key={item.id} onClick={()=>tableClickEvent(item)}>
                        <td>{item.id}</td>
                        <td>{item.name}</td>
                        <td>{item.age}</td>
                    </tr>
                ))}
            </tbody>
        </table>
    );
}
export default TableMap;
profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!