๋ฐฐ์ด์ ํญ๋ชฉ ์ถ๊ฐ
: ๋ฐฐ์ด์ ๋ณํ๋ฅผ ์ค ๋, ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถ๋ณ์ฑ์ ์ง์ผ์ฃผ์ด์ผ ํจ
โฃ ๊ธฐ์กด์ ๋ฐฐ์ด์ ํ ๋ฒ ๋ณต์ฌํ๊ณ ๋์ ์ฌ์ฉ
App์ปดํฌ๋ํธ์์ ์ํ๊ด๋ฆฌํ๊ณ , CreateUser์ปดํฌ๋ํธ์์๋ input๊ฐ ๋ฐ ์ด๋ฒคํธ๋ก ๋ฑ๋กํ ํจ์๋ค์ props๋ก ๋๊ฒจ๋ฐ์ ์ฌ์ฉํ๋ ์์
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;
1. spread ์ฐ์ฐ์ ์ฌ์ฉ
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); //useRef() ์ฌ์ฉํ ๋ ํ๋ผ๋ฏธํฐ ๋ฃ์ด์ฃผ๋ฉด, ์ด ๊ฐ์ด .current๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ด ๋จ
const onCreate = () => {
const user = {
id: nextId.current,
username,
email,
};
setUsers([...users, user]); //spread ์ฌ์ฉ
setInputs({
username: "",
email: "",
});
nextId.current += 1; //๊ฐ ์์ ์, .current ๊ฐ ์์ ํ๋ฉด ๋๊ณ , ์กฐํํ ๋๋ .current์กฐํํ๋ฉด ๋จ
};
return (
<>
<CreateUser
username={username}
email={email}
onChange={onChange}
onCreate={onCreate}
/>
<UserList users={users} />
</>
);
}
export default App;
2. concatํจ์ ์ฌ์ฉ
concatํจ์: ๊ธฐ์กด์ ๋ฐฐ์ด์ ์์ ํ์ง ์๊ณ , ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค์ด์ค
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); //useRef() ์ฌ์ฉํ ๋ ํ๋ผ๋ฏธํฐ ๋ฃ์ด์ฃผ๋ฉด, ์ด ๊ฐ์ด .current๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ด ๋จ
const onCreate = () => {
const user = {
id: nextId.current,
username,
email,
};
setUsers(users.concat(user)); //concatํจ์ ์ด์ฉ
setInputs({
username: "",
email: "",
});
nextId.current += 1; //๊ฐ ์์ ์, .current ๊ฐ ์์ ํ๋ฉด ๋๊ณ , ์กฐํํ ๋๋ .current์กฐํํ๋ฉด ๋จ
};
return (
<>
<CreateUser
username={username}
email={email}
onChange={onChange}
onCreate={onCreate}
/>
<UserList users={users} />
</>
);
}
export default App;
๋ฐฐ์ด์ ํญ๋ชฉ ์ ๊ฑฐ
import React from "react";
function User({ user, onRemove }) {
//์ญ์ ๋ฒํผ์ด ํด๋ฆญ๋ ๋ user.id๊ฐ์ props๋ก ๋ฐ์์ฌ onRemoveํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ด ํธ์ถ
//onRemove๋ id๊ฐ _์ธ ๊ฐ์ฒด ์ญ์
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;
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); //useRef() ์ฌ์ฉํ ๋ ํ๋ผ๋ฏธํฐ ๋ฃ์ด์ฃผ๋ฉด, ์ด ๊ฐ์ด .current๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ด ๋จ
const onCreate = () => {
const user = {
id: nextId.current,
username,
email,
};
setUsers(users.concat(user));
setInputs({
username: "",
email: "",
});
nextId.current += 1; //๊ฐ ์์ ์, .current ๊ฐ ์์ ํ๋ฉด ๋๊ณ , ์กฐํํ ๋๋ .current์กฐํํ๋ฉด ๋จ
};
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;
- ๋ถ๋ณ์ฑ์ ์งํค๋ฉด์ ํน์ ์์๋ฅผ ๋ฐฐ์ด์์ ์ ๊ฑฐํ๊ธฐ ์ํด filter ๋ฐฐ์ด ๋ด์ฅ ํจ์ ์ฌ์ฉ
- filter ํจ์๋ ๋ฐฐ์ด์์ ํน์ ์กฐ๊ฑด์ด ๋ง์กฑํ๋ ์์๋ค๋ง ์ถ์ถํ์ฌ ์๋ก์ด ๋ฐฐ์ด ๋ง๋ค์ด์ค
๋ฐฐ์ด ํญ๋ชฉ ์์
import React from "react";
function User({ user, onRemove, onToggle }) {
//cursor: ๋ง์ฐ์ค ์ฌ๋ ธ์ ๋ ์ปค์์ ๋ชจ์ ๋ณ๊ฒฝ
return (
<div>
<b
style={{ cursor: "pointer", color: user.active ? "green" : "black" }}
onClick={() => onToggle(user.id)}
>
{user.username}
</b>
<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;
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); //useRef() ์ฌ์ฉํ ๋ ํ๋ผ๋ฏธํฐ ๋ฃ์ด์ฃผ๋ฉด, ์ด ๊ฐ์ด .current๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ด ๋จ
const onCreate = () => {
const user = {
id: nextId.current,
username,
email,
};
setUsers(users.concat(user));
setInputs({
username: "",
email: "",
});
nextId.current += 1; //๊ฐ ์์ ์, .current ๊ฐ ์์ ํ๋ฉด ๋๊ณ , ์กฐํํ ๋๋ .current์กฐํํ๋ฉด ๋จ
};
const onRemove = (id) => {
//user.id๊ฐ ํ๋ผ๋ฏธํฐ๋ก ์ผ์นํ์ง ์๋ ์์๋ง ์ถ์ถํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ฆ
//=user.id๊ฐ id์ธ ๊ฒ์ ์ ๊ฑฐ
setUsers(users.filter((user) => user.id !== id));
};
const onToggle = (id) => {
setUsers(
users.map((user) => // ๋ฐฐ์ด์ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ฉฐ ๋ฐฐ์ด ์
๋ฐ์ดํธํ๊ธฐ ์ํด mapํจ์ ์ฌ์ฉ
user.id === id ? { ...user, active: !user.active } : user //id๊ฐ ๋น๊ตํ์ฌ ๊ฐ์ผ๋ฉด active ๊ฐ ๋ฐ์ , ์๋ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋๊ธฐ
)
);
};
return (
<>
<CreateUser
username={username}
email={email}
onChange={onChange}
onCreate={onCreate}
/>
<UserList users={users} onRemove={onRemove} onToggle={onToggle} />
</>
);
}
export default App;
'ํ๋ก ํธ์๋ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| useEffect์ useMemo (0) | 2022.11.23 |
|---|---|
| ์ปดํฌ๋ํธ ๋ ๋๋ง (0) | 2022.11.23 |
| โ ๋ฐฐ์ด ๋ด์ฅ ํจ์(์๋ฐ์คํฌ๋ฆฝํธ) (0) | 2022.11.17 |
| useRef (0) | 2022.11.16 |
| ๋ฆฌ์กํธ Hooks (0) | 2022.11.15 |