2023. 9. 27. 23:36ใReact
2023๋ ์ ๋ฆฌ๋ด์ผ๋ ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์์ "Describing the UI" ๋ด์ฉ์ด๋ค.
๐ You will learn
- React Component
- import / export
- JSX
- props
- ์กฐ๊ฑด๋ถ ๋ ๋๋ง
- ๋ชฉ๋ก ๋ ๋๋ง
- ์ปดํฌ๋ํธ ์์์ฑ ์ ์ง
1. React Component
1-1. ์ปดํฌ๋ํธ: UI ๊ตฌ์ฑ ์์
- ๋ฆฌ์กํธ๋ markup, CSS, JS๋ฅผ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ก ๊ฒฐํฉํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ์ด๋ ์ฑ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์์๊ฐ ๋๋ค.
1-2. ์ปดํฌ๋ํธ ์ค์ฒฉ
- ์ปดํฌ๋ํธ๋ ์ผ๋ฐ JS ํจ์์ด๋ฏ๋ก ํ ํ์ผ์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ ์ ์๋ค.
- ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์๋ ์์ง๋ง, ์๋์ฒ๋ผ ์ ์๋ฅผ ์ค์ฒฉํด์๋ ์ ๋๋ค!!
export default function Gallery() {
// ๐ด Never define a component inside another component!
function Profile() {
// ...
}
// ...
}
- ์๋์ฒ๋ผ ์ต์์ ๋ ๋ฒจ์์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํด์ผ ํ๋ค.
export default function Gallery() {
// ...
}
// โ
Declare components at the top level
function Profile() {
// ...
}
2. import / export
2-1. root ์ปดํฌ๋ํธ ํ์ผ
Create React App
์์๋ ์ฑ ์ ์ฒด๊ฐ root ์ปดํฌ๋ํธ ํ์ผ์ธsrc/App.js
์์ ์คํ๋๋ค. (์ค์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ์ผ์ ์์นํ ์๋ ์๋ค.)
๋ชจ๋์ฑ์ ๊ฐํํ๊ณ ๋ค๋ฅธ ํ์ผ์์ ์ฌ์ฌ์ฉํ ์ ์๊ฒ
์ปดํฌ๋ํธ๋ฅผ root ์ปดํฌ๋ํธ ํ์ผ ๋ฐ์ผ๋ก ์ฎ๊ธฐ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
2-2. import / export
1) ์ปดํฌ๋ํธ ์ด๋์ํค๊ธฐ
- ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ JS ํ์ผ์ ์์ฑํ๋ค.
- ํจ์ ์ปดํฌ๋ํธ๋ฅผ exportํ๋ค.
- ์ฌ์ฉํ ํ์ผ์์ importํ๋ค.
2) default export VS named export
- ํ ํ์ผ์์ default export๋ ํ๋๋ง ๊ฐ๋ฅ!
named export๋ ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ! - export ๋ฐฉ์์ ๋ฐ๋ผ import ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค.
- default import๋ฅผ ์ฌ์ฉํ ๋๋ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
- named import๋ฅผ ์ฌ์ฉํ ๋๋ ์ด๋ฆ์ด ๊ฐ์์ผ๋ง ํ๋ค.
Syntax | Export | Import |
---|---|---|
Default | export default function Button() {} |
import Button from './Button.js'; |
Named | export function Button() {} |
import {Button} from './Button.js'; |
3. JSX
3-1. ๋ ๋๋ง ๋ก์ง๊ณผ ๋งํฌ์ ์ด ๊ฐ์ ์ปดํฌ๋ํธ์ ์์นํ๊ฒ ๋ ์ด์
JSX: JS๋ฅผ ํ์ฅํ ๋ฌธ๋ฒ์ผ๋ก, JS ํ์ผ ์์ HTML๊ณผ ์ ์ฌํ ๋งํฌ์ ์ ์์ฑํ ์ ์๊ฒ ํด์ค๋ค.
๊ธฐ์กด์ ์น์ ๋ก์ง์ JS์, ๋งํฌ์ ์ HTML ํ์ผ์ ๋ถ๋ฆฌ๋์ด ์์๋ค.
์น์์ ๋์ฑ ๋์ ์์ค์ ์ํธ์์ฉ์ด ํ์ฉ๋๋ฉด์, ๋ก์ง์ด ์ปจํ ์ธ ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ๋์ฑ ์ค์ํ๊ฒ ์์ฉํ๊ฒ ๋์๋ค.
๋ฐ๋ผ์ JS๊ฐ HTML์ ์ ์ดํ๊ฒ ๋์ด ๋ ๋๋ง ๋ก์ง๊ณผ ๋งํฌ์ ์ด ํจ๊ป ์กด์ฌํ๊ฒ ๋์๋ค.
3-2. JSX์ ๊ท์น
1) ๋จ์ผ ๋ฃจํธ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ค.
- ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ ค๋ฉด, ํ๋์ ๋ถ๋ชจ ํ๊ทธ๋ก ๊ฐ์ผ๋ค.
<div></div>
ํน์<></>
์ ์ฌ์ฉํ๋ค.
์ด๋ฌํ ๋น ํ๊ทธ๋ฅผ Fragment๋ผ๊ณ ํ๋ฉฐ, ๋ธ๋ผ์ฐ์ ์์ HTML ํธ๋ฆฌ ๊ตฌ์กฐ์์ ํ์ ์ ๋จ๊ธฐ์ง ์๊ณ ๊ทธ๋ฃนํํด์ค๋ค.
๐ง Why?
- JSX๋ HTML์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ด๋ถ์ ์ผ๋ก JS ๊ฐ์ฒด๋ก ๋ณํ๋๋ค.
- ํจ์์์ ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ Fragment๋ก ๋ฌถ์ด์ฃผ๋ ๊ฒ์ด๋ค.
2) ๋ชจ๋ ํ๊ทธ๋ฅผ ๋ซ๋๋ค.
- ๋ช ์์ ์ผ๋ก ํ๊ทธ๋ฅผ ๋ซ์์ผ ํ๋ค.
<img>
์ฒ๋ผ ์์ฒด์ ์ผ๋ก ๋ซ๋ ํ๊ทธ๋ ๋ซ์์ค์ผ ํ๋ค.
3) ๋๋ถ๋ถ์ด camelCase์ด๋ค.
- JS์ ๋ณ์๋ช ๊ท์น ๋๋ฌธ์ HTML์ ์ผ๋ถ ์์ฑ์ camelCase ํ๊ธฐ๋ฒ์ผ๋ก ๋ฐ๋์ด์ผ ํ๋ค!
- JSX๋ JS๋ก ๋ณํ๋๊ณ JSX์ ์์ฑ๋ ์์ฑ๋ค์ JS ๊ฐ์ฒด์ key๊ฐ ๋๋ค.
์ปดํฌ๋ํธ์์๋ ์ด๋ฌํ ์์ฑ๋ค์ ๋ณ์๋ก ์ฝ์ด๋ค์ด๋๋ฐ, JS์๋ ๋ณ์ ์ด๋ฆ์ ๋ํ ์ ํ์ด ์๋ค. (์ด๋ฆ์ ๋์๊ฐ ํฌํจ๋ ์ ์๊ณ , class ๊ฐ์ ์์ฝ์ด ๋ถ๊ฐ๋ฅ) aria-*
,data-*
์ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ์ญ์ฌ์ ์ธ ์ด์ ๋ก ๋์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
3-3. string ์ ๋ฌ
- ๋ฌธ์์ด ์์ฑ์ ์ ๋ฌํ๋ ค๋ฉด ์์๋ฐ์ดํ or ํฐ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํ๋ค.
export default function Avatar() {
return (
<img
className="avatar"
src="https://i.imgur.com/7vQD0fPs.jpg"
alt="Gregorio Y. Zara"
/>
);
}
- ๋์ ์ผ๋ก ๊ฐ์ ์ ๋ฌํ๋ ค๋ฉด ๋ฐ์ดํ๋ฅผ
{}
๋ก ๋ฐ๊ฟ์ JS๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
export default function Avatar() {
const avatar = 'https://i.imgur.com/7vQD0fPs.jpg';
const description = 'Gregorio Y. Zara';
return (
<img
className="avatar"
src={avatar}
alt={description}
/>
);
}
3-4. ์ค๊ดํธ ์ฌ์ฉ
- ์ค๊ดํธ
{}
์์์ ํจ์ ํธ์ถ์ ํฌํจํ ๋ชจ๋ JS ํํ์์ ์ฌ์ฉํ ์ ์๋ค.
const today = new Date();
function formatDate(date) {
return new Intl.DateTimeFormat(
'en-US',
{ weekday: 'long' }
).format(date);
}
export default function TodoList() {
return (
<h1>To Do List for {formatDate(today)}</h1>
);
}
3-5. ๊ฐ์ฒด ์ ๋ฌ : ์ด์ค ์ค๊ดํธ ์ฌ์ฉ
- ์ด์ค ์ค๊ดํธ๋ฅผ ์ฌ์ฉํด CSS ๋ฑ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์ ์๋ค.
export default function TodoList() {
return (
<ul style={{
backgroundColor: 'black',
color: 'pink'
}}>
<li>Work on the alcohol-fuelled engine</li>
</ul>
);
}
4. props
4-1. props๋?
- JSX ํ๊ทธ์ ์ ๋ฌํ๋ ์ ๋ณด์ด๋ค.
- ์๋์ className, src, alt ๋ฑ์ด ๋ชจ๋ props
- ์ปดํฌ๋ํธ์ ์ ์ผํ ์ธ์์ด๋ค.
์ปดํฌ๋ํธ ํจ์๋ ํ๋์ ์ธ์์ธ props ๊ฐ์ฒด๋ฅผ ๋ฐ๋๋ค.
function Avatar() {
return (
<img
className="avatar"
src="https://i.imgur.com/1bX5QH6.jpg"
alt="Lin Lanying"
width={100}
height={100}
/>
);
}
export default function Profile() {
return (
<Avatar />
);
}
4-2. ์ปดํฌ๋ํธ์ props ์ ๋ฌ
1) ์์ ์ปดํฌ๋ํธ์ props ์ ๋ฌ
export default function Profile() {
return (
<Avatar
person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }}
size={100}
/>
);
}
2) ์์ ์ปดํฌ๋ํธ ๋ด๋ถ์์ props ์ฝ๊ธฐ
function ์ปดํฌ๋ํธ์ด๋ฆ
๋ค์ ์๋({})
์์์ ๋์ดํด์ ๋ณ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.- ๋ณดํต ์ ์ฒด props ์์ฒด๋ฅผ ํ์๋ก ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ props๋ก ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ฌ์ฉํ๋ค.
function Avatar({ person, size }) {
// person and size are available here
}
4-3. props ๊ธฐ๋ณธ๊ฐ ์ง์
- props๊ฐ ์ง์ ๋์ง ์์์ ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ๋ ค๋ฉด, ๋ณ์ ๋ค์
=
๊ณผ ํจ๊ป ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ๋ฉด ๋๋ค. - props๊ฐ ์ ๋ฌ๋์ง ์๊ฑฐ๋ undefined๋ก ์ ๋ฌ๋ ๋ ๊ธฐ๋ณธ๊ฐ์ด ์ฌ์ฉ๋๋ค.
- null ๋๋ 0์ผ๋ก ์ ๋ฌ๋๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ด ์๋ ์ ๋ฌ๋ ๊ฐ์ด ์ฌ์ฉ๋๋ค.
4-4. spread ๊ตฌ๋ฌธ์ผ๋ก props ์ ๋ฌ
- props ์ ์ฒด๋ฅผ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ ค๋ฉด spread ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
function Profile(props) {
return (
<div className="card">
<Avatar {...props} />
</div>
);
}
4-5. ์์์ JSX๋ก ์ ๋ฌํ๊ธฐ
์๋์ฒ๋ผ ์ปดํฌ๋ํธ๋ค๋ผ๋ฆฌ ์ค์ฒฉ์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด์
<Card>
<Avatar />
</Card>
- JSX ํ๊ทธ ์์ ๋ด์ฉ์ ๋ฃ์ผ๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์ด ๋ด์ฉ์
children
์ด๋ผ๋ prop์ผ๋ก ๋ฐ๊ฒ ๋๋ค.
import Avatar from './Avatar.js';
function Card({ children }) {
return (
<div className="card">
{children}
</div>
);
}
export default function Profile() {
return (
<Card>
<Avatar
size={100}
person={{
name: 'Katsuko Saruhashi',
imageId: 'YfeOqp2'
}}
/>
</Card>
);
}
4-6. props๋ ์ฝ๊ธฐ ์ ์ฉ!
- props๋ฅผ ์ง์ ๋ณ๊ฒฝํ์ง ๋ง ๊ฒ!
- props๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ props (์๋ก์ด ๊ฐ์ฒด)๋ฅผ ์ ๋ฌํ๋๋ก ์์ฒญํด์ผ ํ๋ค.
5. ์กฐ๊ฑด๋ถ ๋ ๋๋ง
5-1. null
- ์๋ฌด๊ฒ๋ ๋ ๋๋งํ๊ณ ์ถ์ง ์์ ๋๋
return null;
5-2. ์ผํญ ์ฐ์ฐ์
return (
<li className="item">
{isPacked ? name + ' โ' : name}
</li>
);
5-3. ๋ ผ๋ฆฌ && ์ฐ์ฐ์
- ์ฐธ์ผ ๋๋ง ๋ ๋๋ง
- ์กฐ๊ฑด์ด false์ด๋ฉด SX ํธ๋ฆฌ์์ ๊ตฌ๋ฉ์ผ๋ก ๊ฐ์ฃผํ๊ณ , ์๋ฌด๊ฒ๋ ๋ ๋๋งํ์ง ์๋๋ค.
return (
<li className="item">
{name} {isPacked && 'โ'}
</li>
);
6. ๋ชฉ๋ก ๋ ๋๋ง
6-1. ๋ชฉ๋ก ๋ ๋๋ง
const people = [
'Creola Katherine Johnson: mathematician',
'Mario Josรฉ Molina-Pasquel Henrรญquez: chemist',
'Mohammad Abdus Salam: physicist',
'Percy Lavon Julian: chemist',
'Subrahmanyan Chandrasekhar: astrophysicist'
];
export default function List() {
const listItems = people.map(person =>
<li>{person}</li>
);
return <ul>{listItems}</ul>;
}
6-2. key
- ๊ฐ ๋ชฉ๋ก์ JSX ์์์๋ ๊ฐ ์์ ๊ฐ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์๋ ๋ฌธ์์ด ๋๋ ์ซ์
key
๋ฅผ ๋ฐ๋์ ๋ถ์ฌํด์ผ ํ๋ค. - key๋ ํ์ ๊ฐ ๊ณ ์ ํด์ผ ํ๋ฉฐ ๋ณ๊ฒฝ๋์ง ์์์ผ ํ๋ค.
- key๋ฅผ ๋๋ค์ผ๋ก ์์ฑํ๋ฉด (
key={Math.random()} โ
) ๋ ๋๋ง๋ ๋๋ง๋ค ๋งค๋ฒ ๋ชจ๋ ์ปดํฌ๋ํธ์ DOM์ด ๋ค์ ์์ฑ๋์ด ์๋๊ฐ ๋๋ ค์ง๊ณ ํญ๋ชฉ ๋ด๋ถ์ ์ฌ์ฉ์ ์ ๋ ฅ๋ ์์ค๋๋ฏ๋ก, ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ ์์ ์ ์ธ ID๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. (๋ฐ์ดํฐ๋ฒ ์ด์ค ID / crypto.randomUUID() / uuid ํจํค์ง โญ๏ธ
) - key๋ prop์ผ๋ก ๋ฐ์ง ์์ผ๋ฏ๋ก ID๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ณ๋์ ํ๋กํผํฐ๋ก ์ ๋ฌํด์ผ ํ๋ค.
key์ ์ญํ
- ๊ฐ ์ปดํฌ๋ํธ๊ฐ ์ด๋ค ๋ฐฐ์ด ํญ๋ชฉ์ ํด๋นํ๋์ง key๋ฅผ ํตํด ์๋ณํ๋ฉฐ
์์น๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ React๊ฐ ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ถ์ ํ ์ ์๊ฒ ๋๋ค.
7. ์ปดํฌ๋ํธ ์์์ฑ ์ ์ง
- ์์ ํจ์๋ ๊ณ์ฐ๋ง ์ํํ๊ณ ๊ทธ ์ด์์ ๊ฒ์ ์ํํ์ง ์๋๋ค.
- ์ปดํฌ๋ํธ๋ฅผ ์๊ฒฉํ๊ฒ ์์ ํจ์๋ก๋ง ์์ฑํจ์ผ๋ก์จ, ์ฝ๋๋ฒ ์ด์ค๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์๊ธฐ๋ ์์ธกํ ์ ์๋ ๋์์ ํผํ ์ ์๋ค.
7-1. ์์์ฑ Purity : ์์์ผ๋ก์์ ์ปดํฌ๋ํธ
1) ์์ ํจ์์ ํน์ง
์์ ํจ์๋ ์๋์ ํน์ง์ ๊ฐ์ง ํจ์์ด๋ค.
side effects๊ฐ ์๋ค.
- ํธ์ถ๋๊ธฐ ์ ์ ์กด์ฌํ๋ ๊ฐ์ฒด๋ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
- ํจ์๊ฐ ์ธ๋ถ ์ธ๊ณ์ ๋ ๋ฆฝ์ ์ด๋ฉฐ, ์ธ๋ถ ์ํ์ ์์กดํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฐธ์กฐ ํฌ๋ช ์ฑ
- ๋์ผํ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
- ํจ์์ ๋์์ด ์์ธก ๊ฐ๋ฅํ๋ฉฐ ์ผ๊ด์ฑ ์์์ ์๋ฏธํ๋ค.
React๋ ์ด ๊ฐ๋
์ ์ค์ฌ์ผ๋ก ์ค๊ณ๋์ด ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ์์ ํจ์๋ผ๊ณ ๊ฐ์ ํ๋ค.
์ฆ, React ์ปดํฌ๋ํธ๋ ๋์ผํ ์
๋ ฅ์ด ์ฃผ์ด์ก์ ๋ ํญ์ ๋์ผํ JSX๋ฅผ ๋ฐํํด์ผ ํ๋ค.
2) Side Effects
- ์๋๋ Side Effects๊ฐ ์์ด์ผ ํ๋ค๋ ๊ท์น์ ์ด๊ธฐ๋ ์ปดํฌ๋ํธ์ด๋ค.
- ์ธ๋ถ์์ ์ ์ธ๋
guest
๋ณ์๋ฅผ ์ฝ๊ณ ์ฐ๊ณ ์์ด ํธ์ถํ ๋๋ง๋ค ๋ค๋ฅธ JSX๊ฐ ์์ฑ๋๋ค.
let guest = 0;
function Cup() {
// โ Bad: ๊ธฐ์กด ๋ณ์๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค!
guest = guest + 1;
return <h2>Tea cup for guest #{guest}</h2>;
}
export default function TeaSet() {
return (
<>
<Cup />
<Cup />
<Cup />
</>
);
}
guest
๋ฅผ prop์ผ๋ก ์ ๋ฌํด์ ๊ณ ์น ์ ์๋ค.
function Cup({ guest }) {
return <h2>Tea cup for guest #{guest}</h2>;
}
export default function TeaSet() {
return (
<>
<Cup guest={1} />
<Cup guest={2} />
<Cup guest={3} />
</>
);
}
- ๋ ๋๋ง์ ์ธ์ ๋ ์ง ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ์ปดํฌ๋ํธ๊ฐ ํน์ ํ ์์๋๋ก ๋ ๋๋ง๋ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํด์๋ ์ ๋๋ค.
์ปดํฌ๋ํธ์ ๋ ๋๋ง์ด ์๋ก ์์กดํ๊ฑฐ๋ ์กฐ์ ํ์ง ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ์ํ๋์ด์ผ ํ๋ค.
7-2. StrictMode
- ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง์ ์ฌ์ฉํ๋ ์ธ ์ข
๋ฅ์ ์
๋ ฅ๊ฐ์ด ์๋ค.
props, state, context
์ด ์ ๋ ฅ๋ค์ ํญ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ทจ๊ธํด์ผ ํ๋ค.
์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ๋ฐ์์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณ์ดํ๋ ๋์ setState๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. - React๊ฐ ์ ๊ณตํ๋ StrictMode์์๋ ๊ฐ ์ปดํฌ๋ํธ์ ํจ์๋ฅผ ๋ ๋ฒ ํธ์ถํด์ ์ด๋ฌํ ๊ท์น์ ์ด๊ธฐ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฐพ๋ ๋ฐ ๋์์ด ๋๋ค.
- StrictMode๋ฅผ ์ ํํ๋ ค๋ฉด ๋ฃจํธ ์ปดํฌ๋ํธ๋ฅผ
<React.StrictMode>
๋ก ๊ฐ์ธ๋ฉด ๋๋ค.
7-3. Side Effects๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- React์์ Side effects๋ ๋ณดํต ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ํ๋ค.
- ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ ์๋์ด ์์ง๋ง ๋ ๋๋ง ์ค์ ์คํ๋์ง๋ ์๋๋ค.
๋ฐ๋ผ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์์ํ ํ์๊ฐ ์๋ค. - Side effects์ ์ ํฉํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์ ์ ์๋ค๋ฉด,
useEffect
๋ฅผ ํธ์ถํด Side effects๋ฅผ ์ฒจ๋ถํ ์ ์๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ ๋๋ง ํ Side effects๊ฐ ํ์ฉ๋ ๋ ์คํํ๋๋ก ์ง์ํ๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ตํ์ ์๋จ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ค. (์ฝ๋์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ)
7-4. React๊ฐ ์์์ฑ์ ์ค์์ํ๋ ์ด์
1) ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฅธ ํ๊ฒฝ์์ ์คํํ ์ ์๋ค. (ex ์๋ฒ)
- ๋์ผํ ์ ๋ ฅ์ ๋ํด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ํ๋์ ์ปดํฌ๋ํธ๊ฐ ๋ง์ ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค.
2) memo
๋ฅผ ํตํด ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
- ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฏ๋ก ์บ์ฑํด๋ ์์ ํ๋ค.
3) ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ์ฌ์์ํ ์ ์๋ค.
- ๋ ๋๋ง ์ค ๊น์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ์ค๋๋ ๋ ๋๋ง์ ์๋ฃํ๋ ์๊ฐ์ ๋ญ๋นํ์ง ์๊ณ ๋ ๋๋ง์ ๋ค์ ์์ํ ์ ์๋ค.
- ์์์ฑ ๋๋ถ์ ์ด๋ ์์ ์์๋ ๋ ๋๋ง์ ์์ ํ๊ฒ ์ค๋จํ๊ณ ์ฌ์์ํ ์ ์๋ ๊ฒ!
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Class Component (0) | 2023.10.02 |
---|---|
[React] Quick Start :: 80% of React concepts (0) | 2023.09.12 |
[React-Native] React-Navigation :: ํ๋ฉด ์ ํํ๊ธฐ (0) | 2022.11.03 |