๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

React

์‚ญ์ œ/์ถ”๊ฐ€/์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ

import React from 'react';
import './App.css'; // ๐Ÿ”ฅ ๋ฐ˜๋“œ์‹œ App.css ํŒŒ์ผ์„ import ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//  User ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ตฌํ˜„
function User(props) {
  return (
    <div>{props.user.age}์‚ด - {props.user.name}</div>
  );
}

const App = () => {
  const users = [
    { id: 1, age: 30, name: '์†ก์ค‘๊ธฐ' },
    { id: 2, age: 24, name: '์†ก๊ฐ•' },
    { id: 3, age: 21, name: '๊น€์œ ์ •' },
    { id: 4, age: 29, name: '๊ตฌ๊ตํ™˜' },
  ];
  return (
    <div className="app-container">
      {users.map((user) => {
        return <User user={user} key={user.id} />;
      })}
    </div>
  );
};

export default App;

โœ… JSํŒŒ์ผ์—์„œ CSS๋ฅผ ๋ณ„๋„์˜ ๋ชจ๋“ˆ(ํŒŒ์ผ)๋กœ ๋ถ„๋ฆฌ

โœ…className ์„ ๋„ฃ์–ด์ฃผ๊ณ  ์ปดํฌ๋„ŒํŠธ์—์„œ ์ ์šฉํ•  CSS ํŒŒ์ผ์„ import 

โœ…์ถ”๊ฐ€/์‚ญ์ œ๋ฅผ ์œ„ํ•œ ์ค€๋น„

import React from 'react';
import './App.css'; // ๐Ÿ”ฅ ๋ฐ˜๋“œ์‹œ App.css ํŒŒ์ผ์„ import ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//  User ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ตฌํ˜„
function User(props) {
  return (
    <div>{props.user.age}์‚ด - {props.user.name}</div>
  );
}

const App = () => {
  const [users, setUsers] = useState([
    { id: 1, age: 30, name: '์†ก์ค‘๊ธฐ' },
    { id: 2, age: 24, name: '์†ก๊ฐ•' },
    { id: 3, age: 21, name: '๊น€์œ ์ •' },
    { id: 4, age: 29, name: '๊ตฌ๊ตํ™˜' },
  ]);
  const [name, setName] = useState(''); // <-- ์œ ์ €์˜ ์ž…๋ ฅ๊ฐ’์„ ๋‹ด์„ ์ƒํƒœ
	const [age, setAge] = useState('');

  return (
    <div className="app-container">
      <input value={name}
        placeholder="์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
			// ์ธํ’‹ ์ด๋ฒคํŠธ๋กœ ๋“ค์–ด์˜จ ์ž…๋ ฅ ๊ฐ’์„ name์˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ
        onChange={(e) => setName(e.target.value)} 
      />
			<input value={age}
        placeholder="๋‚˜์ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
			// ์ธํ’‹ ์ด๋ฒคํŠธ๋กœ ๋“ค์–ด์˜จ ์ž…๋ ฅ ๊ฐ’์„ age์˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ
        onChange={(e) => setName(e.target.value)} 
      />
      {users.map((user) => {
        return <User user={user} key={user.id} />;
      })}
    </div>
  );
};

export default App;

โœ… user ์ถ”๊ฐ€

import React from 'react';
import './App.css'; // ๐Ÿ”ฅ ๋ฐ˜๋“œ์‹œ App.css ํŒŒ์ผ์„ import ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//  User ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ตฌํ˜„
function User(props) {
  return (
    <div className="user-card">
      <div>{props.user.age}์‚ด - </div>
      <div>{props.user.name}</div>
    </div>
  );
}

const App = () => {
  const [users, setUsers] = useState([
    { id: 1, age: 30, name: '์†ก์ค‘๊ธฐ' },
    { id: 2, age: 24, name: '์†ก๊ฐ•' },
    { id: 3, age: 21, name: '๊น€์œ ์ •' },
    { id: 4, age: 29, name: '๊ตฌ๊ตํ™˜' },
  ]);
  const [name, setName] = useState(''); // <-- ์œ ์ €์˜ ์ž…๋ ฅ๊ฐ’์„ ๋‹ด์„ ์ƒํƒœ
  const addUserHandler = () => {
    const newUser = {
      id: users.length + 1,
      age: age,
      name: name,
    };

    setUsers([...users, newUser]);
  };
  return (
    <div className="app-container">
      <input
        value={name}
			// ์ธํ’‹ ์ด๋ฒคํŠธ๋กœ ๋“ค์–ด์˜จ ์ž…๋ ฅ ๊ฐ’์„ name์˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ
        onChange={(e) => setName(e.target.value)} 
      />
      {users.map((user) => {
        return <User user={user} key={user.id} />;
      })}
      <button onClick={addUserHandler}>์ถ”๊ฐ€ํ•˜๊ธฐ</button>
    </div>
  );
};

export default App;

โœ… user ์‚ญ์ œ

import React from 'react';
import './App.css'; // ๐Ÿ”ฅ ๋ฐ˜๋“œ์‹œ App.css ํŒŒ์ผ์„ import ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//  User ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ตฌํ˜„
function User(props) {
  return (
    <div className="user-card">
      <div>{props.user.age}์‚ด - </div>
      <div>{props.user.name}</div>
      <button onClick={() => props.handleDelete(props.user.id)}>
        ์‚ญ์ œํ•˜๊ธฐ
      </button>
    </div>
  );
}

const App = () => {
  const [users, setUsers] = useState([
    { id: 1, age: 30, name: '์†ก์ค‘๊ธฐ' },
    { id: 2, age: 24, name: '์†ก๊ฐ•' },
    { id: 3, age: 21, name: '๊น€์œ ์ •' },
    { id: 4, age: 29, name: '๊ตฌ๊ตํ™˜' },
  ]);
  const [name, setName] = useState(''); // <-- ์œ ์ €์˜ ์ž…๋ ฅ๊ฐ’์„ ๋‹ด์„ ์ƒํƒœ
  const addUserHandler = () => {
    const newUser = {
      id: users.length + 1,
      age: 30,
      name: name,
    };

    setUsers([...users, newUser]);
  };
	const deleteUserHandler = (id) => {
    const newUserList = users.filter((user) => user.id !== id);
    setUsers(newUserList);
  };
  return (
    <div className="app-container">
      <input
        placeholder="์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
        value={name}
			// ์ธํ’‹ ์ด๋ฒคํŠธ๋กœ ๋“ค์–ด์˜จ ์ž…๋ ฅ ๊ฐ’์„ name์˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ
        onChange={(e) => setName(e.target.value)} 
      />
      {users.map((user) => {
        return <User user={user} key={user.id} handleDelete={deleteUserHandler}/>;
      })}
      <button onClick={addUserHandler}>์ถ”๊ฐ€ํ•˜๊ธฐ</button>
    </div>
  );
};

export default App;

โœ… ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ

import React from 'react';
import './App.css'; // ๐Ÿ”ฅ ๋ฐ˜๋“œ์‹œ App.css ํŒŒ์ผ์„ import ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//1. ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
function CustomButton(props) {
  return <button onClick={props.onClick}>{props.children}</button>;
}


//  User ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ตฌํ˜„
function User(props) {
  return (
    <div className="user-card">
      <div>{props.user.age}์‚ด - </div>
      <div>{props.user.name}</div>
			//2. ๋ฒ„ํŠผ์„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ”๊พธ๊ธฐ
      <CustomButton onClick={() => props.handleDelete(props.user.id)}>
        ์‚ญ์ œํ•˜๊ธฐ
      </CustomButton>
    </div>
  );
}

const App = () => {
  const [users, setUsers] = useState([
    { id: 1, age: 30, name: '์†ก์ค‘๊ธฐ' },
    { id: 2, age: 24, name: '์†ก๊ฐ•' },
    { id: 3, age: 21, name: '๊น€์œ ์ •' },
    { id: 4, age: 29, name: '๊ตฌ๊ตํ™˜' },
  ]);
  const [name, setName] = useState(''); // <-- ์œ ์ €์˜ ์ž…๋ ฅ๊ฐ’์„ ๋‹ด์„ ์ƒํƒœ
  const addUserHandler = () => {
    const newUser = {
      id: users.length + 1,
      age: 30,
      name: name,
    };

    setUsers([...users, newUser]);
  };
	const deleteUserHandler = (id) => {
    const newUserList = users.filter((user) => user.id !== id);
    setUsers(newUserList);
  };
  return (
    <div className="app-container">
      <input
        placeholder="์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
        value={name}
			// ์ธํ’‹ ์ด๋ฒคํŠธ๋กœ ๋“ค์–ด์˜จ ์ž…๋ ฅ ๊ฐ’์„ name์˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ
        onChange={(e) => setName(e.target.value)} 
      />
      {users.map((user) => {
        return <User user={user} key={user.id} handleDelete={deleteUserHandler}/>;
      })}
			//3. ๋ฒ„ํŠผ์„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ”๊พธ๊ธฐ
      <CustomButton onClick={addUserHandler}>์ถ”๊ฐ€ํ•˜๊ธฐ</CustomButton>
    </div>
  );
};

export default App;

<div style={style}>
      {users.map((user) => {
        return <User user={user} key={user.id} />;
      })}
    </div>

โœ