๐พ props๋?
• props๋ ์ปดํฌ๋ํธ์ ์์ฑ์ ์๋ฏธํ๋ค. props๋ ๋ณํ์ง ์๋ immutableํ ๋ฐ์ดํฐ์ด๋ค.
• props๋ ๋ถ๋ชจ ์ปจํฌ๋ํธ์์ ์์ ์ปจํฌ๋ํธ๋ก ๋๋ ๊ตฌ์ฑ ์์ ์์ฒด์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋๋ฐ ์ฌ์ฉ๋๋ค. ์ฆ, ์ด๋ค ๊ฐ์ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํด์ค์ผ ํ ๋ ์ฌ์ฉํ๋ค.
• React ์ปดํฌ๋ํธ๋ JavaScript ํจ์์ ํด๋์ค๋ก, props๋ฅผ ํจ์์ ์ ๋ฌ์ธ์(arguments)์ฒ๋ผ ์ ๋ฌ๋ฐ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง๋ฅผ ๊ธฐ์ ํ๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ค. ๋ฐ๋ผ์ ์ปดํฌ๋ํธ๊ฐ ์ต์ด ๋ ๋๋ง ๋ ๋ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ด๊น๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
• props๋ก ์ด๋ค ํ์ ์ ๊ฐ๋ ๋ฃ์ด ์ ๋ฌํ ์ ์๋๋ก props๋ ๊ฐ์ฒด์ ํํ๋ฅผ ๊ฐ์ง๋ค.
• props๋ ์ธ๋ถ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ณํ์ง ์๋ ๊ฐ์ผ๋ก ์ฝ๊ธฐ ์ ์ฉ(read-only)์ด๋ค.
์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ฒด๊ฐ ์๋๋ผ๋ฉด props๋ฅผ ์ ๋ฌ๋ฐ์ ํ์ ์ปดํฌ๋ํธ ๋ด์์ props๋ฅผ ์ง์ ์์ ์ props๋ฅผ ์ ๋ฌํ ์์ ์ปดํฌ๋ํธ์ ๊ฐ์ ์ํฅ์ ๋ฏธ์น ์ ์๊ฒ ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ์๋ํ์ง ์์ side effect๊ฐ ์๊ธฐ๊ฒ ๋๊ณ ์ด๋ React์ ๋จ๋ฐฉํฅ, ํํฅ์ ๋ฐ์ดํฐ ํ๋ฆ ์์น(React is all about one-way data flow down the component hierarchy)์ ์๋ฐฐ๋๋ค.
์ฆ, ๋ชจ๋ React ์ปดํฌ๋ํธ๋ ์์ ์ props๋ฅผ ๋ค๋ฃฐ ๋ ๋ฐ๋์ ์์ ํจ์(์ ๋ ฅ๊ฐ์ ๋ฐ๊พธ๋ ค ํ์ง ์๊ณ ํญ์ ๋์ผํ ์ ๋ ฅ๊ฐ์ ๋ํด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์)์ฒ๋ผ ๋์ํด์ผ ํ๋ค.
๐พ props ์ฌ์ฉํ๋๋ฒ (๊ธฐ๋ณธ)
props๋ฅผ ์ฌ์ฉํด ์ ์ฒด ์์ฑ์ ๊ฐ์ ธ์ฌ ์๋ ์๊ณ , {์ค๊ดํธ ๋ด๋ถ์ ์์ฑ ์ด๋ฆ์ ์ง์ ํด} ์ํ๋ ์์ฑ๊ฐ๋ง ์ฌ์ฉํ ์๋ ์๋ค.
1. props๋ก ์ ์ฒด ์์ฑ ๊ฐ์ ธ์ค๊ธฐ
// Parent ์ปดํฌ๋ํธ (์ค์ ํ๋ฉด์ render๋๋ ์์ component)
function Parent() {
return (
<Child title="WEB" sub="welcome to the world wide web" />
// 1. ์์ฑ ์ง์
);
};
// Child ์ปดํฌ๋ํธ
function Child(props) { // 2. props ๊ฐ์ ธ์ค๊ธฐ
console.log(props)
/*
props๋ ๊ฐ์ฒด์ ํํ๋ฅผ ๊ฐ์ง๋ค.
{title: 'WEB', sub: 'welcome to the world wide web'}
*/
return (
<div>
<h1>{props.title}</h1>
<p>{props.sub}</p>
</div>
// 3. {} ์์ ์ฌ์ฉํ๋ ค๋ ์์ฑ ์์ฑ
);
};
2. ์ํ๋ ์์ฑ๋ง ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ { … }
// Parent ์ปดํฌ๋ํธ (์ค์ ํ๋ฉด์ render๋๋ ์์ component)
function Parent() {
return (
<Child title="WEB" sub="welcome to the world wide web" />
// 1. ์์ฑ ์ง์
);
};
// Child ์ปดํฌ๋ํธ
function Child({ title, sub }) { // 2. ์ํ๋ ์์ฑ๋ง ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ {}
console.log(title, sub)
// WEB, welcome to the world wide web
return (
<div>
<h1>{title}</h1>
<p>{sub}</p>
</div>
// 3. {} ์์ ์ฌ์ฉํ๋ ค๋ ์์ฑ ์์ฑ
);
};
๐พ props.children
props.children
์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ํ๊ทธ์ ๋ซ๋ ํ๊ทธ๋ก ์ด๋ฃจ์ด์ ธ ์๋ ๊ฒฝ์ฐ ํ๊ทธ์ value๋ฅผ ๊ฐ์ ธ์จ๋ค.
props.children
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ ์์ฒด๋ฅผ props๋ก ์ ๋ฌํ ์๋ ์๋ค.
๐ฉ๐ป๐ป example 1
function Parent() {
return (
<Child title="sayHi">Hi, React!</Child>
);
};
function Child(props) {
console.log(props) // {title: 'sayHi', children: 'Hi, React!'}
return (
<div>{props.children}</div> // Hi, React! ์ถ๋ ฅ
);
};
↑ ์ ์ฝ๋๋ props๋ก ์ ์ฒด ์์ฑ์ ๊ฐ์ ธ์ค๊ณ , ์๋ ์ฝ๋๋ {children}
์ผ๋ก ์ปดํฌ๋ํธ์ value๋ฅผ ๊ฐ์ ธ์จ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก๋ ๋ ์ฝ๋๋ ๊ฐ์ ๋ด์ฉ์ ๋ณด์ฌ์ค๋ค. (Hi, React! ์ถ๋ ฅ) ↓
function Parent() {
return (
<Child title="sayHi">Hi, React!</Child>
);
};
function Child({ children }) {
console.log(children) // Hi, React!
return (
<div>{children}</div> // Hi, React! ์ถ๋ ฅ
);
};
๐ฉ๐ป๐ป example 2
function Parent() {
const apple = "๐";
const orange = "๐";
return (
<Child>{apple}{orange}</Child>
);
};
function Child(props) {
console.log(props.children) // ['๐', '๐']
return (
<div>{props.children}</div>
);
};
๐พ props๋ก ๋์ ์ผ๋ก ๋ฆฌ์คํธ ์์ฑํ๊ธฐ (key)
// App component (์ค์ ํ๋ฉด์ render๋๋ component)
function App() {
const topics = [
{ id:1, title:'html', body: 'html is...' },
{ id:2, title:'css', body: 'css is...' },
{ id:3, title:'js', body: 'js is...' },
]
return (
<Nav topics={topics}></Nav>
)
}
// Nav component
function Nav(props) {
console.log(props) // props๋ก App ์ปดํฌ๋ํธ์ topics ๋ฐฐ์ด์ ๋ฐ๋๋ค.
/* for๋ฌธ ์ฌ์ฉ
const list = []
for(let i=0; i<props.topics.length; i++) {
let j = props.topics[i];
list.push( <li key={j.id}><a href={`/${j.id}`}>{j.title}</a></li> )
}
*/
// map์ฌ์ฉ
const list = props.topics.map((value) => {
return <li key={value.id}><a href={`/${value.id}`}>{value.title}</a></li>
});
return(
<nav>
<ol>
{list}
</ol>
</nav>
)
}
• list์ key
list์ key๋ฅผ ์
๋ ฅํด์ฃผ์ง ์์ผ๋ฉด ๋ฆฌ์คํธ ๊ฐ ํญ๋ชฉ์ key๋ฅผ ๋ฃ์ด์ผ ํ๋ค๋ ๊ฒฝ๊ณ ๊ฐ ํ์๋๋ค. (Warning: Each child in a list should have a unique "key" prop.)
key๋ ์๋ฆฌ๋จผํธ์ ๋ฐฐ์ด์ ๋ง๋ค ๋ ํฌํจํด์ผ ํ๋ ํน๋ณํ ๋ฌธ์์ด์ผ๋ก React๊ฐ ์ด๋ค ํญ๋ชฉ์ ๋ณ๊ฒฝ, ์ถ๊ฐ ํน์ ์ญ์ ํ ์ง ์๋ณํ๋ ๊ฒ์ ๋๋๋ค. ์๋ฆฌ๋จผํธ๋ค์ ์์ ์ ์ผ๋ก ์๋ณํ ์ ์๋๋ก ๋ฐฐ์ด ๋ด์ ์๋ฆฌ๋จผํธ์ key๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.
key๋ ๊ฐ์ ๋ฐฐ์ด์ ํฌํจ๋ ๋ค๋ฅธ ์์ ์ฌ์ด์์๋ง ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๋ฉด ๋๋ค. (์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ๋จ์ผ ์ปดํฌ๋ํธ ์ ์ฒด์์ ๊ณ ์ณ๊ฐ์ ๊ฐ์ง ํ์๋ ์๋ค.)
Math.random()
๊ฐ์ ๊ฐ์ key๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค. React๊ฐ ํญ๋ชฉ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ๋ค์ ์ ๋ ฌํ ์๊ธฐ๋ฅผ ๊ฒฐ์ ํ ์ ์๋๋ก key๋ ๋ค์ ๋ ๋๋งํ๋ ๊ณผ์ ๋์ “์์ ์ ์ผ๋ก ์๋ณ ๊ฐ๋ฅ”ํด์ผ ํฉ๋๋ค. ์ด์์ ์ผ๋ก, Key๋ id
์ ๊ฐ์ด ๋ฐ์ดํฐ์์ ์ฌ์ฉ๋๋ ์ ์ผํ๊ณ ์์ ์ ์ธ ์๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๐พ defaultProps
๊ฐ์ด ์ง์ ๋์ง ์์์ ๋, props์ ๊ธฐ๋ณธ๊ฐ์ ์ฃผ๊ธธ ์ํ๋ค๋ฉด โ ๋ณ์ ๋ฐ๋ก ๋ค์ =
๊ณผ ํจ๊ป ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์ด ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ํด์ฃผ๊ฑฐ๋, โก ์ปดํฌ๋ํธ์ defaultProps
๊ฐ์ ์ค์ ํ ์ ์๋ค.
→ ๊ธฐ๋ณธ๊ฐ์ ํด๋น prop์ด ์๊ฑฐ๋ {undefined}
๋ก ์ ๋ฌ๋ ๋ ์ฌ์ฉ๋๋ค.
→ {null}
๋๋ {0}
์ผ๋ก ์ ๋ฌ๋ ๊ฒฝ์ฐ๋ ๊ธฐ๋ณธ๊ฐ์ด ์ฌ์ฉ๋์ง ์๋๋ค.
1. ๋ณ์ ๋ฐ๋ก ๋ค์ = ๊ณผ ํจ๊ป ๊ธฐ๋ณธ๊ฐ ๋ฃ๊ธฐ
function App() {
return (
<User name="fay" /> // age prop์ด ์๋ User component
)
}
function User({ name, age = 20 }) { // age ๊ธฐ๋ณธ๊ฐ ์ง์
console.log(name, age) // fay, 20
return (
<div>
<p>name: {name}</p>
<p>age: {age}</p>
</div>
)
}
2. defaultProps ์ ์
function App() {
return (
<div>
<List list={undefined} />
{/* list๊ฐ undefined์ธ ๊ฒฝ์ฐ */}
</div>
)
}
const List = ({ list }) => {
const items = list.map((items) => {
return <li key={items.id}></li>
});
return (
<div>
<h2>๋ฆฌ์คํธ</h2>
<div>
<p>{list.length}๊ฐ์ ๋ฆฌ์คํธ๊ฐ ์์ต๋๋ค.</p>
<ul>
{items}
</ul>
</div>
</div>
)
}
// List์ defaultProps
List.defaultProps = {
list: [],
};
๐พ Props Drilling๊ณผ ์ํ๊ด๋ฆฌ
โ๏ธ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์๋ชป๋ ์ ๋ณด๋ ๋ ๊ณต์ ํ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
'Frontend Dev > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React์ Props Drilling๊ณผ ์ํ๊ด๋ฆฌ (0) | 2023.06.25 |
---|---|
React Hooks - useEffect (0) | 2023.05.31 |
React์ ๋ฐ์ดํฐ ํ๋ฆ - React๋ก UI๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋จ๊ณ (0) | 2023.05.30 |
React state์ ๊ฐ๋จํ๊ฒ ์์๋ณด๋ useState (0) | 2023.05.23 |
React ๊ธฐ๋ณธ, JSX(JavaScript XML)์ JSX ๋ฌธ๋ฒ ๊ท์น ํ๋ฒ์ ์์๋ณด๊ธฐ (0) | 2023.05.18 |