κΈ°λ₯ μ μμ²νκ±°λ λ²κ·Έλ₯Όλ³΄κ³ νμκ² μ΅λκΉ?
κ·Έλ₯ μ§λ¬Έ
React.Children μ 곡μ React λ¬Έμμμ this.props.children
λ "λΆν¬λͺ
ν λ°μ΄ν° ꡬ쑰"λΌλ κ²μ μ½μ μ μμ΅λλ€.
μ΄κ²μ΄ μ νν 무μμ μλ―Έν©λκΉ?
props.children
λ°μ΄ν° ꡬ쑰μ ν¬λͺ
μ±μλ μΌλ°μ μΌλ‘ μΈ κ°μ§ κ°λ₯μ±μ΄ μλ€κ³ μκ°ν©λλ€.
props.children
λ°μ΄ν° ꡬ쑰μ λͺ¨λ μΈ‘λ©΄μ΄ κ°λ°©μ μ΄κ³ μ μ μλμ΄ μμ΅λλ€.μ΄κ²μ΄ μ³λ€λ©΄ "λΆν¬λͺ
ν λ°μ΄ν° ꡬ쑰"λΌλ μ©μ΄λ μμ ν μλͺ»λ κ²μ
λλ€.
λ°λΌμ "Case 1"μ λΆλͺ
ν μ¬μ€μ΄ μλλλ€.
props.children
λ°μ΄ν° ꡬ쑰μ μΈ‘λ©΄μ΄ μ΄λ € μκ±°λ λͺ
ννμ§ μμ΅λλ€.μ¦, μ¬μ©ν λλ§λ€ κ²μ μλ―Έ props.children
λΉμ μ νμμ ν¨κ» μ¬μ©ν νμκ° React.Children
λ‘ React.Children
μ μΌ (μ λ§ λ¨ νλ, mmmh?) props.children
μ μ€μ λ°μ΄ν° ꡬ쑰λ₯Ό μλ μ¬λ.
κ·Έλ¬λ κ·Έκ²μ μ¬μ©μ΄ νμ©λμ§ μμμΌ ν¨μ μλ―Έν©λλ€.
javascript
// This is used almost everywhere (even in the official React documentation)
<div>{this.props.children}</div>
...λ μλλ€
javascript
// This is often seen with the "Function as child" pattern
MyComponent.propTypes = {
children: PropTypes.func.isRequired,
};
λ κ°μ§ μκ° λͺ¨λ λ§€μ° μΌλ°μ μ΄κΈ° λλ¬Έμ "Case 2"λ λΆλͺ ν κ·Έλ μ§ μμ κ² κ°μ΅λλ€.
props.children
λ°μ΄ν° ꡬ쑰μ μΌλΆ μΈ‘λ©΄μ΄ κ°λ°©μ μ΄κ³ μ μ μλμ΄ μμ΅λλ€.κ·Έλ¬λ©΄ "Case 2"μ μ μ€ νλ λλ λ λ€κ° μ ν¨ ν κ°λ₯μ±μ΄ μ΄λ¦½λλ€.
κ·Έλ¬λ κ·Έκ²μ props.children
μ μ΄λ€ μΈ‘λ©΄μ΄ μ μ μλμ΄ μκ³ μ΄λ€ μΈ‘λ©΄μ΄ μ λ§λ‘ λΆν¬λͺ
νμ§ μ νν μ¬μμ΄ μμ΄μΌνλ€λ κ²μ μλ―Έν©λλ€.
React λ¬Έμμμ λκ°λ₯Ό λμ³€μ μλ μμ§λ§ μ€μ λ‘ μ νν μ§μ λμ΄ μμ§ μλ€κ³ μκ°ν©λλ€.
μΌλΆ μμ (νλ μ΄μ)μ΄μλ κ²½μ° props.children
κ° μ νν λ°°μ΄μ΄ μλ μ΄μ λ 무μμ
λκΉ (μ : "Preact"μμ μνλ¨)? κ·Έλ κ²νλ©΄ μΌμ΄ ν¨μ¬ λ μ¬μ μ§κ² μ£ ?
μ€λͺ μ λν΄ λ―Έλ¦¬ κ°μ¬λ립λλ€.
_ λΆν¬λͺ
ν λ°μ΄ν° ꡬ쑰 _λ children
κ° λ°°μ΄, μ‘°κ°, λ¨μΌ μμ, ββλ¬Έμμ΄ λ¦¬ν°λ΄ λ± λ§μ νλͺ©μ΄ λ μ μλ€λ μ¬μ€μ λνλ
λλ€.
_React.Children_μλ λ€μν μ’
λ₯μ children
_ ν΅μΌ λ λ°©μμΌλ‘ _ μμ
ν μμλ λͺ κ°μ§ λ©μλκ° ν¬ν¨λμ΄ μμΌλ©°, μ΄κ²μ΄ κ·Έλ€κ³Ό μνΈ μμ©νλ μ μΌν λ°©λ²μ μλλλ€.
μΌλΆ μμ (νλ μ΄μ)μ΄μλ κ²½μ°μ props.childrenμ΄ μ νν λ°°μ΄μ΄ μλ μ΄μ λ 무μμ λκΉ (μλ₯Ό λ€μ΄ "Preact"μμ μνλ¨)?
JSXμ μκΈ°κ° μλ€λ μ¬μ€ μΈμ children
λ λ€λ₯Έ μμ±κ³Ό κ°μ΅λλ€. μ€μ λ‘ λ€μκ³Ό κ°μ΄ μ§μ ν μ μμ΅λλ€.
<Component children={...}/>
Reactκ° DOMμ μ λ°μ΄νΈν΄μΌ ν λ λ κ°μ λ¨μΌ νλͺ© λ°°μ΄μ΄ λμΌν μ§ μ¬λΆλ₯Ό λ κ°μ κΈ°λ³Έ κ° (μ : λ¬Έμμ΄)μ΄ λμΌν μ§ μ¬λΆλ₯Ό μλ €μ£Όλ κ²μ΄ ν¨μ¬ λ λΉμλλ€.
μ¦, React.Children λ¬Έμκ° μ½κ° νμ₯ λ μ μλ€κ³ μκ°νμ§λ§ reactjs / reactjs.org μ μ₯μμ κΈ°λ‘νλ κ²μ΄ λ¬Έμ μ λλ€.
μ΄ κΈ°μ¬ λ μΌμ μ½κ° λͺ νν ν μ μμ΅λλ€.
κ·νμ λ΅λ³κ³Ό μ€λͺ
μ λν΄ @danburzo μκ² κ°μ¬λ립λλ€.
κ·νμ λ΅λ³ ν, μ κ° "λΆν¬λͺ
"μ΄λΌλ λ¨μ΄λ₯Ό μμ ν μ€ν΄ ν κ²μ΄ λΆλͺ
ν©λλ€.
React λ¬Έμλ props.children
μ λ°μ΄ν° κ΅¬μ‘°κ° μμ ν μ μ μ λ 곡μ©μ²΄ μ νμ΄λ©° ꡬ체μ μΈ ννμ΄ λ€μνλ€κ³ λ§νκ³ μΆμμ΅λλ€ (μ λμ¨ μ νμ νμ κ·Έλ λ―μ΄).
λκ°μ μ£Όμ λ₯Ό λ€λ£¬ μ€λλ λ¬Έμ λ₯Ό λ°©κΈ μ°Ύμμ΅λλ€. λ³κ²½ μ¬νμ΄ μ΄λ»κ²λμλμ§ κΆκΈνμλκΉ?!? (λλ reactjs.org => reactjs / reactjs.org # 914μμ λ¬Έμ λ₯Ό μ΄μμ΅λλ€) :
https://github.com/facebook/react/pull/6018/files/91223423410f107ff83a8a6ce3158c488247292f?short_path=ef51787#diff -ef51787305cfed62f6f564284762d4de
κ·ΈλΌμλ λΆκ΅¬νκ³ λ λ²μ§Έ μ§λ¬Έμ λ€μνκ³ μΆμ΅λλ€.
μ νν νλμ μμμ΄μλ κ²½μ° "props.children"μ΄ λ°°μ΄μ΄ μλ μ΄μ λ 무μμ
λκΉ? λλ μΌλ°μ μΌλ‘ 컬λ μ
μ κΈ°λνλ "ν ν°")?
μ λ§ μ±λ₯μμ μ΄μ μ
λκΉ? μλμ "checkResult"κ³μ°μ μκ°μ΄ λ§μ΄ 걸리λ κ²μ μ μ μμ΅λλ€.
const
child1 = ...,
child2 = ...,
child1IsArray = Array.isArray(child1),
child2IsArray = Array.isArray(child2),
checkResult = child1IsArray && child2IsArray
&& child1.length === 1 && child2.length === 1
&& child1[0] === child2[0];
λ€μ μμ²νλ κ²μ΄ μ½κ° μ§μ¦λλ κ²μ²λΌ 보μ΄λ©΄ μ£μ‘ν©λλ€.νμ§λ§ κ·Έ λμμΈ κ²°μ μ λν μ νν μ΄μ λ₯Ό μκ³ μΆμ΅λλ€ ....
μ§λ¬Έμ 첫 λΆλΆμ λμ λ릴 μμμ΄μ κΈ°μ©λλ€! λΆννλ λ¨μΌ μμμ΄ λ¨μΌ νλͺ© λ°°μ΄λ‘ νμλμ§ μλ μ΄μ μ λν΄μλ _exact_ λλ΅μ΄ μμ΅λλ€. κ·Έλ¬λ λλ λΉμ μ΄ (JSX μ기보λ€λ) μ μμ μΈ μνμΌλ‘ λ¨μΌ μμ΄λ₯Ό μ¬μ ν μ ν¨νκ² μ λ¬ν μ μλ€λ μ μ μ§μ νλ €κ³ λ Έλ ₯νκ³ μμλλ°, μ΄λ λ΄κ° μ€μλ‘ μ±λ₯κ³Ό κ΄λ ¨μ΄ μλ€λ λ΄ κ°μ€μ λͺ¨νΈνκ² λ§λ€μλ€λ μ¬μ€μ λλ€.
@danburzo κ·νμ λ΅λ³μ λ€μ ν λ² κ°μ¬λ립λλ€.
μ, μμ§ν React νμ λκ΅°κ°κ° κ·Έ λμμΈ κ²°μ μ μ€μ μ΄μ λ₯Ό κΈ°μ΅νκΈ°λ₯Ό λ°λμ΅λλ€.
Reactμμ children prop μ²λ¦¬μ κ΄λ ¨λ λ―Έλ¬ν λ¬Έμ κ° μκΈ° λλ¬Έμ
λλ€.
μλ₯Ό λ€μ΄ React μ΄λ³΄μμκ² λ€μ μμ μ Test1 λ° Test2 κ΅¬μ± μμκ° λμΌνκ² μλνλμ§ λ¬Όμ΄ λ΄
λλ€ (React proλ‘μ μ¬μ©μλ λλ΅μ΄ "no"μμ μκ³ μμ΅λλ€. => Test2λ DEVμ λλ½ λ ν€μ λν΄ κ²½κ³ νκ³ Test1μ μλλλ€-κ·Έλ¬λ μ΄κ²μ΄ λΉμ μ΄ μ΄λ³΄μλΌλ©΄ κΈ°λν μμλ κ²μ
λκΉ?!?)
const
h = React.createElement,
Test1 = () => h('div', null, h('br'), h('br')),
Test2 = () => h('div', { children: [h('br'), h('br')] });
ReactDOM.render(
h('div', null, h(Test1), h(Test2)),
document.getElementById('container')
);
그건 κ·Έλ κ³ : Test2κ° νμ©λλ€λ©΄, μλ₯Ό λ€μ΄ νμ΄νΌ μ€ν¬λ¦½νΈ κΈ°λ₯κ³Ό κ°μ createElement
λ체λ₯Ό ꡬννλ κ²½μ° μ½κ°μ μ±λ₯ μ΄μ μ΄ μμ΅λλ€.
λ λ€λ₯Έ μ : λͺ¨λ μ΄λ¦°μ΄κ° νΉμ 쑰건μ μΆ©μ‘±ν΄μΌνλ κ²½μ° "children : PropTypes ...."κ° μ΄λ»κ² μκ²Όλμ§ React μ΄λ³΄μμκ² λ¬Όμ΄λ³΄μμμ€. (μ μ΄λ μ΄λ³΄μμκ²λ) λλ΅νκΈ° μ½μ§ μμ κ²μ΄λΌκ³ μκ°ν©λλ€.
React νμκ² : λ¬Έμ μ λμμΈ κ²°μ μ λν μ΄μ κ° μ€μ λ‘ μλ €μ§μ§ μμκ±°λ λ¨μν μ·¨ν₯μ λ¬Έμ μλ€λ©΄ λ¬Όλ‘ μ΄ λ¬Έμ λ₯Ό μ’ κ²°ν΄λλ©λλ€.
λΆνμν λ°°μ΄ ν λΉμ νΌνκΈ° μν΄ λ¨μΌ μμμ λν΄ λ°°μ΄μ μ¬μ©νμ§ μκΈ°λ‘ κ²°μ νλ€κ³ κ°μ ν©λλ€.
Reactμμ children prop μ²λ¦¬μ κ΄λ ¨λ λ―Έλ¬ν λ¬Έμ κ° μκΈ° λλ¬Έμ λλ€.
μΌλ°μ μΌλ‘ λͺ
μμ μΈ children
μνμ μ¬μ©νμ§ μλ κ²μ΄ μ’μ΅λλ€. λλΆλΆμ μ¬μ©μλ React.createElement
λ₯Ό μ§μ νΈμΆνλ λμ JSXλ μ¬μ©νλ―λ‘ μΈκΈ ν λ¬Έμ λ μΌλ°μ μΌλ‘ λ¬Έμ κ°λμ§ μμ΅λλ€.
@aweary λ΅λ³ μ£Όμ μ κ°μ¬ν©λλ€
κ°μ₯ μ μ©ν λκΈ
_ λΆν¬λͺ ν λ°μ΄ν° ꡬ쑰 _λ
children
κ° λ°°μ΄, μ‘°κ°, λ¨μΌ μμ, ββλ¬Έμμ΄ λ¦¬ν°λ΄ λ± λ§μ νλͺ©μ΄ λ μ μλ€λ μ¬μ€μ λνλ λλ€._React.Children_μλ λ€μν μ’ λ₯μ
children
_ ν΅μΌ λ λ°©μμΌλ‘ _ μμ ν μμλ λͺ κ°μ§ λ©μλκ° ν¬ν¨λμ΄ μμΌλ©°, μ΄κ²μ΄ κ·Έλ€κ³Ό μνΈ μμ©νλ μ μΌν λ°©λ²μ μλλλ€.JSXμ μκΈ°κ° μλ€λ μ¬μ€ μΈμ
children
λ λ€λ₯Έ μμ±κ³Ό κ°μ΅λλ€. μ€μ λ‘ λ€μκ³Ό κ°μ΄ μ§μ ν μ μμ΅λλ€.Reactκ° DOMμ μ λ°μ΄νΈν΄μΌ ν λ λ κ°μ λ¨μΌ νλͺ© λ°°μ΄μ΄ λμΌν μ§ μ¬λΆλ₯Ό λ κ°μ κΈ°λ³Έ κ° (μ : λ¬Έμμ΄)μ΄ λμΌν μ§ μ¬λΆλ₯Ό μλ €μ£Όλ κ²μ΄ ν¨μ¬ λ λΉμλλ€.
μ¦, React.Children λ¬Έμκ° μ½κ° νμ₯ λ μ μλ€κ³ μκ°νμ§λ§ reactjs / reactjs.org μ μ₯μμ κΈ°λ‘νλ κ²μ΄ λ¬Έμ μ λλ€.
μ΄ κΈ°μ¬ λ μΌμ μ½κ° λͺ νν ν μ μμ΅λλ€.