π React μ λ¬Έ XIV - Composition Β· Specialization
π React μ
λ¬Έ XIV - Composition Β· Specialization
π
γμνμ μ²μ λ§λ 리μ‘νΈγ
λ₯Ό μ½κ³ μ 리ν κΈμ λλ€.
Composition
- μ¬λ¬ κ°μ
Component
λ₯Ό ν©μ³μ μλ‘μ΄Component
λ₯Ό λ§λλ κ²μ λ§νλ€. - κ°λ Ή
Component A
μComponent B
λ₯Ό μ¬μ©ν΄ νλμ νμ΄μ§λ₯Ό λ§λ€μλ€κ³ νλ©΄Composition
μ μ¬μ©νλ€κ³ λ³Ό μ μλ€. - μ¬λ¬ κ°μ
Component
λ₯Ό μ‘°ν©νλ λ°©λ²μ λνComposition
κΈ°λ²μ΄ μ‘΄μ¬νλ€.
Containment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 1. Parent
function FancyBorder(props) {
return (
<div className={'FancyBorder FancyBorder-' + props.color}>
{props.children}
</div>
);
}
// 2. Children
function WelcomeDialog(props) {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">
μ΄μμ€μΈμ
</h1>
<p className="Dialog-message">
μ°λ¦¬ μ¬μ΄νΈμ λ°©λ¬Ένμ κ²μ νμν©λλ€!
</p>
</FancyBorder>
);
}
- νμ
Component
λ₯Ό ν¬ν¨νλ ννμ ν©μ± λ°©λ²μ΄λ€. Sidebar
λDialog
μ κ°μ λ°μ€ ννμComponent
λ μμ μ νμComponent
λ₯Ό 미리 μ μ μλ€.- μ΄λ΄ λ
props
μ κΈ°λ³Έ λ΄μ₯λchildren
μμ±μ μ¬μ©νλContainment
κΈ°λ²μ μ¬μ©νλ©΄ λλ€.
Specialization
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 1. Parent
function Dialog(props) {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">
{props.title}
</h1>
<p className="Dialog-message">
{props.message}
</p>
</FancyBorder>
);
}
// 2. Children
function WelcomeDialog(props) {
return (
<Dialog
title="μ΄μμ€μΈμ"
message="μ°λ¦¬ μ¬μ΄νΈμ λ°©λ¬Ένμ κ²μ νμν©λλ€!"
/>
);
}
- λ²μ©μ μΈ κ°λ μ ꡬλ³μ΄ λλλ‘ κ΅¬μ²΄ννλ κ²μ μλ―Ένλ€.
- μΌλ°μ μΈ κ°μ²΄ μ§ν₯ μΈμ΄μμλ μμμ μ΄μ©νμ¬
Specialization
μ ꡬννμ§λ§React
μμλComposition
μ μ΄μ©νμ¬ κ΅¬ννλ€. - μκΈ° μ½λμ²λΌ
Specialization
μ λ²μ©μ μΌλ‘ μΈ μ μλComponent
λ₯Ό λ§λ€μ΄ λκ³ μ΄λ₯Ό νΉμν μμΌμComponent
λ₯Ό μ¬μ©νλComposition
λ°©μμ΄λ€.
Containment
+ Spectialization
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 1. Parent
function Dialog(props) {
return (
<FancyBorder color="blue">
<h1 className="Dialog-title">
{props.title}
</h1>
<p className="Dialog-message">
{props.message}
</p>
{props.children}
</FancyBorder>
);
}
// 2. Children
function SignUpDialog(props) {
const [nickname, setNickname] = useState('');
const handleChange = (event) => {
setNickname(event.target.value);
}
const handleSignUp = () => {
alert(`μ΄μμ€μΈμ, ${nickname}λ!`);
}
return (
<Dialog
title="νμ± νμ¬ νλ‘κ·Έλ¨"
message="λλ€μμ μ
λ ₯ν΄ μ£ΌμΈμ">
<input
value={nickname}
onChange={handleChange} />
<button onClick={handleSignUp}>
κ°μ
νκΈ°
</button>
</Dialog>
);
}
props.children
μContainment
μ ν΄λΉνκ³ ,props.title
,props.message
λSpacialization
μ ν΄λΉνλ€.
μμ
React
λ₯Ό κ°λ°νMeta
λ μμ κΈ°λ°μComponent
μμ± λ°©λ²μ μ°Ύμ§ λͺ»νλ€.- κ²°κ΅ λ³΅μ‘ν
Component
λ₯Ό μͺΌκ° μ¬λ¬ κ°μComponent
λ‘ λ§λ€κ³ , λ§λComponent
λ€μ μ‘°ν©νμ¬ μλ‘μ΄Component
λ₯Ό λ§λ€μλ κ²°λ‘ μ μλ ΄νλ€.
μ€μ΅
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Card.jsx
function Card(props) {
const { title, backgroundColor, children } = props;
return (
<div
style=>
{title && <h1>{title}</h1>}
{children}
</div>
);
}
export default Card;
// ProfileCard.jsx
function ProfileCard(props) {
return (
<Card title="Inje Lee" backgroundColor="#4ea04e">
<p>μλ
νμΈμ,</p>
<p>μ λ 리μ‘νΈλ₯Ό μ¬μ©ν΄μ κ°λ°νκ³ μμ΅λλ€.</p>
</Card>
);
}
export default ProfileCard;
Card
λ λ μ΄μμλ§ λ΄λΉνκ³ , μ€μ λ΄μ©μ μΈλΆμμ μ λ¬ λ°λλ€.
νκ³
React
μμ ν©μ±μ΄ μ΄λ»κ² νμ©λλμ§ μ²΄κ° ν μ μμλ€.
This post is licensed under CC BY 4.0 by the author.