์ฝ๋์บ ํ
๋ฆฌ์คํธ์ Key
index์ key
1๏ธโฃ map
: ๋ฐฐ์ด์ ์์๋ฅผ ์ผ๊ด์ ์ผ๋ก ๋ณํ์ํฌ ๋ ์ฌ์ฉํ๊ธฐ ์ข๋ค.
const classmate = ["์ฒ ์","์ํฌ","ํ์ด"] classmate.map((item)=>(item+"์ด๋ฆฐ์ด")) => (3)["์ฒ ์์ด๋ฆฐ์ด","์ํฌ์ด๋ฆฐ์ด","ํ์ด์ด๋ฆฐ์ด"] ์ด๋ ๊ฒ ๋ฉ๋๋ค.
-> map์์์ ์ฌ์ฉ๋๋ item์ classmate์ ์์๋ค์ด ๋ค์ด๊ฐ ํ๋ผ๋ฏธํฐ(๋งค๊ฐ๋ณ์) ์ด๋ค.
const classmate = [{ name: "์ฒ ์" }, { name: "์ํฌ" }, { name: "ํ์ด" }]; //item.name => "์ฒ ์","์ํฌ","ํ์ด" //school ์์ฑ์ ์ผ๊ด์ ์ผ๋ก ์ถ๊ฐํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค. classmate.map((item) => ({ name: item.name + "์ด๋ฆฐ์ด", school: "๋ก์์ ์น์", })); // ๊ฒฐ๊ณผ=> (3) [ { name: "์ฒ ์์ด๋ฆฐ์ด", school: "๋ก์์ ์น์" }, { name: "์ํฌ์ด๋ฆฐ์ด", school: "๋ก์์ ์น์" }, { name: "ํ์ด์ด๋ฆฐ์ด", school: "๋ก์์ ์น์" }, ];
-> ๊ฐ์ฒด๊ฐ ์์์ธ ๋ฐฐ์ด์์๋ map์ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
โ ํ์ดํ ํจ์ () โ {} vs () โ ()
โ ์๊ดํธ ()๋ก ๊ฐ์ธ์ง ๋ถ๋ถ์ด return ๋จ
(return๋ฌธ์ ์์ฑํ์ง ์์๋ ๋ฆฌํด๋จ.)
๋ฐ๋ฉด ์ค๊ดํธ{}๋ก ๊ฐ์ธ์ง ํจ์๋ return๋ฌธ์ด ์๋ค๋ฉด ๋ฐํ๊ฐ์ด ์๋ค.โ ํ์ดํ ํจ์์์ ์๊ดํธ ์๋ต์ด ๊ฐ๋ฅํ ๊นโ
โ ์ํฉ์ ๋ฐ๋ผ ๊ฐ๋ฅํ๋ค
ํจ์์ ๋ฐ๋์์ ์ฝ๋๊ฐ ํ์ค์ด๋ผ๋ฉด ์๋ต์ด ๊ฐ๋ฅโ ๊ทธ๋ ๋ค๋ฉด ์ธ์ ์๋ต์ด ๋ถ๊ฐ๋ฅ ํ ๊น?
โ ๋ฐ๋์ ์ ํ๋ ์ฝ๋๊ฐ ํ์ค ์ด์์ด๊ฑฐ๋ ๋ฆฌํด๊ฐ์ด ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ์ ์๋ต์ด ๋ถ๊ฐ๋ฅ ํ๋ค
์ค๊ดํธ๊ฐ ์์ด์ง๋ฉด ๊ฐ์ฒด์ ์ค๊ดํธ๊ฐ ํจ์์ ์ค๊ดํธ๊ฐ ๋์ด๋ฒ๋ฆผ.
๋ฐ๋ผ์ ๋ฆฌํด๊ฐ์ด ๊ฐ์ฒด์ผ ๊ฒฝ์ฐ์ ์๋ตํ๋ฉด ์๋จ!
- HTML ๊ณผ ์ฐ๊ฒฐํ๊ธฐ
// RenderMap ์ปดํฌ๋ํธ const RenderMap = () => { const classmate = ["์ฒ ์", "์ํฌ", "ํ์ด"]; return ( //์ค๊ดํธ๋ฅผ ์ด์ฉํด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ปดํฌ๋ํธ์ return๊ฐ ์์ผ๋ก ๋ฐ๋ฆฌ๊ณ ๋ค์ด์จ ๊ฒ ์ ๋๋ค. //๋ฆฌํด๋์ด์ผ ํ ๊ฐ์ด ํ์ค์ด๊ธฐ๋๋ฌธ์ ๊ดํธ์๋ต์ด ๊ฐ๋ฅํฉ๋๋ค. <div> {classmate.map((item) => ( <div>{item}์ด๋ฆฐ์ด</div> ))} </div> ); }; export default RenderMap;
2๏ธโฃ filter
๋ฐฐ์ด์ ์์๋ฅผ ํํฐ๋ง ํด์ฃผ๋ ๋ฉ์๋
๊ฐ์ฒด ํน์ ๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ๊ฒ์ฌํ์ฌ ๊ทธ ์กฐ๊ฑด์ ๋ง๋ ์์๋ค๋ง ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋์ถํด์ค๋ค.โ ์ฌ์ฉ๋ฐฉ๋ฒ
const num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; num.filter((item) => item <= 8); => (8) [1, 2, 3, 4, 5, 6, 7, 8]
โ map๊ณผ filter์ ๊ฒฐ๊ณผ๋ฌผ ์ฐจ์ด์
โ map์ ๋ฐฐ์ด์ ๊ธธ์ด๋งํผ ๊ฐ์ด ๋์ค์ง๋ง, filter๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฐฐ์ด์ ๊ธธ์ด๋ณด๋ค ์ ๊ฒ ๋์ฌ ์ ์๋ค.
๊ธฐ์กด์ ๋ฐ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ ๋์์ ๊ฒฝ์ฐ ์ต์ ๋ฐ์ดํฐ๋ก ๋ค์ fetch ํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
๋ง์ฝ์ ๊ฒ์ํ์ ๋ฑ๋ก ๋ ๊ธ์ ์ญ์ ํ๋ค๊ณ ํ์ ๋ ์ญ์ ๊ฐ ์ ๋์๋ ์ง ํ์ธ์ ํด์ผ ํ๋ค.
์๋ก๊ณ ์นจ ์ ํจ์๊ฐ ์คํ๋๋ฉด์ ๋ค์ API๋ฅผ ์์ฒญํ๋๋ฐ
DB์์ ์ญ์ ๊ฐ ๋ ๊ฒ์๋ฌผ๋ง ๋นผ๊ณ ์คํ๋๋ค.
ํ์ง๋ง ๋งค๋ฒ ์๋ก๊ณ ์นจ ํด์ ํ ์ ์์.
๋ฐ๋ผ์ ์ญ์ ๊ฐ ๋๋๊ณ fetchboard๋ ๋ค์ ํ๋ฒ ์์ฒญ์ ํด์ผํ๋ค!
๋ฐฑ์๋์์ ๋ค์ ์ฌ์์ฒญํด์ผํจ!
์ด๊ฒ์ ๋ฆฌํจ์น๋ผ๊ณ ํ๋ค.//๊ฒ์ํ ์ญ์ ํ ๋ฆฌํ์น ์ค์ต import { useQuery, gql, useMutation } from "@apollo/client"; // import { Fragment } from "react/cjs/react.production.min"; const FETCH_BOARDS = gql` query { fetchBoards { number writer title contents } } `; //1. ์ญ์ ๋ฎคํ ์ด์ ๋ง๋ค๊ธฐ //2. ์ฟผ๋ฆฌ๋ฌธ(์ง์๋ฌธ) //3. deleteํจ์์์ ์คํ! const DELETE_BOARDS = gql` mutation deleteBoard(Number:Int){ deleteBoard(number: $number){ message } } `; export default function StaticRoutingPage() { const { data } = useQuery(FETCH_BOARDS); //api๋ชฉ๋ก์ ์กฐํํด์ ๋ฐ์์ค๊ณ ๋ฐ์ดํฐ์ ์ ์ฅ -> state๊ฐ ๋ฐ๋ ์ด ๋๋ฒ ๋ ๋๋ง console.log(data); //์ ๋ฌ๋์ง ์กฐํํ๊ธฐ const [deleteBoard] = useMutation(DELETE_BOARDS); //์ฟผ๋ฆฌ๋ฌธ์ ํ๋ ์ด๊ทธ๋ผ์ด๋์์ ๋ณด๊ณ ์์ฑํ๋ค! const onClickDelete = (event) => { //ํด๋ฆญํ์ ๋ ๋ฒํธ๋ฅผ ์ค ์ ์๋ ๋ฐฉ๋ฒ //๋ฒํผํ๋ํ๋๋ง๋ค ๊ณ ์ ์์ด๋๊ฐ ์์. 10๋ฒ๋ฒํผ์ ๋๋ฅด๋ฉด 10๋ฒํ๊ทธ๊ฐ event.target์ด ๋จ deleteBoard({ variables: { number: Number(event.target.id), }, //์ฌ๊ธฐ๊ฐ์ง ํ์ ๋ ํ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์. ์ญ์ ๋ฒํผ ๋๋ฅด๋ฉด ์ญ์ ๋์ง๋ง ์ฐ๋ฆฌ ๋์ ์๋ณด์ด๊ณ ์๋ก๊ณ ์นจํด์ผ ๋ณด์. refetchQueries: [{ query: FETCH_BOARDS }], //๋ค์ ์ฌ์์ฒญํด์ผํจ. }); }; return ( <> {data?.fetchBoards.map( ( el, index //์ต์ ๋์ฒด์ด๋! ) => ( <div key={el.number}> {/* index๋ ๊ฒ์๊ธ ์ญ์ ์ ๋ค์ ๊ฒ์๊ธ์ด ์๋ก ์ฌ๋ผ์ค๋ฉด์ ๊ธฐ์กด index์ ๋์ผํ ๊ฐ์ ๊ฐ๊ฒ ๋๋ฏ๋ก, ์ ์ผํ์ง ์์ ๊ฐ์ด๋๋ค. */} <span> <input type="checkbox" /> </span> <span style={{ margin: "10px" }}>{el.number}</span> <span style={{ margin: "10px" }}>{el.title}</span> <span style={{ margin: "10px" }}>{el.writer}</span> <span> <button id={el.number} onClick={onClickDelete}> ์ญ์ </button> </span> </div> //ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด fragement๋ก ๊ฐ์ ๊ฒ! <div>์ ๊ฒฝ์ฐ 1๊ฐ ๋ ๊ทธ๋ ค์ผ ๋์ ์กฐ๊ธ ๋๋ ค์ง // const qqq = {margin:10px} ๋งจ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๊ดํธ ์์๋ ๊ฐ์ฒด์ ์ค๊ดํธ์. ) )} </> //์์ ๋ฌถ์ ์ฉ๋ ๊ฐ์ ๋ด์ฉ์ ๋ด๋ณด๋ผ ๋ ๊ตณ์ด ๋ฐ์ค๋ก ๊ฐ์ธ์ง ์์๋ ๋ ๋ ์ฌ์ฉํ๋ fragment๋ผ๊ณ ํ๋ ๋นํ๊ทธ ); }
โ React์์ Key๊ฐ ํ์ํ ์ด์ โ
import { Test } from '../../src/test2'; export default function Test2() { const List = ['์ฌ๊ณผ', '๋ธ๊ธฐ', '๋ฐ๋๋']; return ( <> {List.map((data) => ( <Test>{data}</Test> ))} </> ); }
-> map ์ฌ์ฉ ์ key๊ฐ์ ๋ถ์ฌํ์ง ์์์ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
ํด๋น ๊ฒฝ๊ณ ๋ React๊ฐ ์ด๋ค ์์๋ฅผ ๋ณ๊ฒฝ, ์ถ๊ฐ, ์ญ์ ํ ์ง ์๋ณํ๊ธฐ ์ํจ์ด๋ค.
๋ฆฌ์กํธ ์ ์ฅ์์๋ ๋ญ์ง ์์์ผ ๋ค๋ฃฐ ์ ์๋๋ฐ
์ฐ๋ฆฌ๊ฐ ๋ฐ๋ก ์๋ ค์ฃผ์ง ์์์ ๋์ผํ ๋ ์์ผ๋ก ๋ณด๊ณ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ๊ณ ์์.
๋ฐ๋ผ์ ๊ฐ ์์์ ํค๊ฐ์ ์ฃผ์ด์ผ ํ๋ค.import { Test } from '../../src/test2'; export default function Test2() { const List = ['์ฌ๊ณผ', '๋ธ๊ธฐ', '๋ฐ๋๋']; return ( <> {List.map((data) => ( <Test key={id}>{data}</Test> ))} </> ); }
-> map์ ์ฌ์ฉํด ๋ฐ๋ณตํด์ ๋๋ฆฌ๋ฏ๋ก ํจ์จ์ ์ผ๋ก ๋๋ฆด ๋ฐฉ๋ฒ์ ์๊ฐํ๊ฒ ๋๋ค.
Key๊ฐ๋ง ๋น๊ตํ์ฌ Key๊ฐ ์ถ๊ฐ ๋๋์ง, ์ญ์ ๋๋์ง๋ง ๋น๊ตํ์ฌ ๋ถํ์ํ ๋น๊ต๋ ๋ ๋๋ง์ ์์ ์ฃผ๋๋ก ํ๋ค.
์ฌ๊ธฐ์ ์์ ์ ์ธ ๊ณ ์ ์ฑ์ ๋ถ์ฌํ๊ธฐ ์ํด ์ค๋ณต๋๋ ๊ฐ์ด ์๋ ๊ฒ์ผ๋ก ์ง์ ํด ์ค์ผํ๋ค.
- ์ค์ต
-> map์์๋ index๋ ๊ฐ์ด ๋ค์ด์จ๋ค.
index๋ ์ค๋ณต๋์ง ์๊ธฐ ๋๋ฌธ์ index๋ฅผ key๋ก ํด์ค๋ ๋จ.
ํ์ง๋ง index๋ฅผ ํค๋ก ์ฃผ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ ์๊น
์ญ์ ์์ ์ฒดํฌํ๊ณ ์ญ์ ๋ฒํผ์ ๋๋ฅด๋ฉด (๋์ด ๊ด๊ณ๋ ์์) ์ฒดํฌํ์๊ฐ ์ฌ๋ผ์ง์ง ์์.
el.number๋ฅผ key๋ก ํ๋ฉด ์ ์ฌ๋ผ์ง
number์ index๋๋ค ์ค๋ณต๋์ง ์์๋ฐ ๋ค๋ฅธ ์ด์ ๋?
๋ง์ฝ 7๋ฒ index๋ฅผ ์ฒดํฌํ๊ณ ์ญ์ ํ์ ๋ ์๋์ชฝ์ด ์์ชฝ์ผ๋ก ์ฌ๋ผ์ด
number๋ ์์ ๊ณ ์ ๊ฐ
ํ์ง๋ง index๋ 0๋ถํฐ ๋ฐ๋ณต๋๋ ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์๋ฒ์ ๋ฒํธ๊ฐ ์์๋ก ์ฌ๋ผ์ค๊ฒ ๋๋ค.
๋ฐ๋ผ์ index๋ฅผ ํค๊ฐ์ผ๋ก ์ฃผ๋๊ฑด ์ข์ง ์์ ๋ฐฉ๋ฒ์.โ Index๋ฅผ Key๋ก ์ค๋ ๊ด์ฐฎ์ ์ํฉ
- ์ ์ ์ธ ๋ฐ์ดํฐ. ๊ณ์ฐ๋์ง ์๊ณ ๋ณ๊ฒฝ๋์ง ์๋ ๋ฐ์ดํฐ
- map์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ์ id๊ฐ ์์ ๊ฒฝ์ฐ
- ๋ฐ์ดํฐ๊ฐ ์ฌ์ ๋ ฌ๋๊ฑฐ๋ ํํฐ๋ง ๋์ง ์๋ ๊ฒฝ์ฐ.
(๊ณ์ ๊ทธ ์๋ฆฌ ๊ทธ๋๋ก)
ํ์ง๋ง ์๋ฒ์์ ๋ฐ์์ค๋ ๋ฐ์ดํฐ๋ผ๋ฉด ๊ทธ๋ด๋ฆฌ ์์.
<๋ฑ๋ก/์์ ํ์ด์ง ์์>
1. ๋ฑ๋กํ์ด์ง์์ ์์ธํ์ด์ง๋ก ๊ฐ๋ ์ด๋๋ฒํผ ๋ง๋ค๊ธฐ
2. ๋ผ์ฐํ ํธ์ฌ๋ก ์์ธํ์ด์ง ์ด๋์์ผ์ฃผ๊ธฐ
3. ์์ธํ์ด์ง์์ ์์ ํ๊ธฐ ๋ฒํผ ๋ง๋ค๊ธฐ
4. ๋ฐ์ด๋ฉ ํด์ฃผ๊ธฐ
5. ์์ ํ์ด์ง๋ก ๋ผ์ฐํ ํธ์ฌํด์ฃผ๊ธฐ -> ${router.query.[dynamicrounting folder]}
6. ๋ฑ๋กํ๊ธฐ ํ์ด์ง ์์ ์์
7. isEdit๋ฐ์ดํฐ๋ฅผ ์ปจํ ์ด๋์ ๋๊ฒจ์ค์ ์์ ์ธ์ง ๋ฑ๋ก์ธ์ง ์๋ ค์ค๋ค.
(props ์ฒ๋ฆฌํ๊ธฐ)
8. ์ปจํ ์ด๋์์ ๋ค์ ํ๋ ์ ํฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค๋ค.
9. ํ๋ ์ ํฐ์์ onClick์ ํจ์๋ฅผ ๋ฐ์ธ๋ฉํ ๋ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ผ๋ก ์ฒ๋ฆฌํ๋ค.
10. ์์ ํจ์(์ ๋ฐ์ดํธํจ์)๊ฐ ๋ฐ๋ก ํ์ํ๋๊น ์ปจํ ์ด๋์์ ๋ง๋ค์ด์ ๋ค์ ๋๊ฒจ์ค์ผ ํจ!
11. ์์ ํจ์ ์์ ์์ mutaiton ๋ ๋ฆฌ๋ ๋ก์ง์์ฑํด์ฃผ๊ธฐ
12. import export ๊น๋จน์ง ๋ง๊ธฐ!
13. ๋ฑ๋กํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ฒ๋ผ ์์ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋๋ก await/async ์ฌ์ฉํ๊ธฐ
14. ์์ ๋ ๊ฒฐ๊ณผ๋ฅผ result์ ๋ฐ์์ ์ถ๋ ฅํ๋ค.
- ๋ฐ์ดํฐ์ ๋ฐฉํฅ ๋ถ๋ชจ -> ์์
(props๋ก ๋ฐ์ดํฐ ์ ๋ฌํด์ค๊ฒ ๋ฐ์์ ์ฌ์ฉํด!)
์ปดํฌ๋ํธ๋ ์์ -> ๋ถ๋ชจ๋ก ์ ๋ฌ
(ํ๋ ์ ํฐ์ผ ๋ด ์ปดํฌ๋ํธ ๋๋ฆด๊ฒ~~ํฉ์ณ์ค!)- presenter์ UI๋ฅผ ๊ฐ์ด ๋น๊ตํ๋ฉด์ ๋ณด์!
- ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ๊ด์ ์์ ์์ ํ๊ธฐ ๋ง๋ค๊ธฐ!
์์ ํ๊ธฐ๋ฅผ ๋ ๋ง๋ค์ง ์๊ณ ๋ฑ๋กํ๊ธฐ๋ฅผ ์ฌ์ฌ์ฉํ๋ค!- key๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ฐ์ DOM์ ๋น๊ตํ๋ ๊ณผ์ ์์ ์์ฐจ์ ์ผ๋ก ๋น๊ตํ๋ฉฐ ๋ณํ๋ฅผ ๊ฐ์งํ๋ค.
key๊ฐ ์๋ค๋ฉด, ์ด ๊ฐ์ ์ฌ์ฉํ์ฌ ์ด๋ค ๊ฒ์ด ์์ ์ด ๋๋์ง ๋น ๋ฅด๊ฒ ๊ฐ์งํ ์ ์๋ค.