๐จ๏ธ Component
- ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ ๊ตฌ์กฐ๋ผ๋ ์ค์ํ ํน์ง์ ๊ฐ์ง๊ณ ์์
- ๋ชจ๋ ํ์ด์ง๊ฐ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ํ๋์ ์ปดํฌ๋ํธ๋ ๋ ๋ค๋ฅธ ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ์ ์กฐํฉ์ผ๋ก ๊ตฌ์ฑ
- ์ปดํฌ๋ํธ๋ฅผ ๋ผ์ ๋ง์ถฐ์ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐ
- ํ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํจ์ผ๋ก์จ ์ ์ฒด ์ฝ๋์ ์์ ์ค์ผ ์ ์์ด ์์ฐ์ค๋ ๊ฐ๋ฐ ์๊ฐ๊ณผ ์ ์ง ๋ณด์ ๋น์ฉ๋ ์ค์ผ ์ ์์
- ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์์ ๋น์ท
- React ์ปดํฌ๋ํธ์ ์ญํ ์ ์ด๋ ํ ์์ฑ๋ค์ ์ ๋ ฅ์ผ๋ก ๋ฐ์์ ๊ทธ์ ๋ง๋ ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ์ฌ ๋ฆฌํด
- React ์ปดํฌ๋ํธ๋ ๋ง๋ค๊ณ ์ ํ๋ ๋๋ก props. ์ฆ ์์ฑ์ ๋ฃ์ผ๋ฉด ํด๋น ์์ฑ์ ๋ง์ถฐ ํ๋ฉด์ ๋ํ๋ ์๋ฆฌ๋จผํธ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๊ฒ
๐จ๏ธ Props
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์ ๋ ฅ
- Props๋ prop ๋ค์ ๋ณต์ํ์ ๋ํ๋ด๋ s๋ฅผ ๋ถ์ฌ์ props์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒ์ ์๋ฏธ
- prop์ property ์ค์ฌ์ ์ฌ์ฉํ ๊ฒ
- ๋ฆฌ์กํธ์์๋ React ์ปดํฌ๋ํธ์ ์์ฑ์ ๋ํ๋
- ๊ฐ์ React ์ปดํฌ๋ํธ์์ ๋์ ๋ณด์ด๋ ๊ธ์๋ ์๊น ๋ฑ์ ์์ฑ์ ๋ฐ๊พธ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์ ์ ์ฌ๋ฃ
- ์ปดํฌ๋ํธ์ ์ ๋ฌํ ๋ค์ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด
- ์ปดํฌ๋ํธ์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ ๋ฌ๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ์ต์ ์๋ฆฌ๋จผํธ๋ฅผ ํ๋ฉด์ ๋ ๋๋งํ๊ณ ์ถ์ ๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ๋์ค์ ๋ฃ์ด์ ์ ๋ฌํ๋ ๋ฐฉ์์ ์ฌ์ฉํจ
๐จ๏ธ Props ํน์ง
- Read-Only
- ์ฝ๊ธฐ ์ ์ฉ
- ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์
- ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ์๋ก์ด ๊ฐ์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ์ฌ ์๋ก์ด ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑ
๐จ๏ธ JavaScript ํจ์์ ์์ฑ
// pure
function sum(a, b) {
return a + b;
}
// impure
function withdraw(accout, amount) {
account.total -= amount;
}
- pure
- ํจ์๊ฐ ์์
- ์ ๋ ฅ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ๊ฐ์ ์ ๋ ฅ ๊ฐ์ ๋ํด์๋ ํญ์ ๊ฐ์ ์ถ๋ ฅ๊ฐ์ ๋ฆฌํด
- impure
- ์ ๋ ฅ์ผ๋ก ๋ฐ์ ํ๋ผ๋ฏธํฐ account์ ๊ฐ์ ๋ณ๊ฒฝ
- ํจ์๊ฐ ์์ํ์ง ์
- ๋ชจ๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ๊ทธ๋ค์ Props์ ๊ดํด์๋ Pure ํจ์ ๊ฐ์ ์ญํ ์ ํด์ผ ํจ
- ๋ชจ๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ Props๋ฅผ ์ง์ ๋ณ๊ฒฝํ ์ ์๊ณ , ๊ฐ์ Props์ ๋ํด์๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค ๊ฒ
๐จ๏ธ Props ์ฌ์ฉ๋ฒ
function App(props){
return (
<profile
name="๋ํฌ"
introduction="์๋
ํ์ธ์, ๋ํฌ์
๋๋ค"
ViewCount={1500}
/>
);
}
- name๊ณผ introduction์ ๋ค์ด๊ฐ ๋ฌธ์์ด์ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์ง ์์๊ณ viewCount์ ๋ค์ด๊ฐ ์ ์๋ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํจ
- JSX์ ๋ํด์ ๋ฐฐ์ธ ๋ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌด์กฐ๊ฑด JavaScript ์ฝ๋๊ฐ ๋ค์ด๊ฐ๋ค๊ณ ๋ฐฐ์ ์
- JSX๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํค์ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ํค๊ฐ์์ ํํ๋ก ์ปดํฌ๋ํธ์ Props๋ฅผ ๋ฃ์ ์ ์์
- ๊ฐ ์์ฑ์ ๊ฐ์ ๋ฃ์ ๋ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ ๊ฒ๊ณผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ์ฐจ์ด
- Props์ ๊ฐ์ ๋ฃ์ ๋์๋ ๋ฌธ์์ด ์ด์ธ์ ์ ์, ๋ณ์ ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ปดํฌ๋ํธ ๋ฑ์ด ๋ค์ด๊ฐ ๊ฒฝ์ฐ์๋ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ธ์ฃผ์ด์ผ ํจ
- ๋ฌธ์์ด๋ ์ค๊ดํธ๋ก ๊ฐ์ธ๋ ์๊ด์์
- ์ด๋ ๊ฒ ํ๋ฉด ์ด ์์ฑ์ ๊ฐ๋ค์ด ๋ชจ๋ ํ๋กํ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌ๋๋ฉฐ props๋ ์ด์ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๊ฐ ๋จ
{
name: "๋ํฌ",
introduction: "์๋
ํ์ธ์, ๋ํฌ์
๋๋ค."
viewCount: 1500
}
- props์ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํด์ ๋ค์๊ณผ ๊ฐ์ด props์ ๊ฐ์ผ๋ก ์ปดํฌ๋ํธ๋ ๋ฃ์ ์ ์์
function App(props){
return (
<Layout
width={2560}
height={1440}
header={
<Header title="๋ํฌ์ ๋ธ๋ก๊ทธ์
๋๋ค"/>
}
footer={
<Footer />
}
/>
);
}
- ๋ ์ด์์ ์ปดํฌ๋ํธ์ props๋ก๋ ์ ์ ๊ฐ์ ๊ฐ์ง width, height๊ณผ react ์๋ฆฌ๋จผํธ๋ก header, footer๊ฐ ๋ค์ด์ค๊ฒ ๋จ
- JSX๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ๋จํ๊ฒ ์ปดํฌ๋ํธ์ props๋ฅผ ๋ฃ์ ์ ์์
๐จ๏ธ Function Component
function Welcome(props) {
return <h1>์๋
, {props.name}</h1>;
}
- ํ๋์ Props ๊ฐ์ฒด๋ฅผ ๋ฐ์์ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฆฌํด
- ๊ฐ๋จํ ์ฝ๋๋ฅผ ์ฅ์ ์ผ๋ก ๊ฐ์ง
๐จ๏ธ Class Component
class Welcome extends React.Component {
render() {
return <h1>์๋
, {this.props.name}</h1>
}
}
- JavaScript ES6์ Class๋ผ๋ ๊ฒ์ ์ฌ์ฉํด์ ๋ง๋ค์ด์ง ํํ์ ์ปดํฌ๋ํธ
- React์ ๋ชจ๋ ํด๋์ค ์ปดํฌ๋ํธ๋ React.Component๋ฅผ ์์๋ฐ์ ๋ง๋ ๋ค๋ ๊ฒ
- React.Component๋ผ๋ ํด๋์ค๋ฅผ ์์๋ฐ์์ Welcome์ด๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์์ผ๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก React ์ปดํฌ๋ํธ๊ฐ ๋๋ ๊ฒ
๐จ๏ธ Component ์ด๋ฆ
// HTML div ํ๊ทธ๋ก ์ธ์
const element = <div />
// Welcome์ด๋ผ๋ ๋ฆฌ์กํธ Component๋ก ์ธ์
const element = <Welcome name="์ธ์ " />
- ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ํญ์ ๋๋ฌธ์๋ก ์์ํด์ผ ํจ
- React๋ ์๋ฌธ์๋ก ์์ํ๋ ์ปดํฌ๋ํธ๋ฅผ DOMํ๊ทธ๋ก ์ธ์
- div๋ span๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒ์ ๋ด์ฅ ์ปดํฌ๋ํธ๋ผ๋ ๊ฒ์ ๋ปํ๋ฉฐ div๋ span๊ณผ ๊ฐ์ ๋ฌธ์์ด ํํ๋ก react.createElement์ ์ ๋ฌ
- ๋๋ฌธ์๋ก ์์ํ๋ FOO์ ๊ฐ์ด ๋๋ฌธ์๋ก ์์ํ๋ ๊ฒฝ์ฐ์๋ React.createElement foo ํํ๋ก ์ปดํ์ผ๋๋ฉฐ JavaScript ํ์ผ ๋ด์์ ์ ์ํ๊ฑฐ๋ ์ํฌํธํ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฆฌํด
๐จ๏ธ Component ๋ ๋๋ง
// DOM ํ๊ทธ๋ฅผ ์ฌ์ฉํ element
const element = <div />;
// ์ฌ์ฉ์๊ฐ ์ ์ํ Component๋ฅผ ์ฌ์ฉํ element
const element = <Welcome name="์ธ์ " />;
function Welcome(props) {
return <h1>์๋
, {props.name}</h1>;
}
const element = <Welcome name="์ธ์ " />;
ReactDOM.render(
element,
document.getElementById('root')
);
- ๋ฆฌ์กํธ๋ welcome ์ปดํฌ๋ํธ์ name ์ธ์ฌ๋ผ๋ props๋ฅผ ๋ฃ์ด์ ํธ์ถํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ก ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ ์์ฑ
- ์๋ฆฌ๋จผํธ๋ ์ต์ข ์ ์ผ๋ก ๋ฆฌ์กํธ ๋์ ํตํด ์ค์ ๋์ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฐ์ดํธ ๋๊ณ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ๋ณผ ์ ์๊ฒ ๋จ
๐จ๏ธ Component ํฉ์ฑ
- ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ํฉ์ณ์ ํ๋์ ์ปดํฌ๋ํธ๋ก ๋ง๋๋ ๊ฒ
- ๋ณต์กํ ํ๋ฉด์ ์ฌ๋ฌ ๊ฐ์ Component๋ก ๋๋ ์ ๊ตฌํ ๊ฐ๋ฅ
- ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ํฉ์ณ์ ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ปดํฌ๋ํธ ํฉ์ฑ์ด๋ผ๊ณ ํจ
- ์น ์ปดํฌ๋ํธ๋ฅผ ๋ฃจํธ๋ก ํด์ ํ์ ์ปดํฌ๋ํธ๋ค์ด ์กด์ฌํ๋ ํํ๊ฐ ๋ฆฌ์กํธ๋ก๋ง ๊ตฌ์ฑ๋ ์ฑ์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ
- ๊ธฐ์กด์ ์๋ ์นํ์ด์ง์ ๋ฆฌ์กํธ๋ฅผ ์ฐ๋ํ๋ค๋ฉด ๋ฃจํธ ๋ ธ๋๊ฐ ํ๋๊ฐ ์๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๊ฐ ๋ํ๋์ง ์์ ์ ์์
๐จ๏ธ Component ์ถ์ถ
- ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ์ชผ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ๋ก ๋๋ ์ ์์
- ํฐ ์ปดํฌ๋ํธ์์ ์ผ๋ถ๋ฅผ ์ถ์ถํด์ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ๋ค๋ ๋ป
- ์ปดํฌ๋ํธ์ ์ถ์ถ์ ์ ํ์ฉํ๊ฒ ๋๋ฉด ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ฑ์ด ์ฆ๊ฐ
- ์ปดํฌ๋ํธ๊ฐ ์์์ง์๋ก ํด๋น ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ๊ณผ ๋ชฉ์ ์ด ๋ช ํํด์ง๊ณ ํ๋์ค๋ ๋จ์ํด์ง๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉํ ์ ์๋ ํ๋ฅ ์ด ๋์์ง๊ธฐ ๋๋ฌธ์
- ์ฌ ์ฌ์ฉ์ฑ์ด ์ฌ๋ผ๊ฐ์ผ๋ก์จ ๋์์ ๊ฐ๋ฐ ์๋๋ ํฅ์
- ์ปดํฌ๋ํธ๋ฅผ ์ด๋ ์ ๋ ์์ค๊น์ง ์ถ์ถํ๋ ๊ฒ์ด ์ข์์ง์ ๋ํด ์ ํด์ง ๊ธฐ์ค์ ์์
- ๊ธฐ๋ฅ ๋จ์๋ก ๊ตฌ๋ถํ๋ ๊ฒ์ด ์ข๊ณ ๋์ค์ ๊ณง๋ฐ๋ก ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ํํ๋ก ์ถ์ถํ๋ ๊ฒ์ด ์ข์
- ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๋ง์ด ๊ฐ๊ณ ์์์๋ก ๊ฐ๋ฐ ์๋๊ฐ ๋นจ๋ผ์ง
๐จ๏ธ ๋๊ธ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
- ์์ฑ์ ์ด๋ฆ๊ณผ ๋๊ธ ๋ด์ฉ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๊ฒ ํ๊ธฐ ์ํด props๋ฅผ ์ถ๊ฐ
- ์์ฑ์ ์ด๋ฆ๊ณผ ๋๊ธ ๋ด์ฉ์ด ์ฝ๋ ์์ ๋ฐํ ์๊ธฐ ๋๋ฌธ์ ๋์ ์ผ๋ก ๋ด์ฉ์ ๋ณ๊ฒฝํ ์ ์์
- ์์ฑ์ ์ด๋ฅด๊ณผ ๋๊ธ ๋ด์ฉ์ props.name๊ณผ props.comment ๊ฐ์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ
- props๋ฅผ ์ฌ์ฉํ๋๋ก comment ์ปดํฌ๋ํธ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ด ํ๋ฉด๊ณผ ๊ฐ์ด ์๋ฌด๋ฐ ๋ด์ฉ๋ ๋์ค์ง ์์
- name๊ณผ comment์ ๊ฐ์ด ์ ์๋์ง ์์์ undefined์ด๋ผ ์๋ฌด๊ฒ๋ ๋์ค์ง ์์
- comment list ์ปดํฌ๋ํธ์์ ํ๋ฉด์ ํ์๋ ๋ถ๋ถ์ฒ๋ผ props๋ฅผ ์ถ๊ฐ
- ์์ ํ๋ฉด ์ปค๋ฉํธ ์ปดํฌ๋ํธ์ ํ๋์ค๋ก ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅํ ๋ค์๊ณผ ์ปค๋ฉํธ ๊ฐ์ด ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ๋ด์ฉ์ด ์ ์์ ์ผ๋ก ํ์
- ๋๊ธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ๊ฐ์ฒด๋ก ๋ถ๋ฆฌํด์ ๋์ ์ผ๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝ
- JavaScript ๋ฐฐ์ด์ map ํจ์๋ฅผ ์จ์ ๊ฐ ๋๊ธ ๊ฐ์ฒด์ ๋ํด์ comment ์ปดํฌ๋ํธ๋ฅผ returnํ๋๋ก ์ฝ๋๋ฅผ ์์ฑ
๊ณต๋ถํ ์๋ฃ
https://www.inflearn.com/course/%EC%B2%98%EC%9D%8C-%EB%A7%8C%EB%82%9C-%EB%A6%AC%EC%95%A1%ED%8A% B8/dashboard
[์ง๊ธ ๋ฌด๋ฃ] ์ฒ์ ๋ง๋ ๋ฆฌ์กํธ(React) ๊ฐ์ | Inje Lee (์ํ) - ์ธํ๋ฐ
Inje Lee (์ํ) | ์๋ฐ์คํฌ๋ฆฝํธ์ CSS ๊ธฐ์ด ๋ฌธ๋ฒ๊ณผ ํจ๊ป ๋ฆฌ์กํธ์ ๊ธฐ์ด๋ฅผ ํํํ๊ฒ ๋ค์ง ์ ์์ต๋๋ค., ๊น๋ํ ๊ฐ์์๋ฃ, ๊ผผ๊ผผํ ์ค๋ช ์ผ๋ก์ฝ๊ฒ ๋ฐฐ์ฐ๋ ๋ฆฌ์กํธ ๊ฐ์์ ๋๋ค. ๐จ๐ซ ๋ฆฌ์กํธ์ ์ธ๊ณ๋ก
www.inflearn.com
'Front > React.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์กํธ Hooks (0) | 2025.01.08 |
---|---|
[React] ๋ฆฌ์กํธ Hook (ํ ) (2) | 2024.08.28 |
[React] ๋ฆฌ์กํธ ๋ฒ์ 18 (0) | 2024.08.25 |
[React] ๋ฆฌ์กํธ styled-components๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ์คํ์ผ๋ง (0) | 2024.08.20 |
[React] ๋ฆฌ์กํธ styled-components (0) | 2024.08.20 |