๐Ÿ“Œ ๋ฐฐ์—ด ๋žœ๋”๋งํ•˜๊ธฐ

๐Ÿ“Œ useRef๋กœ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ

๐Ÿ“Œ ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ถ”๊ฐ€ํ•˜๊ธฐ

๐Ÿ“Œ ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ œ๊ฑฐํ•˜๊ธฐ

๐Ÿ“Œ ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ˆ˜์ •ํ•˜๊ธฐ

 

 

 


๐Ÿค” ๋ฐฐ์—ด ๋žœ๋”๋งํ•˜๊ธฐ.
๊ฐ€๋ น ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ, 
const users = [
  { id: 1,
    username: 'velopert',
    email: 'public.velopert@gmail.com' },
  { id: 2,
    username: 'tester',
    email: 'tester@example.com' },
  { id: 3,
    username: 'liz',
    email: 'liz@example.com' }
];

์ด ๋‚ด์šฉ์„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋žœ๋”๋ง ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค๋ฉด?
UserList.js

import React from 'react';

function User({ user }) {
  return (
    <div>
      <b>{user.username}</b> <span>({user.email})</span>
    </div>
  );
}

function UserList() {
  const users = [
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com'
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com'
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com'
    }
  ];

  return (
    <div>
      <User user={users[0]} />
      <User user={users[1]} />
      <User user={users[2]} />
    </div>
  );
}

export default UserList;





๐Ÿค” ๋งŒ์•ฝ, ๋™์ ์ธ ๋ฐฐ์—ด์„ ๋žœ๋”๋ง ํ•ด์•ผํ•œ๋‹ค๋ฉด? → map() ์„ ์‚ฌ์šฉ!!
map() ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์•ˆ์— ์žˆ๋Š” ๊ฐ ์›์†Œ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
react์—์„œ ๋™์ ์ธ ๋ฐฐ์—ด์„ ๋žœ๋”๋งํ•ด์•ผ ํ•  ๋•Œ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ react element๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋‹ค๋งŒ, react์—์„œ ๋ฐฐ์—ด์„ ๋žœ๋”๋งํ•  ๋•Œ๋Š” key๋ผ๋Š” props๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
UserList.js

import React from 'react';

function User({ user }) {
  return (
    <div>
      <b>{user.username}</b> <span>({user.email})</span>
    </div>
  );
}

function UserList() {
  const users = [
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com'
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com'
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com'
    }
  ];

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

export default UserList;


๋งŒ์•ฝ ๋ฐฐ์—ด ์•ˆ์˜ ์›์†Œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ณ ์œ ํ•œ ๊ฐ’์ด ์—†๋‹ค๋ฉด 
map() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•  ๋•Œ ์„ค์ •ํ•˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ index ๋ฅผ key ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Ex)

<div>
  {users.map((user, index) => (
    <User user={user} key={index} />
  ))}
</div>

 

 

 

 


cf. useRef (https://chan4im.tistory.com/190)

 

<frontend> {14} </React_part 1>

๐Ÿค” React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ...? JS๋ฅผ ์‚ฌ์šฉํ•ด HTML๋กœ ๊ตฌ์„ฑ๋œ UI๋ฅผ ์ œ์–ดํ–ˆ๋‹ค๋ฉด, DOM ๋ณ€ํ˜•์„ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๋”ฐ๋ฅธ๋‹ค. 1. Selector API๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • DOM์„ ์„ ํƒ 2. ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ ์‹œ, ๋ณ€ํ™”๋ฅผ ์ฃผ๋„๋ก ์„ค

chan4im.tistory.com

๐Ÿค” useRef๋กœ ์ปดํฌ๋„ŒํŠธ ์•ˆ์˜ ๋ณ€์ˆ˜ ๋งŒ๋“ค๊ธฐ
useRef์˜ Hook์€ 2๊ฐ€์ง€ ์šฉ๋„๊ฐ€ ์žˆ๋‹ค.
1. DOM ์„ ํƒ ์šฉ๋„
2. ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์กฐํšŒ ๋ฐ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์šฉ๋„

๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ณ€์ˆ˜
โˆ™ setTimeout, setInterval์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ id
โˆ™ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค
โˆ™ scroll ์œ„์น˜

Ex) UserList์—์„œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋ฐฐ์—ด์„ ์ง์ ‘์„ ์–ธํ•˜๋Š” ๋Œ€์‹ , App์—์„œ ๋ฐฐ์—ด์„ ์„ ์–ธ, UserList์—๊ฒŒ props๋กœ ์ „๋‹ฌํ•˜๋Š” ์˜ˆ์ œ
UserList.js

import React from 'react';

function User({ user }) {
  return (
    <div>
      <b>{user.username}</b> <span>({user.email})</span>
    </div>
  );
}

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

export default UserList;
App.js

import React, { useRef } from 'react';
import UserList from './UserList';

function App() {
  const users = [
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com'
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com'
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com'
    }
  ];

  const nextId = useRef(4);
  const onCreate = () => {
    // ๋‚˜์ค‘์— ๊ตฌํ˜„ ํ•  ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ์ง
    // ...

    nextId.current += 1;
  };
  return <UserList users={users} />;
}

export default App;

App ์—์„œ useRef() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ nextId ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ,

useRef() ๋ฅผ ์‚ฌ์šฉ ํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด, ์ด ๊ฐ’์ด .current ๊ฐ’์˜ ๊ธฐ๋ณธ๊ฐ’์ด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ๊ฐ’์„ ์ˆ˜์ • ํ• ๋•Œ์—๋Š” .current ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ณ  ์กฐํšŒ ํ•  ๋•Œ์—๋Š” .current ๋ฅผ ์กฐํšŒํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

 

 

 

 

 


๋จผ์ € input 2๊ฐœ์™€ button 1๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ CreateUser.js๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ src๋””๋ ‰ํ† ๋ฆฌ์— ์ถ”๊ฐ€

import React from 'react';

function CreateUser({ username, email, onChange, onCreate }) {
  return (
    <div>
      <input
        name="username"
        placeholder="๊ณ„์ •๋ช…"
        onChange={onChange}
        value={username}
      />
      <input
        name="email"
        placeholder="์ด๋ฉ”์ผ"
        onChange={onChange}
        value={email}
      />
      <button onClick={onCreate}>๋“ฑ๋ก</button>
    </div>
  );
}

export default CreateUser;
๐Ÿค” ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ถ”๊ฐ€ํ•˜๊ธฐ
์œ„์˜ CreateUser์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ 
๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ธ App์—์„œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์ง„ํ–‰, input๊ฐ’ ๋ฐ ์ด๋ฒคํŠธ ๋“ฑ๋ก ํ•จ์ˆ˜๋“ค์€ props๋กœ ๋„˜๊ฒจ๋ฐ›์•„ ์‚ฌ์šฉํ•ด๋ณด์ž.

์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ App์—์„œ UserList์œ„์— ๋žœ๋”๋ง ํ•ด๋ณด์ž.
App.js

import React, { useRef } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function App() {
  const users = [
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com'
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com'
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com'
    }
  ];

  const nextId = useRef(4);
  const onCreate = () => {
    // ๋‚˜์ค‘์— ๊ตฌํ˜„ ํ•  ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ์ง
    // ...

    nextId.current += 1;
  };
  return (
    <>
      <CreateUser />
      <UserList users={users} />
    </>
  );
}

export default App;

CreateUser ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ํ•„์š”ํ•œ props๋ฅผ App์—์„œ ์ค€๋น„,
๊ทธ ํ›„, users์—๋„ useState๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋กœ์„œ ๊ด€๋ฆฌ.
import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com'
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com'
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com'
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    // ๋‚˜์ค‘์— ๊ตฌํ˜„ ํ•  ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ์ง
    // ...

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} />
    </>
  );
}

export default App;


์ด์ œ ๋ฐฐ์—ด์— ๋ณ€ํ™”๋ฅผ ์ค˜์•ผํ•˜๋Š”๋ฐ, ์ด๋•Œ ๊ฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์ค˜์•ผ ํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์˜ push, splice, sort ๋“ฑ์˜ ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉX
if, ์‚ฌ์šฉํ•ด์•ผํ•  ๋•Œ, ๊ธฐ์กด ๋ฐฐ์—ด์„ ํ•œ๋ฒˆ ๋ณต์‚ฌํ•œ ํ›„ ์‚ฌ์šฉํ•ด์•ผํ•จ.

๐Ÿ“Œ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค๋ฉด์„œ ๋ฐฐ์—ด์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•
1. spread ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
2. concat ํ•จ์ˆ˜ ์‚ฌ์šฉ


- spread ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ(App.js)
import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com'
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com'
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com'
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers([...users, user]);

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} />
    </>
  );
}

export default App;

- concat ํ•จ์ˆ˜ ์‚ฌ์šฉ(App.js)
import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com'
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com'
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com'
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} />
    </>
  );
}

export default App;

 

 

 

 

 

 


์šฐ์„ , UserList์— ๊ฐ User ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋žœ๋”๋ง.

UserList.js

import React from 'react';

function User({ user, onRemove }) {
  return (
    <div>
      <b>{user.username}</b> <span>({user.email})</span>
      <button onClick={() => onRemove(user.id)}>์‚ญ์ œ</button>
    </div>
  );
}

function UserList({ users, onRemove }) {
  return (
    <div>
      {users.map(user => (
        <User user={user} key={user.id} onRemove={onRemove} />
      ))}
    </div>
  );
}

export default UserList;
๐Ÿค” ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ œ๊ฑฐํ•˜๊ธฐ
์ด๋•Œ, User ์ปดํฌ๋„ŒํŠธ์˜ ์‚ญ์ œ๋ฒ„ํŠผ์ด ํด๋ฆญ๋  ๋•Œ, user.id๊ฐ’์„ ์•ž์œผ๋กœ props๋กœ ๋ฐ›์•„์˜ฌ onRemove ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด ํ˜ธ์ถœํ•ด์•ผ
ํ•œ๋‹ค. (onRemoveํ•จ์ˆ˜๋Š” "id๊ฐ€ ~์ธ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๋ผ"๋Š” ์—ญํ• )
์ด๋•Œ, onRemoveํ•จ์ˆ˜๋Š” UserList์—์„œ๋„ ์ „๋‹ฌ๋ฐ›๊ณ , ์ด๋ฅผ ๊ทธ๋Œ€๋กœ User ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.


์ด์ œ onRemove๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.
๋ฐฐ์—ด์— ์žˆ๋Š” ํ•ญ๋ชฉ์ œ๊ฑฐ ์‹œ, ์ถ”๊ฐ€ํ•  ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ๊ฐ€๋ฉฐ ์—…๋ฐ์ดํŠธ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
์ด๋•Œ, filter๋ผ๋Š” ๋ฐฐ์—ด ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœ!!

App.js
import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com'
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com'
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com'
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };

  const onRemove = id => {
    // user.id ๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์›์†Œ๋งŒ ์ถ”์ถœํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ฌ
    // = user.id ๊ฐ€ id ์ธ ๊ฒƒ์„ ์ œ๊ฑฐํ•จ
    setUsers(users.filter(user => user.id !== id));
  };
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} />
    </>
  );
}

export default App;

 

 

 

 

 

 


๋จผ์ € App ์ปดํฌ๋„ŒํŠธ์˜ users ๋ฐฐ์—ด ์•ˆ์˜ ๊ฐ์ฒด ์•ˆ์— active๋ผ๋Š” ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ž.

 

App.js 

import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com',
      active: true
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com',
      active: false
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com',
      active: false
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };

  const onRemove = id => {
    // user.id ๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์›์†Œ๋งŒ ์ถ”์ถœํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ฌ
    // = user.id ๊ฐ€ id ์ธ ๊ฒƒ์„ ์ œ๊ฑฐํ•จ
    setUsers(users.filter(user => user.id !== id));
  };

  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} onToggle={onToggle} />
    </>
  );
}

export default App;โ€‹
๐Ÿค” ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ˆ˜์ •ํ•˜๊ธฐ
User ์ปดํฌ๋„ŒํŠธ์— ๊ณ„์ •๋ช… ํด๋ฆญ ์‹œ, ์ƒ‰์ƒ์ด ์ดˆ๋ก์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ๊ณ  ๋‹ค์‹œ ๋ˆ„๋ฅด๋ฉด ๊ฒ€์ •์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ๋„๋ก ํ•˜๋Š” ๊ตฌํ˜„

์ด์ œ, User ์ปดํฌ๋„ŒํŠธ์—์„œ active ๊ฐ’์— ๋”ฐ๋ผ ํฐํŠธ์ƒ‰์ด ๋ฐ”๋€Œ๋„๋ก ํ•ด๋ณด์ž.
cf. cursor ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ด ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ, ์†๊ฐ€๋ฝ ๋ชจ์–‘์œผ๋กœ ๋ฐ”๋€Œ๋„๋ก ํ•˜์ž.
UserList.js

import React from 'react';

function User({ user, onRemove }) {
  return (
    <div>
      <b
        style={{
          cursor: 'pointer',
          color: user.active ? 'green' : 'black'
        }}
      >
        {user.username}
      </b>

      <span>({user.email})</span>
      <button onClick={() => onRemove(user.id)}>์‚ญ์ œ</button>
    </div>
  );
}

function UserList({ users, onRemove }) {
  return (
    <div>
      {users.map(user => (
        <User user={user} key={user.id} onRemove={onRemove} />
      ))}
    </div>
  );
}

export default UserList;

 


์ด์ œ App.js ์—์„œ onToggle ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„, 
๋ฐฐ์—ด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ์—๋„ map ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

id ๊ฐ’์„ ๋น„๊ตํ•ด์„œ id ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ๊ฐ™๋‹ค๋ฉด active ๊ฐ’์„ ๋ฐ˜์ „์‹œํ‚ค๋„๋ก ๊ตฌํ˜„์„ ์ง„ํ–‰,

onToggle ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ UserList ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

App.js

import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com',
      active: true
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com',
      active: false
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com',
      active: false
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };

  const onRemove = id => {
    // user.id ๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์›์†Œ๋งŒ ์ถ”์ถœํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ฌ
    // = user.id ๊ฐ€ id ์ธ ๊ฒƒ์„ ์ œ๊ฑฐํ•จ
    setUsers(users.filter(user => user.id !== id));
  };
  const onToggle = id => {
    setUsers(
      users.map(user =>
        user.id === id ? { ...user, active: !user.active } : user
      )
    );
  };
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} onToggle={onToggle} />
    </>
  );
}

export default App;




๊ทธ ๋‹ค์Œ์—๋Š” UserList ์ปดํฌ๋„ŒํŠธ์—์„œ onToggle๋ฅผ ๋ฐ›์•„์™€์„œ User ์—๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๊ณ , onRemove ๋ฅผ ๊ตฌํ˜„ํ–ˆ์—ˆ๋˜๊ฒƒ์ฒ˜๋Ÿผ onToggle ์— id ๋ฅผ ๋„ฃ์–ด์„œ ํ˜ธ์ถœํ•˜์ž.
UserList.js

import React from 'react';

function User({ user, onRemove, onToggle }) {
  return (
    <div>
      <b
        style={{
          cursor: 'pointer',
          color: user.active ? 'green' : 'black'
        }}
        onClick={() => onToggle(user.id)}
      >
        {user.username}
      </b>
      &nbsp;
      <span>({user.email})</span>
      <button onClick={() => onRemove(user.id)}>์‚ญ์ œ</button>
    </div>
  );
}

function UserList({ users, onRemove, onToggle }) {
  return (
    <div>
      {users.map(user => (
        <User
          user={user}
          key={user.id}
          onRemove={onRemove}
          onToggle={onToggle}
        />
      ))}
    </div>
  );
}

export default UserList;

 

+ Recent posts