<star />
리μ‘νΈμ ν©μ±κ³Ό μμ λ³Έλ¬Έ
리μ‘νΈμ ν©μ±μ μ¬λ¬ κ°μ μ»΄ν¬λνΈλ₯Ό ν©μ³μ μλ‘μ΄ μ»΄ν¬λνΈλ₯Ό λ§λλ κ²μ μλ―Έν¨.
ν©μ±μ΄λΌκ³ ν΄μ 무μμ κ·Έλ₯ μ»΄ν¬λνΈλ€μ λΆμ΄λ κ²μ΄ μλλΌ, μ¬λ¬ κ°μ μ»΄ν¬λνΈλ₯Ό μ΄λ»κ² μ‘°ν©ν κ²μΈκ°μ λν κ³ λ―Όμ΄ νμν¨.
1) Containment
νμ μ»΄ν¬λνΈλ₯Ό ν¬ν¨νλ ννμ ν©μ± λ°©λ².
리μ‘νΈ μ»΄ν¬λνΈμ props μ κΈ°λ³Έμ μΌλ‘ λ€μ΄ μλ children μμ±μ μ¬μ©νλ©΄ λ¨.
function FancyBorder (props) {
return (
<div className={'FancyBorder FancyBorder-' + props.color}>
{props.children}
</div>
)
}
μ μ½λμμ FancyBorder λΌλ μ»΄ν¬λνΈμ props.children μ μ¬μ©νλ©΄ ν΄λΉ μ»΄ν¬λνΈμ νμ μ»΄ν¬λνΈκ° λͺ¨λ children μΌλ‘ λ€μ΄μ€κ² λ¨.
children μ΄λΌλ prop μ κ°λ°μκ° μ§μ λ£λ κ² μλλΌ λ¦¬μ‘νΈμμ κΈ°λ³Έμ μΌλ‘ μ κ³΅ν΄ μ£Όλ κ²μ.
리μ‘νΈμ createElement() ν¨μλ₯Ό μ΄ν΄λ³΄λ©΄...
React.createElement (
type,
[props],
[...children]
)
μ¬κΈ°μ μΈ λ²μ§Έμ λ€μ΄κ°λ νλΌλ―Έν°κ° λ°λ‘ children μ.
children μ΄ λ°°μ΄λ‘ λμ΄ μλ μ΄μ λ μ¬λ¬ κ°μ νμ μ»΄ν¬λνΈλ₯Ό κ°μ§ μ μκΈ° λλ¬Έμ.
κ²°κ³Όμ μΌλ‘ μ μ½λμ FancyBorder μ»΄ν¬λνΈλ μμ μ νμ μ»΄ν¬λνΈλ₯Ό λͺ¨λ ν¬ν¨νμ¬ μμ ν λλ¦¬λ‘ κ°μΈμ£Όλ μ»΄ν¬λνΈκ° λ¨.
function Welcome (props) {
return(
<FancyBorder color="pink">
<h1 className="Welcome-title">
μ΄μμ€μΈμ!
</h1>
<p className="Welcome-msg">
λ³κΉ
μ΄ λΈλ‘κ·Έμ μ€μ κ²μ νμν©λλ€!
</p>
</FancyBorder>
);
}
μ μ½λλ₯Ό 보면 Welcome μ»΄ν¬λνΈ μμ FancyBorder μ»΄ν¬λνΈλ₯Ό μ¬μ©νκ³ μμ.
FancyBodrder μ»΄ν¬λνΈλ‘ κ°μΈμ§ λΆλΆμλ <h1> νκ·Έμ <p> νκ·Έ μ΄λ κ² λ κ°μ νκ·Έκ° λ€μ΄κ° μμ΅λλ€.
μ΄ λ κ°μ νκ·Έλ λͺ¨λ FancyBorder μ»΄ν¬λνΈμ children μ΄λΌλ μ΄λ¦μ propsλ‘ μ λ¬λ¨.
κ²°κ³Όμ μΌλ‘ λΆνμ ν λλ¦¬λ‘ λͺ¨λ κ°μΈμ§λ κ²°κ³Όκ° λμ¬ κ²μ.
리μ‘νΈμμλ props.children μ ν΅ν΄ νμ μ»΄ν¬λνΈλ₯Ό νλλ‘ λͺ¨μμ μ κ³΅ν΄ μ€.
μ¬λ¬ κ°μ children μ§ν©μ΄ νμν κ²½μ°λ μ΄λ»κ² ν κΉ?
γ΄ λ³λλ‘ props λ₯Ό μ μν΄μ κ°κ° μνλ μ»΄ν¬λνΈλ₯Ό λ£μ΄ μ£Όλ©΄ λ¨.
function SplitPane (props) {
return(
<div className="SplitPane">
<div className="SplitPane-top">
{props.top}
</div>
<div className="SplitPane-btm">
{props.btm}
</div>
</div>
);
}
function App (props) {
return (
<SplitPane
top={
<Store />
}
btm={
<board />
}
/>
);
}
μμ μ½λλ νλ©΄μ μνλ¨μΌλ‘ λΆν ν΄μ λ³΄μ¬ μ£Όλ SplitPane μ΄λΌλ μ»΄ν¬λνΈκ° μμ.
κ·Έλ¦¬κ³ μλμͺ½μ λμ μλ App μ»΄ν¬λνΈμμλ μ΄ SplitPane μ»΄ν¬λνΈλ₯Ό μ¬μ©νκ³ μλλ°, topκ³Ό btm μ΄λΌλ λ κ°μ props λ₯Ό μ μνμ¬ κ·Έ μμ κ°κ° λ€λ₯Έ μ»΄ν¬λνΈλ₯Ό λ£μ΄ μ£Όκ³ μμ.
SplitSpane μμλ top, btm μ props λ‘ λ°κ² λκ³ , κ°κ° νλ©΄μ μλ¨κ³Ό νλ¨μ λΆλ¦¬ν΄μ λ λλ§ νκ² λ¨.
μ΄μ²λΌ μ¬λ¬ κ°μ children μ§ν©μ΄ νμν κ²½μ°μλ λ³λμ props λ₯Ό μ μν΄μ μ¬μ©νλ©΄ λ¨.
props.children μ΄λ μ§μ μ μν propsλ₯Ό μ΄μ©νμ¬ νμ μ»΄ν¬λνΈλ₯Ό ν¬ν¨νλ ννλ‘ ν©μ±νλ λ°©λ²μ
Containment λΌκ³ ν¨.
2) Specialization
λ²μ©μ μΈ κ°λ μ ꡬλ³λκ² κ΅¬μ²΄ννλ κ²μ λ§ν¨.
function Dialog (props) {
return (
<FancyBorder color="pink">
<h1 className="Diglog-title">
{props.title}
</h1>
<p className="Dialog-msg">
{props.msg}
</p>
</FancyBorder>
);
}
function WelcomeDialog (props) {
return (
<Diglog
title="μλνμΈμ"
msg="λ³κΉ
μ΄ λΈλ‘κ·Έμ μ€μ κ²μ νμν©λλ€~"
/>
);
}
Dialog λΌλ λ²μ©μ μΈ μ»΄ν¬λνΈμ μ΄κ²μ μ¬μ©νλ WelcomeDialog μ»΄ν¬λνΈκ° λμ΄.
Dialog μ»΄ν¬λνΈλ title, msg λΌλ λ κ°μ§ props λ₯Ό κ°μ§κ³ μμ.
μ΄ title κ³Ό msg λ₯Ό μ΄λ»κ² μ¬μ©νλλμ λ°λΌμ κ²½κ³ λ€μ΄μΌλ‘κ·Έκ° λ μλ μκ³ , μΈμ¬λ§ λ€μ΄μΌλ‘κ·Έκ° λ μλ μλ κ±°μ.
κ·Έλ¬λκΉ, λ²μ©μ μΌλ‘ μΈ μ μλ μ»΄ν¬λνΈλ₯Ό λ§λ€μ΄ λκ³ μ΄λ₯Ό νΉμν μμΌμ μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ ν©μ± λ°©μμ.
3) Containment μ Specialization μ κ°μ΄ μ¬μ©νκΈ°
λμ κ°μ΄ μ°λ €λ©΄ μΌλ¨...
Containment λ₯Ό μν΄ props.children μ μ¬μ©νκ³ ,
Specialization μ μν΄ μ§μ μ μν props λ₯Ό μ¬μ©νλ©΄ λ¨.
function Dialog (props) {
return (
<FancyBorder color="pink">
<h1>
{props.title}
</h1>
<p>
{props.msg}
</p>
{props.children}
</FancyBorder>
);
}
function SignUpDialog (props) {
const [nickname, setNickname] = useState("");
const handleChange = (event) => {
setNickname(event.target.value);
}
const handleSignUp = () => {
alret(`νμν΄μ, ${nickname}λ~!`);
}
return (
<Diglog
title="λ³κΉ
μ΄ λΈλ‘κ·Έ"
msg="λλ€μμ μ
λ ₯νμμ€"
>
<input
value={nickname}
onChange={handleChange}
/>
<button
onClick={handleSignUp}
>
μ
λ ₯νκΈ°
</button>
</Diglog>
);
}
μμ μ½λμμ Diglog μ»΄ν¬λνΈλ Containment λ₯Ό μν΄ λ λΆλΆμ props.children μ μΆκ°νμ.
μ΄λ₯Ό ν΅ν΄ νμ μ»΄ν¬λνΈκ° λ€μ΄μΌλ‘κ·Έ νλ¨μ λ λλ§ λ¨.
Diglog λ₯Ό μ¬μ©νλ SignUpDialog μ»΄ν¬λνΈλ Specialization μ μν΄ propsμΈ title κ³Ό msg μ κ°μ λ£μ΄ μ£Όκ³ μκ³ ,
μ¬μ©μλ‘λΆν° λλ€μμ μ λ ₯λ°κΈ° μν΄ <input> κ³Ό <button> νκ·Έκ° λ€μ΄ μμ.
μ΄ λ κ°μ νκ·Έλ λͺ¨λ props.children μΌλ‘ μ λ¬λμ΄ λ€μ΄μΌλ‘κ·Έμ νμλ¨!
μ΄λ¬ν ννλ‘ Containment μ Specialization μ λμμ μ¬μ©ν μ μμ.
κ° λ°©λ²μ λ°λ‘ μ¬μ©νκ±°λ, λλ λμμ ν¨κ» μ¬μ©νλ©΄ λ€μνκ³ λ³΅μ‘ν μ»΄ν¬λνΈλ₯Ό ν¨μ¨μ μΌλ‘ κ°λ°ν μ μμ.
4) μμ
ν©μ±κ³Ό λλΉλλ κ°λ μΌλ‘ μμ(Inheritance) μ΄ μμ.
μ»΄ν¨ν° νλ‘κ·Έλλ°μμμ μμμ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μμ λμ¨ κ°λ μ.
λΆλͺ¨ ν΄λμ€λ₯Ό μμλ°μμ, μλ‘μ΄ μμ ν΄λμ€λ₯Ό λ§λ λ€λ κ°λ μΌλ‘ μμ ν΄λμ€λ λΆλͺ¨ν΄λμ€κ° κ°μ§ λ³μλ ν¨μ λ±μ μμ±μ λͺ¨λ κ°κ² λ¨.
리μ‘νΈμμλ μμμ΄λΌλ λ°©λ²μ μ¬μ©νλ κ²λ³΄λ€λ μμμ λ°°μ΄ ν©μ±μ μ¬μ©ν΄μ κ°λ°νλ κ²μ΄ λ μ’μ λ°©λ²μ.
λ°λΌμ, 볡μ‘ν μ»΄ν¬λνΈλ₯Ό μͺΌκ°μ μ¬λ¬ κ°μ μ»΄ν¬λνΈλ‘ λ§λ€κ³ , λ§λ μ»΄ν¬λνΈλ€μ μ‘°ν©νμ¬ μλ‘μ΄ μ»΄ν¬λνΈλ₯Ό λ§λμ !
'React π' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Provider value μμ μ£Όμν΄μΌ ν μ¬ν (0) | 2022.12.05 |
---|---|
컨ν μ€νΈ (0) | 2022.12.04 |
State λμ΄μ¬λ¦¬κΈ° (0) | 2022.12.01 |
리μ‘νΈμ νΌ (0) | 2022.11.30 |
리μ€νΈμ ν€ (0) | 2022.11.29 |