์ ์์๋ฅผ ๊ตฌํํด๋ณผ๊ฒ์! โจ
์ฐ์ , ์ ์ฒด ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฐ์์ ์ค๋ช ์ ๋ง๋ถ์ด๋ ์์ผ๋ก ํ๊ฒ ์ต๋๋ค!!
00. ์ ์ฒด ์ฝ๋
๋ช๋ช ์ปดํฌ๋ํธ๋ material design์ ๋ฐํ์ผ๋ก ๊ตฌํํ๋ค๋ ์ ์ ์ํด ์ฃผ์ธ์!
MainPage.js
import * as React from "react";
import { Grid, Button, Card, IconButton, Stack } from "@mui/material";
import ClearIcon from "@mui/icons-material/Clear";
export default function MainPage() {
// ๋ฐฐ์ด
const [data, setData] = React.useState([]);
/** ๊ฐ item update */
function onChangeInput(event, index) {
const target = event.target;
let input = [...data]; // ํ์ฌ data๋ฐฐ์ด ๊ทธ๋๋ก ๋ณต์ฌํ๊ธฐ
let result; // ๊ฒฐ๊ณผ๊ฐ
if (target.id === "name") {
result = input.map((item, idx) =>
idx === index ? { ...item, name: target.value } : { ...item }
);
} else if (target.id === "age") {
result = input.map((item, idx) =>
idx === index ? { ...item, age: target.value } : { ...item }
);
}
setData(result); // ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๊ฐฑ์
}
/** item ์ถ๊ฐ */
function addItem() {
let tmp = [...data]; // ํ์ฌ data๋ฐฐ์ด ๊ทธ๋๋ก ๋ณต์ฌํ๊ธฐ
/** ๋งจ ๋ค์ ์ถ๊ฐ */
tmp.push({
name: "",
age: ""
});
setData(tmp); // ์ถ๊ฐ๋ ๋ฐฐ์ด๋ก ๊ฐฑ์
}
/** item ์ญ์ */
function removeItem(index) {
let tmp = [...data]; // ํ์ฌ data๋ฐฐ์ด ๊ทธ๋๋ก ๋ณต์ฌํ๊ธฐ
tmp.splice(index, 1); // ํด๋นํ๋ index ์์ ์ญ์
setData(tmp); // ์ญ์ ๋ ๋ฐฐ์ด๋ก ๊ฐฑ์
}
return (
<div className="App">
<Grid container>
<Stack sx={{ gap: "1.6rem" }}>
{data.map((item, index) => (
<Card key={index}>
<Grid container sx={{ alignContent: "flex-start" }}>
<Grid item xs>
<Grid container sx={{ alignItems: "center", gap: "1.6rem" }}>
<Grid item>
<h6>์ด๋ฆ</h6>
</Grid>
<Grid item>
<input
id="name"
value={item.name}
onChange={(e) => onChangeInput(e, index)}
/>
</Grid>
</Grid>
<Grid container sx={{ alignItems: "center", gap: "1.6rem" }}>
<Grid item>
<h6>๋์ด</h6>
</Grid>
<Grid item>
<input
id="age"
value={item.age}
onChange={(e) => onChangeInput(e, index)}
/>
</Grid>
</Grid>
</Grid>
<Grid item>
<IconButton
aria-label="delete"
onClick={(e) => removeItem(index)}
>
<ClearIcon />
</IconButton>
</Grid>
</Grid>
</Card>
))}
<Grid container>
<Button onClick={addItem} variant="contained">
์ถ๊ฐ
</Button>
</Grid>
</Stack>
</Grid>
</div>
);
}
01. ์์๊ฐ ๊ฐ์ฒด์ธ ๋ฐฐ์ด
์๋์ ๊ฐ์ ๋ฐฐ์ด๊ณผ
// ๋ฐฐ์ด
const [data, setData] = React.useState([]);
๋ฐฐ์ด์๋, ์๋์ ๊ฐ์ด name, age๊ฐ key์ธ ๊ฐ์ฒด๋ฅผ ๋ฃ๋๋ค๊ณ ํ ๊ฒ์!
// ๊ฐ์ฒด(๋ฐฐ์ด์ ์์)
{
name: "",
age: ""
}
02. ์์ ์ถ๊ฐ
/** item ์ถ๊ฐ */
function addItem() {
let tmp = [...data]; // ํ์ฌ data๋ฐฐ์ด ๊ทธ๋๋ก ๋ณต์ฌํ๊ธฐ
/** ๋งจ ๋ค์ ์ถ๊ฐ */
tmp.push({
name: "",
age: ""
});
setData(tmp); // ์ถ๊ฐ๋ ๋ฐฐ์ด๋ก ๊ฐฑ์
}
return(
...
<Button onClick={addItem} variant="contained">
์ถ๊ฐ
</Button>
...
)
1. ์ ๊ฐ ์ฐ์ฐ์( ... ) ๋ก ํ์ฌ data๋ฐฐ์ด์ ๊ทธ๋๋ก ๋ณต์ฌํด ์จ ํ
2. ๋ณต์ฌํด์จ ๋ฐฐ์ด์ ๋งจ ๋ค์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํฉ๋๋ค.
3. ์ด๋ ๊ฒ ์์๊ฐ ์ถ๊ฐ๋ ๋ฐฐ์ด๋ก data๋ฐฐ์ด์ ๊ฐฑ์ ํด์ค๋๋ค.
03. ์์ ์ ๋ฐ์ดํธ
/** ๊ฐ item update */
function onChangeInput(event, index) {
const target = event.target;
let input = [...data]; // ํ์ฌ data๋ฐฐ์ด ๊ทธ๋๋ก ๋ณต์ฌํ๊ธฐ
let result; // ๊ฒฐ๊ณผ๊ฐ
if (target.id === "name") {
result = input.map((item, idx) =>
idx === index ? { ...item, name: target.value } : { ...item }
);
} else if (target.id === "age") {
result = input.map((item, idx) =>
idx === index ? { ...item, age: target.value } : { ...item }
);
}
setData(result); // ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๊ฐฑ์
}
...
return(
{data.map((item, index) => (
...
/** ์ด๋ฆ input */
<input
id="name"
value={item.name}
onChange={(e) => onChangeInput(e, index)}
/>
...
/** ๋์ด input */
<input
id="age"
value={item.age}
onChange={(e) => onChangeInput(e, index)}
/>
))}
)
์ฃผ์ํด์ฃผ์ค ์ !
1. map์ ํตํด data ๊ฐ๊ฐ์ ์์๋ค์ ์ ๊ทผํฉ๋๋ค. -> item์ { name: ์ด๋ฆ๊ฐ, age: ๋์ด๊ฐ } ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๊ฒ ์ฃ !
2. input์ id๋ฅผ ๋ถ์ฌํด์ค๋๋ค. -> name๊ณผ age ๊ฐ๊ฐ์ onChange ํจ์๋ฅผ ๋ง๋ค์ง ์์๋ ๋ฉ๋๋ค. (๊ฐ์ธ ์ทจํฅ ๐)
3. event.target์ ์ ํ์ฉํ์ฌ ๊ฐ index์ ๋ง๋ item์ name๊ณผ age์ ๊ฐ์ ์ ๋ ฅ๊ฐ๋๋ก ๊ฐฑ์ ํ๋ ํจ์ onChangeInput๋ฅผ ๊ตฌํํฉ๋๋ค!
event.target์ ์ฝ์๋ก ์ฐ์ ๊ฒฐ๊ณผ์ ๋๋ค. ๊ตฌํํ์ค ๋ ์ฐธ๊ณ ํด์ฃผ์ธ์!โบ๏ธโบ๏ธ
04. ์์ ์ญ์
/** item ์ญ์ */
function removeItem(index) {
let tmp = [...data]; // ํ์ฌ data๋ฐฐ์ด ๊ทธ๋๋ก ๋ณต์ฌํ๊ธฐ
tmp.splice(index, 1); // ํด๋นํ๋ index ์์ ์ญ์
setData(tmp); // ์ญ์ ๋ ๋ฐฐ์ด๋ก ๊ฐฑ์
}
return(
...
<IconButton
onClick={() => removeItem(index)}
>
...
)
1. ์ ๊ฐ ์ฐ์ฐ์( ... ) ๋ก ํ์ฌ data๋ฐฐ์ด์ ๊ทธ๋๋ก ๋ณต์ฌํด ์จ ํ
2. splice() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ์์๋ฅผ ์ญ์ ํฉ๋๋ค.
3. ์ด๋ ๊ฒ ์์๊ฐ ์ญ์ ๋ ๋ฐฐ์ด๋ก data๋ฐฐ์ด์ ๊ฐฑ์ ํด์ค๋๋ค.
โจโจโจ๐คฉ๐คฉ๐คฉ