Note
'Describing the UI' ์ฑํฐ๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ๋ค๋ฃน๋๋ค.
- ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
- ๋ค์ค ์ปดํฌ๋ํธ ํ์ผ์ ์์ฑํ๋ ์๊ธฐ์ ๋ฐฉ๋ฒ
- JSX๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ๋งํฌ์ ์ ๋ํ๋ ๋ฐฉ๋ฒ
- JSX์์
{}
๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ- props ์ธ์๋ก ์ปดํฌ๋ํธ ํจ์๋ฅผ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ
- ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ปจํ ์ธ ๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ
- ๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์ ๊ณ ์ ํ๊ฒ ์๋ณํ์ฌ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ
- ์ปดํฌ๋ํธ๋ฅผ ์์ ํจ์๋ก ๋ง๋๋ ๋ฐฉ๋ฒ
-
JSX๋ HTML๊ณผ ๋งค์ฐ ๋น์ทํด ๋ณด์ด์ง๋ง ์กฐ๊ธ ๋ '์๊ฒฉ' ํ๋ค
- ๋น์ฐ์ ์ฌ๊ฒจ์์ ์ธ์งํ์ง ๋ชปํ๋ ํน์ง
- ๋น์ฐ์ ์ฌ๊ฒจ์์ ์ธ์งํ์ง ๋ชปํ๋ ํน์ง
-
์ด์ ๊ฐ์ ๊ธฐ์กด HTML์ด ์๋ค๋ฉด converter๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ์ ์์ต๋๋ค
- ๋ฆฌ์กํธ์์ ์๊ฐํด์ค converter ํด: (https://transform.tools/html-to-jsx)
- ๋ฆฌ์กํธ์์ ์๊ฐํด์ค converter ํด: (https://transform.tools/html-to-jsx)
-
React์์๋ if ๋ฌธ, &&, ? : ์ฐ์ฐ์ ๊ฐ์ JavaScript ๊ตฌ๋ฌธ์ ์ฌ์ฉํด ์กฐ๊ฑด๋ถ๋ก JSX๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค.
- (LEARN REACT >DESCRIBING THE UI > Conditional Rendering) ์ค์ ๋ก ์ปดํฌ๋ํธ์์ null์ ๋ฐํํ๋ ๊ฒ์ ๋ ๋๋งํ๋ ค๋ ๊ฐ๋ฐ์๋ฅผ ๋๋ผ๊ฒ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ด์ง ์์ต๋๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ์ JSX์ ์ปดํฌ๋ํธ๋ฅผ ์กฐ๊ฑด๋ถ๋ก ํฌํจํ๊ฑฐ๋ ์ ์ธํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง์ต๋๋ค.
- && ์ฐ์ฐ์๋ฅผ ์จ์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ๋ ๊ฒ๋ณด๋ค (์กฐ๊ฑด) ? (์ปดํฌ๋ํธ) : null ๋ก ๋ ๋๋ง ํ๋ ๋ฐฉ์์ด ์ข๋ค๋ ์๊ฒฌ์ ์ฐธ์กฐํ๋๋ฐ, ๊ณต์๋ฌธ์์ ๊ด๋ จ๋ด์ฉ์ค ์ด๋ฐ ๋ฐฉ์์ ๊ถ์ฅํ์ง ์๋๋ค๋ ๋ด์ฉ์ด ์์
- ์ด์ ๊ดํด์๋ ๋ ๊ณต๋ถํ๋ฉด ์ข์๊ฒ๊ฐ์!
-
prop์ ์ ๋ฌํ์ฌ ์ด ์ปดํฌ๋ํธ๋ฅผ ์์ํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- prop์ ์ ๋ฌํ๋ ๊ทผ๋ณธ์ ์ธ ์๋๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์์ ํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๊ฒ
- ์์ํจ์, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ดํ ์ด์ผ๊ธฐ๋ ์ธ๊ธ -> ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ์ด๋ค์ํฉ์ ์ฐ์ด๋๊ฒ ๋ ์ข์์ง ์์๋ณด๋ฉด ์ข์๊ฒ๊ฐ์
-
์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์์ง๋ง, ๊ทธ ์ ์๋ฅผ ์ค์ฒฉํด์๋ ์ ๋ฉ๋๋ค
export default function Gallery() {
// ๐ด Never define a component inside another component!
function Profile() {
// ...
}
// ...
}
- ๋ฒ ์คํธ ํ๋ํฐ์ค ๐คฉ
-
ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํจ์ ๋ฐ๋ผ ์ด๋ฏธ ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ๋ง์ ๋์์ธ์ ๊ตฌ์ฑํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฐ ์๋๊ฐ ๋นจ๋ผ์ง๋๋ค.
- Q: ํ์ฌ์์ ๋์์ธ ์์คํ ์ ๊ตฌ์ถํด์ ์ฌ์ฉ ์ค์ธ๋ฐ ๊ฐ๋ฐํ ๋ ์ต๋ํ ์ฌ์ฌ์ฉํ๋ ค๊ณ ํ๋ค. ํ์ง๋ง ๊ฒฐ๊ตญ ์๋น์ค๋ง๋ค ์๊ตฌ์ฌํญ์ด ๋ค๋ฅด๋ค๋ณด๋ ์กฐ๊ธ์ฉ ๋์์ธ์ด ๋ฌ๋ผ์ ธ์ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ฐ๊ธฐ๋ ์ด๋ ต๋ค. ๋์์ด๋ ๋ถ๋ค๋ ์ ์ฝ๋ฐ๋๋ค๋ ๋๋์ ๋ฐ๋๋ค, ํ์ฌ์์ ๋์์ธ ์์คํ ์ฌ์ฉํ์๋ ๋ถ ์๋๊ฐ?
- A: ์ปดํฌ๋ํธ๋ฅผ ์ ํด์ ๋ง๋ค์ด๋๋๋ผ๋ ๊ฒฐ๊ตญ์ ๊ทธ ์ปดํฌ๋ํธ๋ค์ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํ๋ ๊ณผ์ ์์ ์ถ๊ฐ์ ์ผ๋ก ๋ค์ํ ์๊ตฌ์ฌํญ์ด ๋์์ ๋ฐ์ํ๋ค๋ณด๋ฉด ๊ธฐ์กด์ ์๋ํ ์ปดํฌ๋ํธ๋ณด๋ค ์ปค์คํ
๊ฐ๋ฅ๋ฒ์๊ฐ ๋ณต์กํด์ ธ, ์๊ตฌ์ฌํญ ์ค ๊ณตํต์์๋ก ๋ฃ๊ธฐ ํ๋น ํ๋ค๊ณ ์๊ฐ๋๋ ๋ถ๋ถ์ ๋์์ด๋๋ถ๋ค๊ณผ ํ์ ํตํด์ ๋ฐ์ ํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ ๊ธฐ์กด ์ปดํฌ๋ํธ ์์ ํ์ง ์๊ณ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์ css ์ค๋ฒ๋ผ์ด๋ฉ ํตํด์ ๋ฎ์ด์์ฐ๋ ์ ์ผ๋ก ์งํ
-
Material UI
- Q: ์ปดํฌ๋ํธ๋ฅผ ์ง์ ์์ฑํ๋๊ฐ? ์๋๋ฉด MUI ๊ฐ์ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋๊ฐ?
- A: stitches (https://stitches.dev/) ์ฌ์ฉํด์ ๊ณตํต์ ์ธ ํ ๋ง๋ง ์ง์ ํด์ค๋ค ์ง์ ์คํ์ผ์ปดํฌ๋ํธ ์์ฑํ๋ ์์ผ๋ก ์์ , ์์ฆ tailwind (https://tailwindcss.com/) ๋์ธ์ธ๋ฏ ํ์ฌ ์ฐ๋จน ๊ณ ๋ฏผ์ค
- A: tailwind ๋ ์ด๋ฏธ ์ ํด์ ธ์์ด ์ปค์คํ
์ด ์ด๋ ค์ธ ์ ์์ง๋ง, ๋ํ ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ ์ ๊ทผ์ด ์ฌ์ธ์ ์์ ์ค์ต๋งํฌ:(https://play.tailwindcss.com/)
-
์ด ์์ ์ ์ปดํฌ๋ํธ๋ค์ ๋ชจ๋ App.js๋ผ๋ root ์ปดํฌ๋ํธ ํ์ผ์ ์กด์ฌํฉ๋๋ค. Create React App์์๋ ์ฑ ์ ์ฒด๊ฐ src/App.js์์ ์คํ๋ฉ๋๋ค. ์ค์ ์ ๋ฐ๋ผ root ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ํ์ผ์ ์์นํ ์๋ ์์ต๋๋ค. Next.js์ฒ๋ผ ํ์ผ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ ํ๋ ํ๋ ์์ํฌ์ผ ๊ฒฝ์ฐ ํ์ด์ง๋ณ๋ก root ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ํ๋ ์์ํฌ๋ณ ๊ฒฝํ๋ค ๊ณต์ ํด์ฃผ์ฌ๐
- Next : (https://github.com/vercel/next.js/tree/canary/examples) -> nextํ์์ ๋ง๋ค์ด๋์ ์์ ๋ค ๋ชจ์. ์ ์ฃผ์์ ๋์์๋ ๊ฐ ํด๋๋ค์ด ๊ฐ Next ํ๋ก์ ํธ์ธ๋ฐ, ์๋ฌด๊ฑฐ๋ ๋๋ฌ๋ณด์๋ฉด ๊ทธ ์์ pages๋ผ๋ ํด๋๊ฐ ์๋ค. next์์ ์ด page ํด๋๋ฅผ ๊ธฐ์ค ์ผ๋ก ๋ผ์ฐํ ์ ์์์ ํด์ค.(์ต๊ทผ์ ๋์จ app router ๋ฐฉ์์ ์ ์ธ) ์๋ฅผ ๋ค๋ฉด pages/index.tsx ๋ ๋ฉ์ธํ์ด์ง(example.com/), pages/about.tsx๋ example.com/about ์ฒ๋ผ ๋๋ ๋ฐฉ์
- gatsby : gatsby์์๋ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ผ์ฐํ , ๊ทธ๋์ ์ฒ์์ nextjs์์ gatsby๋ก ๋์ด๊ฐ ๋ ํ๋ก์ ํธ์ ๊ตฌ์กฐ๊ฐ ๋น์ทํด์ ๋ฌ๋์ปค๋ธ๊ฐ ์ ๊ฒ ๋๋
-
Default vs named exports
- ์ด๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ ๋ค์ ์ค๊ฐ์ ๊ฐ๋จ๋ช ๋ฃํ๊ฒ ์ง์ด ์ฃผ๋ ๋ถ๋ถ์ด ์ฐธ ์ข๋ค๊ณ ์๊ฐ -ํ๋์ ํ์ผ์ ํ๋์ ์ปดํฌ๋ํธ ๋ฅผ export default ํด์ ์ฌ์ฉํ๋ ค๊ณ ํ๊ณ , named export๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ ํธ ํจ์ ๊ฐ์๊ฑฐ ๋ด๋ณด๋ผ๋ ์ฌ์ฉ
- ๋ง์ฝ ๋ ์ง ๊ด๋ จ ํจ์๋ค์ ๋ชจ์๋์ dateUtils.ts ํ์ผ ์๋์ ๊ฐ์ด ์ฌ์ฉ
export const convertDateToYYYYMMDD () => {...} export const convertTimeToString () => {...} import { convertDateToYYYYMMDD, convertTimeToString } from './dateUtils.ts'
-
- Q: (2๋ฒ๊ด๋ จ) ์ ๋ง ๊ฐ๋จํ ๊ฑด ๊ฐ์ ํ์ผ์ ๋์ง๋ง ๋๋ถ๋ถ ํ ํ์ผ์ ํ๋์ ์ปดํฌ๋ํธ๋ง ์ ์ธ ํ๋ ค๊ณ ํ๋ ํธ, ๋ค๋ฅธ ๋ถ๋ค ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ํ๋๊ฐ? ์ปดํฌ๋ํธ ์ ์ธ ๋ฐฉ๋ฒ ์ปจ๋ฒค์ ์ ํด๋์๋ ๋ถ์ด ์๋๊ฐ?
- A: ์ ํธํจ์๋ค์ ํ๋์ ํ์ผ ์์ ๋ชจ์๋๋ ์์ผ๋ก ์ฌ์ฉ, ์ปดํฌ๋ํธ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ๋ง ๊ฐ๋จํ ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ๋ฉด ํ ํ์ผ์ ํ๋์ ์ปดํฌ๋ํธ๋ง ์ฌ์ฉ ํ๋ ค ํ๋ ํธ. ์ด์ ์ ํ ํ์ผ์ ์ฌ๋ฌ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํด๋๊ณ ์ฌ์ฉํ๋ ์ ์ด ์์๋๋ฐ ๊ฒฐ๊ตญ ํ์ผ์ ์๋ค๊ฐ๋ค ๋ณด๊ธฐ ํ๋ค์์ด์ ํ๋ํ๋ ๋ถ๋ฆฌํ๋ ์์ผ๋ก ์์ ..!
- Q: ํ์ผ์ด ๋ง์์ง๋๋ผ๋ ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ด ๋ ํธํ๊ฐ?
- A: ํ์ผ๋ช
์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ก ํ์
ํ ์ ์์ด, ๋ถ๋ฆฌํ๋ฉด ๋ ๋ถ๋ฆฌ์๋ก ํธํด์ง๋ค. ์๊ฐ์ด ์๋ค๋ฉด ๋ ๋ถ๋ฆฌํ๊ณ ์ถ๋ค.
-
ํ์ง๋ง ์น์ด ๋์ฑ ์ธํฐ๋ํฐ๋ธํด์ง๋ฉด์ ๋ก์ง์ด ์ปจํ ์ธ ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ก์ต๋๋ค. ๊ทธ๋์ JavaScript๊ฐ HTML์ ๋ด๋นํ๊ฒ ๋์์ฃ ! ์ด๊ฒ์ด ๋ฐ๋ก React์์ ๋ ๋๋ง ๋ก์ง๊ณผ ๋งํฌ์ ์ด ๊ฐ์ ์์น์ ์ปดํฌ๋ํธ์ ํจ๊ป ์๋ ์ด์ ์ ๋๋ค.
- JSX์ ํ์ ๋ฐฐ๊ฒฝ์ ์ ์ค๋ช ํด์ค, jQuery๋ฅผ ์จ๋ณธ ์ ์ ์์ง๋ง ๊ต์ฅํ ์ด์ฐฝ๊ธฐ์ ๋์ ์ง์ ์กฐ์ํด๋ณธ ์ ์ด ์๋๋ฐ React์ ๋นํ๋ฉด ์ฐ๊ธฐ ํ๋ค๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ง์ผ๋ก ๋ ์กฐ์ํ๋ ๋ฐฉ์์ ๊ฒฝํํ ์ดํ์ ๋ฆฌ์กํธ๋ฅผ ๋ฐฐ์ ์๋๋ฐ ์ ๋ง ์ ์ธ๊ณ๋ผ๊ณ ๋๋
- ํ ํ์ฌ์์ ์ฌ์ฉํ๋ ์ ์ฅ์ผ๋ก ์ ๋ง ๊ณต๊ฐ์ด ๊ฐ๋ ๋ด์ฉ ...๐ฅ
-
๋๋ถ๋ถ์ ๊ฒฝ์ฐ React์ ํ๋ฉด ์ค๋ฅ ๋ฉ์ธ์ง๋ ๋ฌธ์ ๊ฐ ์๋ ๊ณณ์ ์ฐพ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋งํ์ ๋ ์ฝ์ด์ฃผ์ธ์!
- ์ฌ๋๋ค์ด ์๋ฌ ๋ฉ์์ง๋ฅผ ๊ทธ๋ ๊ฒ ์ ์ฝ๋ ์ถ์๋ฐ๐คฃ. ์๊ฐํด๋ณด๋ฉด ์ด๋ณด์ผ ๋๋ ์ ๋๋ก ์ ์ฝ์๋ ๊ฒ ๊ฐ๋ค๊ณ ํ์ฌ
- ํ์ฌ๋ ๊ทธ๋์ ๋ฐ์ฑํ๊ฒ ๋๋ ๋ด์ฉ
- ์น์ ํ docs..
-
JSX๋ HTML์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ JavaScript ๊ฐ์ฒด๋ก ๋ณํ๋ฉ๋๋ค. ํ๋์ ๋ฐฐ์ด๋ก ๊ฐ์ธ์ง ์์ ํ๋์ ํจ์์์๋ ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
- ์ด๊ฑธ ์๊ธฐ ์ ์๋ ๊ทธ๋ฅ ๋ฌด์ง์ฑ์ผ๋ก ๋ฐ๋๋๋ฐ JSX๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ๋ก ๋ณํ๋๋ค๋ ๊ฑธ ์๊ณ ๋๋๊น ์์ฐ์ค๋ฝ๊ฒ ์ดํด๋์ด์ ์ข์!
- ์ด ๋ํ ๋งค์ฐ ๊ณต๊ฐ ๊ฐ๋ ๋ด์ฉ
-
์ญ์ฌ์ ์ธ ์ด์ ๋ก aria-* ๊ณผ data-*์ ์ดํธ๋ฆฌ๋ทฐํธ๋ HTML์์์ ๋์ผํ๊ฒ ๋์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํฉ๋๋ค.
- ์ญ์ฌ์ ์ธ ์ด์ ๊ฐ ์์ง๋ง, ์ด์ ๋ฅผ ์์๋ ์์๋ค..
-
๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด HTML๊ณผ SVG๋ฅผ JSX๋ก ๋ณํํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
- Q: ์ค์ ๋ก ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋๊ฐ?
- A: ์์ฆ์ html์ ์์ฑํ ์ผ์ด ๋ณ๋ก ์์ด์ ์ฒ์๋ถํฐ jsx๋ก ์์ฑํ์ฌ ์ฌ์ฉํ ์ผ์ด ์์
- A: ๊ธฐ์กด html ํ์ผ์ ๊ฒฝ์ฐ์ ๋ณ๊ฒฝ์ ์ํด ์ฌ์ฉํ ๋ฏ ์ถ์
๋ด์ฉ์์ ๐
-
You can think of props like โknobsโ that you can adjust. They serve the same role as arguments serve for functionsโin fact, props are the only argument to your component! React component functions accept a single argument, a props object:
- props๊ฐ ํ๋ ์ญํ ์ ์ ์ค๋ช ํด์ฃผ๊ณ ์๋ค. ๋ค์ด์ผ๋ก ์กฐ์ ํ๋ค๋ ํํ์ด ์ธ์๊น๋ค.
- ๊ฐ์ ๋ React docs์๋ ๋น์ ์ ์ธ ํํ์ด ๋ง์ด ์ฌ์ฉ๋์ด ์๋ค๊ณ ๋๋. (์ดํดํ๊ธฐ ์ข์)
-
Use spread syntax with restraint. If youโre using it in every other component, something is wrong. Often, it indicates that you should split your components and pass children as JSX.
spread ๋ฌธ๋ฒ์ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ์ธ์. ๋ค๋ฅธ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋๋ค.
- ์ ๊ฐ ๊ตฌ๋ฌธ(spread ๋ฌธ๋ฒ)์ ์ธ์ ์ฌ์ฉํ์ง ๋ง์์ผํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๋์ ์ด๋ป๊ฒ ํด์ผ ํ๋์ง ๋์๊น์ง ์๋ ค์ฃผ๋ ์ ์ด ์ข๋ค.
- Q: ๊ฐ๋ฐ ์์ ์ ๊ฒฐ๊ตญ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉ ์ฌ๋ถ์ ๊ฐ์ ์์ฌ ํ๋จ์ ์ฐ์์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋ฌธ์์ ์ด ๋ถ๋ถ์ ๊ทธ ์์ฌ ํ๋จ์ ๊ธฐ์ค์ ์ด๋ป๊ฒ ์ธ์ฐ๋ฉด ์ข์์ง ๊ฐ์ด๋ ๋ผ์ธ์ ์ก์์ฃผ๋ ์ญํ . ํ์ง๋ง ๊ฒฐ๊ตญ ๋ํ ์ผํ ํ๋จ์ ๊ฐ๋ฐ์์ ์ฃผ๊ด์ ๋ฌ๋ ค ์๋ค. ๋ค๋ฅธ ๋ถ๋ค์ ์ด๋ฌํ ์์ฌ ํ๋จ์ ๋ฌด์์ ๊ธฐ์ค์ผ๋ก ํ์๋์ง ๊ถ๊ธํ๋ค.
- A1: ์ด๋ ํ ๊ฒ์ ์ ํํ์ ๋ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ํธํ์ง.
- A2: ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ ์ฌ์ฉํ์ง ์๋๋. ์์ธ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋์์ธ ์์คํ ์ ์ฌ์ฉํ ๋. ์ปค์คํ ํ props ์ธ, default๋ก ์ง์ ๋์ด์๋ props ๊ฐ์ ๋๊ธธ ๋์๋ spread๋ก ์ฌ์ฉ.
-
function Avatar(props) { let person = props.person; let size = props.size; // ... }
- Q: ์ ๋ props ๊ตฌ์กฐ๋ถํดํ ๋น์ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ, props ๊ฐ์ ธ์์ ์ฐ๋ ๊ฒ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ์๋ค์ด ์๊ฒ ๊ตฌ๋ ์ถ๋ค. ๋ค๋ฅธ ๋ถ๋ค์ ์ด๋ป๊ฒ ํ๋์ง?
function Avatar(props) { const { person, size } = props; }
- A1: ๋ฌธ์์ ๊ธฐ์ฌ๋ ๊ฒ ์ฒ๋ผ props๋ฅผ ๋ฐ์์ฌ ๋ ์๊ดํธ ์์์ ๊ตฌ์กฐ๋ถํดํ ๋นํด์ ๋์ด์ค๋ ๋ฐฉ์์ ์ ํธํจ.
function Avatar({ person, size }) { // ... }
- A2: ์ด๋ ํ ๋ฐฉ์์ ์ ํํ๋๋๋ ์ทจํฅ์ ๋ฌธ์ ์ด์ง๋ง, ์์ ์๋ผ๋ฆฌ ์ปจ๋ฒค์ ์ผ๋ก ๊ณตํต ๋ฐฉ์์ ํฉ์ํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐ. ์ฝ๋์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋๋ก.
- Q: ์ ๋ props ๊ตฌ์กฐ๋ถํดํ ๋น์ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ, props ๊ฐ์ ธ์์ ์ฐ๋ ๊ฒ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ์๋ค์ด ์๊ฒ ๊ตฌ๋ ์ถ๋ค. ๋ค๋ฅธ ๋ถ๋ค์ ์ด๋ป๊ฒ ํ๋์ง?
-
children
prop์ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์์ JSX๋ก โ์ฑ์ธโ ์ ์๋ โ๊ตฌ๋ฉโ์ ๊ฐ์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ํจ๋, ๊ทธ๋ฆฌ๋ ๋ฑ์ ์๊ฐ์ ๋ํผ์ ์ข ์ขchildren
prop๋ฅผ ์ฌ์ฉํฉ๋๋ค.- typescript ์ฌ์ฉ ์ children์ props๋ก ๋ฐ๋ ์ปดํฌ๋ํธ๋
PropsWithChildren
ํ์ ์ ์ฌ์ฉํด์ฃผ๋ฉด ์กฐ๊ธ ๋ ๋ช ์์ ์ผ๋ก ํ์ ๋ช ์ธ ๊ฐ๋ฅ (react18 ์ถ๊ฐ ํ์ ) - ์ฐธ๊ณ ๋งํฌ : https://trend21c.tistory.com/2280
- typescript ์ฌ์ฉ ์ children์ props๋ก ๋ฐ๋ ์ปดํฌ๋ํธ๋
-
Thereโs nothing wrong with repetitive codeโit can be more legible. But at times you may value conciseness.
- ๋ฐ๋ณต์ ๊ฐ๋ ์ฑ์ด๋ผ๋ ์ฅ์ ์ด ์๋ค๊ณ ๋ ๋ฏธ์ฒ ์๊ฐํ์ง ๋ชปํ๋ค. ์๋ก์ด ๊ด์ ์ ๋ฐฐ์ ๋ค.
- ๋ฐ๋ณต ์ฝ๋์ ์ค๋ณต ์ฝ๋๋ ๋ค๋ฅด๋ค๋ ์๊ฐ์ ํ์.
-
However, props are immutableโa term from computer science meaning โunchangeableโ. When a component needs to change its props (for example, in response to a user interaction or new data), it will have to โaskโ its parent component to pass it different propsโa new object! Its old props will then be cast aside, and eventually the JavaScript engine will reclaim the memory taken by them.
๊ทธ๋ฌ๋ props๋ ๋ถ๋ณ์ผ๋ก, ์ปดํจํฐ ๊ณผํ์์ โ๋ณ๊ฒฝํ ์ ์๋คโ๋ ๋ป์ ์ฉ์ด์ ๋๋ค. ์ปดํฌ๋ํธ๊ฐ props๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ(์: ์ฌ์ฉ์์ ์ํธ์์ฉ์ด๋ ์๋ก์ด ๋ฐ์ดํฐ์ ๋ํ ์๋ต์ผ๋ก), ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ค๋ฅธ props, ์ฆ,์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋๋ก โ์์ฒญโํด์ผ ํฉ๋๋ค! ๊ทธ๋ฌ๋ฉด ์ด์ ์ props๋ ๋ฒ๋ ค์ง๊ณ (์ฐธ์กฐ๋ฅผ ๋๋๋ค), ๊ฒฐ๊ตญ JavaScript ์์ง์ ๊ธฐ์กด props๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์(๊ฐ๋น์ง ์ปฌ๋ ํ . GC)ํ๊ฒ ๋ฉ๋๋ค.
- props๊ฐ ์ด๋ค ์์ผ๋ก ๋ณ๊ฒฝ๋๋์ง ๊ถ๊ธํ๊ธด ํด๋ ์ฐพ์๋ณด์ง ์์๋๋ฐ ์๋ก ์์๊ฐ๋ค.
-
This style works well for simple conditions, but use it in moderation. If your components get messy with too much nested conditional markup, consider extracting child components to clean things up. In React, markup is a part of your code, so you can use tools like variables and functions to tidy up complex expressions.
function Item({ name, isPacked }) { return ( <li className="item">{isPacked ? <del>{name + " โ"}</del> : name}</li> ); }
- ์์๋ก ๋์จ ์ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ๋ฉด ์กฐ๊ธ ๋ ์ฝ๊ธฐ ์์ํ๋ค๊ณ ์๊ฐํจ.
function Item({ name, isPacked }) { return ( <li className="item">{isPacked ? <PackedItem /> : <UnpackedItem />}</li> ); }
- del์ด๋ผ๋ html ํ๊ทธ๋ ์ฒ์ ๋ดค์. html๋ ๊พธ์คํ ๋ฐ์ ํ๊ณ ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋๊ณ ์๊ตฌ๋..
- ์ค๋จ์ ์ ํํํด์ผ ํ๋ ๊ฒฝ์ฐ ํต์์ ์ผ๋ก
text-decoration: line-through
๊ฐ์ css๋ฅผ ์ฌ์ฉํด์์
-
In practice, returning null from a component isnโt common because it might surprise a developer trying to render it. More often, you would conditionally include or exclude the component in the parent componentโs JSX.
- ์ปดํฌ๋ํธ๋ ํญ์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐํํ ๊ฑฐ๋ผ ์๊ฐํ๋๋ฐ null์ ๋ฐํํ๊ฒ ๋๋ฉด ๊ฐ๋ฐ์๊ฐ ์ปดํฌ๋ํธ ๋ด๋ถ ๊ตฌํ์ ๋ณด์ง ์๋ ์ด์ null์ ๋ฐํํ๋ค๋ ๊ฑธ ๋ชจ๋ฅผ ์๋ ์๋ค. ๊ทธ๋์ '๋๋ผ๊ฒ ๋๋ค'๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ์ด๋ฐ ๋ฐฉ์๋ณด๋ค๋ ์ปดํฌ๋ํธ๋ ํญ์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐํํ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๋ ๋๋ง ์ฌ๋ถ๋ฅผ ์ ์ดํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ถ์ฒ.
-
If your components get messy with too much nested conditional markup, consider extracting child components to clean things up. In React, markup is a part of your code, so you can use tools like variables and functions to tidy up complex expressions.
- ์ ์ ๋ฆฌํฉํ ๋ง ์ฑ ์ ์ฝ์ผ๋ฉฐ ๋ณต์กํ ํํ์์ด๋ ๋ก์ง์ ๋ณ์๋ ํจ์๋ก ์ถ์ถํ๊ณ ์ ํฉํ ์ด๋ฆ์ ๋ถ์ฌํด ์ถ์ํํ๋ ๋ฐฉ์์ ๋ดค๋๋ฐ ์ด์ ๋น์ทํ ๊ฒ ๊ฐ๋ค.
- ์ํ๋ช ์ด๋ ๋ณ์๋ช ์ ์๋ฉํฑํ๊ฒ ์ง๋ ๊ฒ์ด ์ค์. ์ด๋ฆ ์ง๊ธฐ ์ด๋ ต๋ค.. -> ์์ฆ chatGPT์๊ฒ ์ด๋ฆ ์ง๊ธฐ๋ฅผ ๋ง์ด ์์ํ๊ณ ์๋๋ฐ ํธํ๊ณ ์ข๋ค.
-
React considers false as a โholeโ in the JSX tree, just like null or undefined, and doesnโt render anything in its place.
- ์ง๋ ์๊ฐ์ ์ผํญ ์ฐ์ฐ์๋ก null์ ๋ฐํํ๋ ๋ฐฉ์์ด ๋ ๋ซ๋ค๋ ์๊ฒฌ์ ๋ค์๋ค๊ณ ๊ณต์ ํ๋๋ฐ, ๋คํํ React์ ์๋ ์๋ฆฌ์ ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ ์ฐจ์ด๊ฐ ์๋ ๊ฒ ๊ฐ๋ค.
-
Donโt put numbers on the left side of &&.
- 0์ผ๋ก ๊ณ์ฐ๋ ๊ฐ์ด false๋ก ๋์ด๊ฐ๋ฉด์ ์ฝ๋๊ฐ ๊ผฌ์๋ ๊ฒฝํ์ด ์์ด์ ๊ณต๊ฐ๋๋ค์.. (+ ์ฌ๋ฌ ๋ช ์ ๊ณต๊ฐ)
- ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋ฏธ์ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฐ๋์ ํด๋น ๊ฐ์ด ์๋๋๋ก ๋ค์ด๊ฐ๋์ง ํ ์คํธํด๋ณด๋ ํธ
??
,||
,&&
๋ฅผ ์ฌ์ฉํ ๋, string์ number๋ก ๋ณ๊ฒฝํ ๋ ๋ฑ ํ๋ณํ ๊ด๋ จ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ด์๊ฐ ์์๋๋ ๊ฒฝ์ฐ ์ฃผ์๊ฐ ํ์ํ๋ค.- string์ number๋ก ๋ณ๊ฒฝํ ๋
Number()
,parseInt()
์ค ๋ฌด์์ ์ฌ์ฉํ๋๋์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ๊ฐ ๊ฝค ์ฆ๋ค.
- string์ number๋ก ๋ณ๊ฒฝํ ๋
-
import { people } from "./data.js"; import { getImageUrl } from "./utils.js"; export default function List() { const chemists = people.filter( (person) => person.profession === "chemist" ); const listItems = chemists.map((person) => ( <li> <img src={getImageUrl(person)} alt={person.name} /> <p> <b>{person.name}:</b> {" " + person.profession + " "} known for {person.accomplishment} </p> </li> )); return <ul>{listItems}</ul>; }
-
Q: ์์ ์ฝ๋์ ๊ฐ์ ๊ฒฝ์ฐ ์ ๋ ListItems๋ฅผ List ์ปดํฌ๋ํธ ์ธ๋ถ์ ๋ณ๋ ์ ์ธํ์ฌ ์ถ์ํํ๋ ๋ฐฉํฅ์ ๊ฐ์ธ์ ์ผ๋ก ์ ํธํ๋ค. ๋ค๋ฅธ ๋ถ๋ค์ ์ด๋ ์ ์ง ๊ถ๊ธ.
-
๐ ์ด๋ฐ ๋๋..
import { people } from "./data.js"; import { getImageUrl } from "./utils.js"; const listItems = (person) => ( <li> <img src={getImageUrl(person)} alt={person.name} /> <p> <b>{person.name}:</b> {" " + person.profession + " "} known for {person.accomplishment} </p> </li>; ) export default function List() { const chemists = people.filter( (person) => person.profession === "chemist" ); return <ul>{chemists.map((person) => <listItems person={person} />)}</ul> }
-
A: ๋์ํ๋ค. ์คํ๋ ค docs์ ์์์ ๊ฐ์ ํํ๋ฅผ ์ฒ์ ๋ด์ ์ ๊ธฐํ์.
-
-
Keys tell React which array item each component corresponds to, so that it can match them up later. This becomes important if your array items can move (e.g. due to sorting), get inserted, or get deleted. A well-chosen key helps React infer what exactly has happened, and make the correct updates to the DOM tree.
-
Locally generated data: If your data is generated and persisted locally (e.g. notes in a note-taking app), use an incrementing counter, crypto.randomUUID() or a package like uuid when creating items.
๋ก์ปฌ์์ ์์ฑ๋ ๋ฐ์ดํฐ: ๋ฐ์ดํฐ๊ฐ ๋ก์ปฌ์์ ์์ฑ๋๊ณ ์ ์ง๋๋ ๊ฒฝ์ฐ(์: ๋ฉ๋ชจ ์์ฑ ์ฑ์ ๋ฉ๋ชจ), ํญ๋ชฉ์ ๋ง๋ค ๋ ์ฆ๋ถ ์นด์ดํฐ, crypto.randomUUID() ๋๋ uuid์ ๊ฐ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ผ๋ง ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋ ํ๋ก ํธ์์ ํ์ ์ถ๊ฐํ ์ผ์ด ์์ด ์ด๋ป๊ฒ ๊ณ ์ ์์ด๋๋ฅผ ๋ถ์ฌํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ uuid ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐ๋ค. ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ id๋ฅผ ์ฃผ๋๋ฐ ์ต์ํด์ ธ ์์ด์ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ฐ๋ก ๋ ์ค๋ฅด์ง ์์์.
- uuid ํจํค์ง ์ธ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฑธ ์์๋ค. ํนํ
crypto.randomUUID()
๋ ์ฒ์ ๋ณด๋ ์น API๋ผ์ ์ ๊ธฐํจ! - ํจํค์ง ์์ด uuid๋ฅผ ์์ฑํ ์ ์๋
crypto.randomUUID()
์ ์กด์ฌ๋ฅผ ์ต๊ทผ์ ์๊ฒ๋์๋๋ฐ (๊ธ์ ์ ) ์ถฉ๊ฒฉ์ด์๋ค.. - ์ด ๋, map์ผ๋ก ๋ ๋๋งํ list์์ ์ฆ์์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ๋ก์ปฌ์์ ๋ฐ์ดํฐ์ ๊ณ ์ ํ id๋ฅผ ๋ถ์ฌํ๋ ์์ ์ด ์ ํ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด ํฌ์ธํธ๋ผ๊ณ ์๊ฐ
- ๋์ถฉ index๊ฐ ๋ฃ์ ๋๊ฐ ๋ง์๋๋ฐ ๋ฐ์ฑํ๊ฒ ๋๋ค..
-
์ ์ ํํ key๋ ๋ฐฐ์ด ๋ด ์์น๋ณด๋ค ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ง์ฝ ์ฌ์ ๋ ฌ๋ก ์ธํด ์ด๋ค ํญ๋ชฉ์ ์์น๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋, ํด๋น ํญ๋ชฉ์ด ์ฌ๋ผ์ง์ง ์๋ ํ, React๋ key๋ฅผ ํตํด ๊ทธ ํญ๋ชฉ์ ์๋ณํ ์ ์์ต๋๋ค.
- ์ต๊ทผ์ key์ ๋ํ ์ง๋ฌธ์ ๋ฐ์์ ๋ ์ ๋๋ก ๋๋ตํ์ง ๋ชปํ์. ๋๋ฃจ๋ญ์ ํ๊ฒ๋ง ์๊ณ ์์๋๋ฐ ํ์คํ ์์๊ฐ๋ค.
-
๋ฐฐ์ด์์ ํญ๋ชฉ์ ์ธ๋ฑ์ค๋ฅผ key๋ก ์ฌ์ฉํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
- ์๋จ ๋ด์ฉ ๋ณด๊ณ ๋ฐ์ฑํ๊ณ ์๋๋ฐ ๋ง์นจ ์ด๋ฐ ๊ธ์ด...
-
Similarly, do not generate keys on the fly, e.g. with key={Math.random()}. This will cause keys to never match up between renders, leading to all your components and DOM being recreated every time. Not only is this slow, but it will also lose any user input inside the list items. Instead, use a stable ID based on the data.
๋ง์ฐฌ๊ฐ์ง๋ก key={Math.random()}๊ณผ ๊ฐ์ด ์ฆ์์์ key๋ฅผ ์์ฑํ์ง ๋ง์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋๋ง๋ ๋๋ง๋ค key๊ฐ ์ผ์นํ์ง ์์ ๋งค๋ฒ ๋ชจ๋ ์ปดํฌ๋ํธ์ DOM์ด ๋ค์ ์์ฑ๋ฉ๋๋ค. ์๋๊ฐ ๋๋ ค์ง ๋ฟ๋ง ์๋๋ผ ๋ชฉ๋ก ํญ๋ชฉ ๋ด๋ถ์ ์ฌ์ฉ์ ์ ๋ ฅ๋ ์์ค๋ฉ๋๋ค. ๋์ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ ์์ ์ ์ธ ID๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋ฐ๋ก ์ด์ ๋ฌธ๋จ์์ ์ ๋ ๋๋ง ์ค์ ํค๋ฅผ ์์ฑํ๋ฉด ์๋๋ค๊ณ ์ด์ผ๊ธฐํ๋์ง ๊ถ๊ธํ๋๋ฐ ์กฐ๊ธ ํ ์ ๋๊ณ ์ค๋ช ํด์ฃผ๋๊น ์ ์ ํผ์ ์๊ฐํด๋ณผ ์ ์์๋ค. ๋ฌธ์๋ฅผ ๊ตฌ์ฑํ ๋ ๊ณ ๋ฏผ์ ๋ง์ด ํ ๊ฒ ๊ฐ๋ค.
-
Detecting impure calculations with StrictMode
import * as React from "react"; import * as ReactDOM from "react-dom/client"; import { StyledEngineProvider } from "@mui/material/styles"; import Demo from "./demo"; ReactDOM.createRoot(document.querySelector("#root")).render( <React.StrictMode>.....</React.StrictMode> );
- index ํ์ผ์
StrictMode
๋ก ๊ฐ์ธ์ ธ์์ผ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋ฒ ๋ ๋๋ง ๋๋ค๋ ๊ฑด ์์๋๋ฐ ์ ๊ทธ๋ฌ๋์ง๋ ๋ชฐ๋์. ์ด๋ฒ์ ์์๋ค์. StrictMode
์์ ๋ ๋ฒ ํธ์ถํ๋ค๋ ๊ฑด ์๊ณ ์์๋๋ฐ ๊ทธ๊ฒ ์ปดํฌ๋ํธ์ ์์์ฑ์ ํ ์คํธํ๋ค๋ ๊ฑด ๋ชฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์์ฑ์ ํ ์คํธํ๊ธฐ ์ํด ์ด๋ ค์ด ๊ฒ์ฆ์ ๊ฑฐ์น๋ ๊ฒ ์๋๋ผ ๋จ์ํ ๋ ๋ฒ ํธ์ถํด๋ณธ๋ค๋ ์ ์ด ์ฌ๋ฏธ์์.
- index ํ์ผ์
-
It minds its own business. It does not change any objects or variables that existed before it was called. Same inputs, same output. Given the same inputs, a pure function should always return the same result.
์์ ์ ์ผ์๋ง ์ ๊ฒฝ์๋๋ค. ํธ์ถ๋๊ธฐ ์ ์ ์กด์ฌํ๋ ๊ฐ์ฒด๋ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ๋์ผ ์ ๋ ฅ, ๋์ผ ์ถ๋ ฅ. ๋์ผํ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
- ์์ ํจ์์ ํน์ง
-
์ปดํฌ๋ํธ๋ฅผ ๋ ์ํผ๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ๋ ์ํผ๋ฅผ ๋ฐ๋ฅด๊ณ ์๋ฆฌ ๊ณผ์ ์์ ์๋ก์ด ์ฌ๋ฃ๋ฅผ ๋ฃ์ง ์์ผ๋ฉด ๋งค๋ฒ ๊ฐ์ ์๋ฆฌ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ๋ฆฌ์กํธ ๊ฐ๋ ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ์์ฃผ ์ธ๊ธ๋์ด์ ํฅ๋ฏธ๋ก์! ์ด ๋ฌธ์ฅ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ ๊น ์ฐ๋จนํ ๋ ๋ดค๋ ๋ฌธ์ฅ์ธ๋ฐ ๊ทธ๋๋ก ๋ค์ด๊ฐ์์ด์ ์ฌ๋ฐ๋ค.
-
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์์์ฑ์ ํฌ๊ฒ ์์กดํ์ง๋ง, ์ธ์ ๊ฐ๋, ์ด๋๊ฐ์์, ๋ฌด์ธ๊ฐ๊ฐ ๋ฐ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ด ํ๋ก๊ทธ๋๋ฐ์ ์์ ์ ๋๋ค!
- [ํํ] ํ๋ก ํธ์๋์์๋ ํนํ ์ด ์์์ฑ์ ๋ณด์ฅํ๊ธฐ๊ฐ ์ด๋ ต์ง ์๋์..ใ ใ
- ๊ณต๊ฐ..
-
However, itโs fine because youโve created them during the same render, inside
TeaGathering
. No code outside ofTeaGathering
will ever know that this happened. This is called โlocal mutationโโitโs like your componentโs little secret.ํ์ง๋ง
TeaGathering
๋ด๋ถ์์ ๋์ผํ ๋ ๋๋ง ์ค์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ต๋๋ค.TeaGathering
์ธ๋ถ์ ์ด๋ค ์ฝ๋๋ ์ด๋ฐ ์ผ์ด ์ผ์ด๋ฌ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ฅผ โ์ง์ญ ๋ณ์ดโ๋ผ๊ณ ํ๋ฉฐ, ์ปดํฌ๋ํธ์ ์์ ๋น๋ฐ๊ณผ ๊ฐ์ต๋๋ค.- ์ง์ญ ๋ณ์ด๋ผ๋ ๊ฐ๋ ์์ฒด๋ ์ฒ์ ๋ดค๋๋ฐ ์ง๊ธ๊น์ง ๋ฌด์์์ ์ผ๋ก ์ฌ์ฉํ ๊ฒ ๊ฐ๋ค. ๋ฐฐ์ด์ด ๋ด๊ธด ์ํ๊ฐ ์์ ๋ ๊ทธ ๋ฐฐ์ด์ ํํฐ๋งํ ๊ฐ์ ๋ณ์์ ๋ด์์ ๋ ๋๋งํ๋ค๋๊ฐ.
-
In React, side effects usually belong inside event handlers. Event handlers are functions that React runs when you perform some actionโfor example, when you click a button. Even though event handlers are defined inside your component, they donโt run during rendering! So event handlers donโt need to be pure.
React์์ ์ฌ์ด๋ ์ดํํธ๋ ๋ณดํต ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ํฉ๋๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ฌ์ฉ์๊ฐ ์ด๋ค ๋์์ ์ํํ ๋(์๋ฅผ ๋ค์ด, ๋ฒํผ์ ํด๋ฆญํ ๋) React๊ฐ ์คํํ๋ ํจ์์ ๋๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ ์๋์ด ์๊ธด ํ์ง๋ง ๋ ๋๋ง ์ค์๋ ์คํ๋์ง ์์ต๋๋ค! ๋ฐ๋ผ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์์ํ ํ์๊ฐ ์์ต๋๋ค.
- ์ข ์ด๋ ค์์ ๊ณฑ์น๋ ์ค์ธ๋ฐ ๋ ๋๋ง ์ค์ ์คํ๋๋ ๊ฒ์ด ์๋๋ฉด ์์ํ ํ์๊ฐ ์๋ค๋ ์ ์ ๊ณ์ ์๊ฐํ๊ฒ ๋๋ค.
-
If youโve exhausted all other options and canโt find the right event handler for your side effect, you can still attach it to your returned JSX with a useEffect call in your component. This tells React to execute it later, after rendering, when side effects are allowed. However, this approach should be your last resort.
- useEffect๊ฐ ํ๋ ์ผ์ ์ ํ์ด์ ์ค๋ช ํด์ฃผ์๋ค. ํญ์ ๊ทธ๋ฅ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ฒ๋ฆฌํ๋ ํ ์ด๋ผ๊ณ ๋ง ์๊ฐํ์.
- ๋ฆฌ์กํธ clean code์ ํฌ์ธํธ ์ค ํ๋๊ฐ useEffect ๋จ์ฉ์ผ๋ก ์ธํ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ผ๋ง๋ ์ต์ํํ๋๋๋ผ๊ณ ์๊ฐํ๋ค.
- ํ๊ตญ์์ ์ปค๋ฎค๋ํฐ ํ๋์ ํ๋ฐํ ํ๋ FE ์๋์ด ๊ฐ๋ฐ์ ์ค ํ ์ค๋ผ๋ ๋ถ์ด ํจ์ํ ์ฝ๋ฉ์ ๋ํ ๋ธ๋ก๊ทธ ๊ธ์ ์ข ์ข ์์ฑํด์ฃผ์ฌ. ํ๋ก ํธ์๋ ์์ญ์ ์ ์ฉํ ์ ์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ๊ด์ฌ์ด ์๋ค๋ฉด ํ ์ค๋ ๋ธ๋ก๊ทธ ์ฐธ๊ณ ์ถ์ฒํฉ๋๋ค.
- https://velog.io/@teo
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฐ์๋ณด์!