[React Docs] 4. Components์ Props
๋ณธ ๊ฒ์๊ธ์ย ๋ฆฌ์กํธ ๊ณต์๋ฌธ์๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ด๋ค.
Components์ Props - ์ปดํฌ๋ํธ์ ์์ฑ
: ๊ฐ๋ ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ JavaScript ํจ์์ ์ ์ฌํ๋ค. โpropsโ๋ผ๊ณ ํ๋ ์์์ ์ ๋ ฅ์ ๋ฐ์ ํ, ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง๋ฅผ ๊ธฐ์ ํ๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ค.
ํจ์ ์ปดํฌ๋ํธ์ ํด๋์ค ์ปดํฌ๋ํธ
: ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ JavaScript ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
- ํจ์ํ ์ปดํฌ๋ํธ
1
2
3
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
: ์ด ํจ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ๋์ "props"
๊ฐ์ฒด ์ธ์๋ฅผ ๋ฐ์ ํ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ฏ๋ก ์ ํจํ React ์ปดํฌ๋ํธ์ด๋ค.
์ด๋ฌํ ์ปดํฌ๋ํธ๋ JavaScript ํจ์์ด๊ธฐ ๋๋ฌธ์ ๋ง ๊ทธ๋๋ก โํจ์ ์ปดํฌ๋ํธโ๋ผ๊ณ ํธ์นญํ๋ค.
- ํด๋์คํ ์ปดํฌ๋ํธ
1
2
3
4
5
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
- React์ ๊ด์ ์์ ๋ณผ ๋ ์ ๋ ๊ฐ์ง ์ ํ์ ์ปดํฌ๋ํธ๋ ๋์ผํ๋ค.
์ปดํฌ๋ํธ ๋ ๋๋ง
: React๋ ๊ธฐ์กด์ DOM ํ๊ทธ ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ก๋ ๋ํ๋ผ ์ ์๋ค.
- ๊ธฐ์กด DOM ํ๊ทธ
1
const element = <div />;
- ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ
1
const element = <Welcome name="Sara" />;
React๊ฐ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ก ์์ฑํ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด JSX ์ดํธ๋ฆฌ๋ทฐํธ(name=โSaraโ)
์ ์์์ ํด๋น ์ปดํฌ๋ํธ์ ๋จ์ผ ๊ฐ์ฒด๋ก ์ ๋ฌํ๊ฒ ๋๋๋ฐ, ์ด ๋ ์ ๋ฌ๋๋ ๊ฐ์ฒด๋ฅผ โpropsโ ๋ผ๊ณ ํ๋ค.
1
2
3
4
5
6
7
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
const root = ReactDOM.createRoot(document.getElementById("root"));
const element = <Welcome name="Sara" />;
root.render(element);
์ด ์์์์ ์ด๋ค ์ผ์ด ์ผ์ด๋ฌ๋์ง ์์ฝํ์๋ฉด
<Welcome name="Sara" />
ย ์๋ฆฌ๋จผํธ๋กยroot.render()
๋ฅผ ํธ์ถ- React๋ย
{name: 'Sara'}
๋ฅผยprops
๋ก ํ์ฌยWelcome
ย ์ปดํฌ๋ํธ๋ฅผ ํธ์ถ Welcome
ย ์ปดํฌ๋ํธ๋ย<h1>Hello, Sara</h1>
ย ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํ- React DOM์ย
<h1>Hello, Sara</h1>
ย ์๋ฆฌ๋จผํธ์ ์ผ์นํ๋๋ก DOM์ ์ ๋ฐ์ดํธ
๐จ ์ฃผ์ : ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ํญ์ ๋๋ฌธ์๋ก ์์ํ๋ค.
React๋ ์๋ฌธ์๋ก ์์ํ๋ ์ปดํฌ๋ํธ๋ฅผ DOMํ๊ทธ๋ก ์ธ์ํ๋ค. ์๋ฅผ ๋ค์ดย<div />
๋ HTMLdiv
ํ๊ทธ๋ฅผ ๋ํ๋ด์ง๋ง,ย<Welcome />
์ ์ปดํฌ๋ํธ๋ฅผ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋ฒ์ ์์ยWelcome
์ด ์ ์ ๋์ด์์ด์ผ ํ๋ค.
์ปดํฌ๋ํธ ํฉ์ฑ
: ์ปดํฌ๋ํธ๋ ์์ ์ ์ถ๋ ฅ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ์๋ฅผ ๋ค์ดย Welcome
์ ์ฌ๋ฌ ๋ฒ ๋ ๋๋งํ๋ย App
ย ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
function App() {
return (
<div>
<Welcome name="Sara" />
<Welcome name="Cahal" />
<Welcome name="Edite" />
</div>
);
}
์ผ๋ฐ์ ์ผ๋ก ์ React ์ฑ์ ์ต์์์ ๋จ์ผ App
์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ๊ธฐ์กด ์ฑ์ React๋ฅผ ํตํฉํ๋ ๊ฒฝ์ฐ์๋ Button
๊ณผ ๊ฐ์ ์์ ์ปดํฌ๋ํธ๋ถํฐ ์์ํด์ ๋ทฐ ๊ณ์ธต์ ์๋จ์ผ๋ก ์ฌ๋ผ๊ฐ๋ฉด์ ์ ์ง์ ์ผ๋ก ์์
ํด์ผ ํ ์ ์๋ค.
- ์์ ์์์์
Welcome
์ปดํฌ๋ํธ๊ฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ง ๋ค๋ฅธ์ฑ 3๊ฐ๊ฐ ๋ฐฐ์น๋์ด ์์์ ์ ์ ์๋ค. : ์ปดํฌ๋ํธ์ ์ถ์ํ - ๋
App
์ปดํฌ๋ํธ ์์Welcome
์ปดํฌ๋ํธ๊ฐ ๋ฐฐ์น๋ ๊ฒ๋ ํ์ธํ ์ ์๋ค. : ์ปดํฌ๋ํธ์ ํฉ์ฑ
์ปดํฌ๋ํธ ์ถ์ถ
: ์ปดํฌ๋ํธ๋ ์ฌ๋ฌ ๊ฐ์ ์์ ์ปดํฌ๋ํธ๋ก ๋๋ ์ ์๊ณ , ๊ฐ๋ฅํ ์์ ์ปดํฌ๋ํธ๋ก ๋๋๋ ๊ฒ์ด ๋ ํจ์จ์ ์ธ ์์ ์ ํ๋๋ฐ ๋์์ด ๋ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Comment(props) {
return (
<div className="Comment">
<div className="UserInfo">
<img
className="Avatar"
src={props.author.avatarUrl}
alt={props.author.name}
/>
<div className="UserInfo-name">{props.author.name}</div>
</div>
<div className="Comment-text">{props.text}</div>
<div className="Comment-date">{formatDate(props.date)}</div>
</div>
);
}
์ด ์ปดํฌ๋ํธ๋ย author
(๊ฐ์ฒด),ย text
(๋ฌธ์์ด) ๋ฐย date
(๋ ์ง)๋ฅผ props๋ก ๋ฐ๊ณ ์๋ค.ย Comment
์ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ง๋ง, ๊ตฌ์ฑ์์๋ค์ด ๋ชจ๋ ์ค์ฒฉ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ์ด ์ด๋ ต๊ณ , ๊ฐ ๊ตฌ์ฑ์์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ฌ์ฌ์ฉํ๊ธฐ๋ ํ๋ค๋ค๋ ๋จ์ ์ด ์๋ค.
๐ขํด๊ฒฐ:Comment
ย ์ปดํฌ๋ํธ์์ย Avatar
,ย UserInfo
์ ๊ฐ์ด ๋ช ๊ฐ์ง ์ปดํฌ๋ํธ๋ฅผ ์ถ์ถํ์ฌ ์๋ก์ด ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ก ๋ง๋ค๋ฉดย Comment
ย ์ปดํฌ๋ํธ๋ ๋ ๋จ์ํด์ง๊ณ ํจ์จ์ ์ธ ์ปดํฌ๋ํธ๊ฐ ๋ ์ ์๋ค.
1๏ธโฃ ๋จผ์ Avatar
๋ฅผ ์ถ์ถํ๋ค.
1
2
3
4
5
function Avatar(props) {
return (
<img className="Avatar" src={props.user.avatarUrl} alt={props.user.name} />
);
}
Avatar
ย ๋ ์์ ์ดยComment
ย ๋ด์์ ๋ ๋๋ง ๋๋ค๋ ๊ฒ์ ์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ props์ ์ด๋ฆ์ยauthor
์์ ๋์ฑ ์ผ๋ฐํ๋ยuser
๋ก ๋ณ๊ฒฝํ๋๋ฐ ์ด๋ ๊ฒ props์ ์ด๋ฆ์ ์ฌ์ฉ๋context
๊ฐ ์๋ ์ปดํฌ๋ํธ ์์ฒด์ ๊ด์ ์์ ์ง๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
function Comment(props) {
return (
<div className="Comment">
<div className="UserInfo">
<Avatar user={props.author} />
<div className="UserInfo-name">{props.author.name}</div>
</div>
<div className="Comment-text">{props.text}</div>
<div className="Comment-date">{formatDate(props.date)}</div>
</div>
);
}
- ๐จ๊ฒฐ๊ณผ: Commentย ๊ฐ ์ด์ง ๋จ์ํด์ก๋ค.
2๏ธโฃ Avatar
ย ์์ ์ฌ์ฉ์์ ์ด๋ฆ์ ๋ ๋๋งํ๋ย UserInfo
ย ์ปดํฌ๋ํธ๋ฅผ ์ถ์ถํ๋ค.
1
2
3
4
5
6
7
8
function UserInfo(props) {
return (
<div className="UserInfo">
<Avatar user={props.user} />
<div className="UserInfo-name">{props.user.name}</div>
</div>
);
}
1
2
3
4
5
6
7
8
9
function Comment(props) {
return (
<div className="Comment">
<UserInfo user={props.author} />
<div className="Comment-text">{props.text}</div>
<div className="Comment-date">{formatDate(props.date)}</div>
</div>
);
}
-
- ๐จ๊ฒฐ๊ณผ: Commentย ๊ฐ ๋์ฑ ๋จ์ํด์ก๋ค.
- ์ด๋ฐ ์์ผ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋๋ ๊ฒ์ ํฐ ๊ท๋ชจ์ ์ฑ์์ ์์
ํ ๋ ๋๊ฐ์ ๋ํ๋ธ๋ค. UI์ ์ผ๋ถ๊ฐ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ๋๊ฑฐ๋(
Button
,ยPanel
,ยAvatar
), UI์ ์ผ๋ถ๊ฐ ์์ฒด์ ์ผ๋ก ๋ณต์กํ(App
,ยFeedStory
,ยComment
) ๊ฒฝ์ฐ์๋ ๊ฐ๋ณ์ ์ธ ์ปดํฌ๋ํธ๋ก ๋ง๋๋ ๊ฒ์ด ์ข๋ค.
Props
- : ํจ์ ์ปดํฌ๋ํธ๋ ํด๋์ค ์ปดํฌ๋ํธ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์์ฒด props๋ฅผ ์์ ํด์๋ ์๋๋ค.
- React๋ ๋งค์ฐ ์ ์ฐํ์ง๋ง ํ ๊ฐ์ง ์๊ฒฉํ ๊ท์น์ด ์๋๋ฐ, ๋ฐ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ๋ ์์ ์ props๋ฅผ ๋ค๋ฃฐ ๋ ๋ฐ๋์ ์์ ํจ์ ์ฒ๋ผ ๋์ํด์ผ ํ๋ค.
- ์์ ํจ์ โญ : ์ ๋ ฅ๊ฐ์ ๋ฐ๊พธ๋ ค ํ์ง ์๊ณ ํญ์ ๋์ผํ ์ ๋ ฅ๊ฐ์ ๋ํด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
1
2
3
function sum(a, b) {
return a + b;
}
- ์์ ํจ์๊ฐ ์๋ โ: ์์ ์ ์ ๋ ฅ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ์์ ํจ์๊ฐ ์๋๋ค.
1
2
3
function withdraw(account, amount) {
account.total -= amount;
}
Leave a comment