React: "props.children"에 κ΄€ν•œ 질문

에 λ§Œλ“  2018λ…„ 05μ›” 26일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: facebook/react

κΈ°λŠ₯ 을 μš”μ²­ν•˜κ±°λ‚˜ 버그λ₯Όλ³΄κ³  ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?
κ·Έλƒ₯ 질문

props.children에 κ΄€ν•œ λͺ‡ 가지 질문

React.Children 의 곡식 React λ¬Έμ„œμ—μ„œ this.props.children λŠ” "뢈투λͺ… ν•œ 데이터 ꡬ쑰"λΌλŠ” 것을 읽을 수 μžˆμŠ΅λ‹ˆλ‹€.
이것이 μ •ν™•νžˆ 무엇을 μ˜λ―Έν•©λ‹ˆκΉŒ?

props.children 데이터 ꡬ쑰의 투λͺ…μ„±μ—λŠ” 일반적으둜 μ„Έ 가지 κ°€λŠ₯성이 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

사둀 1 : props.children 데이터 ꡬ쑰의 λͺ¨λ“  츑면이 개방적이고 잘 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

이것이 μ˜³λ‹€λ©΄ "뢈투λͺ… ν•œ 데이터 ꡬ쑰"λΌλŠ” μš©μ–΄λŠ” μ™„μ „νžˆ 잘λͺ»λœ κ²ƒμž…λ‹ˆλ‹€.
λ”°λΌμ„œ "Case 1"은 λΆ„λͺ…νžˆ 사싀이 μ•„λ‹™λ‹ˆλ‹€.

사둀 2 : 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"도 λΆ„λͺ…νžˆ 그렇지 μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€.

사둀 3 : props.children 데이터 ꡬ쑰의 일뢀 츑면이 개방적이고 잘 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

그러면 "Case 2"의 예 쀑 ν•˜λ‚˜ λ˜λŠ” λ‘˜ λ‹€κ°€ 유효 ν•  κ°€λŠ₯성이 μ—΄λ¦½λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 그것은 props.children 의 μ–΄λ–€ 츑면이 잘 μ •μ˜λ˜μ–΄ 있고 μ–΄λ–€ 츑면이 μ •λ§λ‘œ 뢈투λͺ…ν•œμ§€ μ •ν™•ν•œ 사양이 μžˆμ–΄μ•Όν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
React λ¬Έμ„œμ—μ„œ λ­”κ°€λ₯Ό 놓쳀을 μˆ˜λ„ μžˆμ§€λ§Œ μ‹€μ œλ‘œ μ •ν™•νžˆ μ§€μ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ μΆ”κ°€ 질문 :

일뢀 μžμ‹ (ν•˜λ‚˜ 이상)μ΄μžˆλŠ” 경우 props.children κ°€ μ •ν™•νžˆ 배열이 μ•„λ‹Œ μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ (예 : "Preact"μ—μ„œ μˆ˜ν–‰λ¨)? κ·Έλ ‡κ²Œν•˜λ©΄ 일이 훨씬 더 μ‰¬μ›Œ 지겠죠?

μ„€λͺ…에 λŒ€ν•΄ 미리 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

Question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

_ 뢈투λͺ… ν•œ 데이터 ꡬ쑰 _λŠ” children κ°€ λ°°μ—΄, 쑰각, 단일 μš”μ†Œ, β€‹β€‹λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ λ“± λ§Žμ€ ν•­λͺ©μ΄ 될 수 μžˆλ‹€λŠ” 사싀을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

_React.Children_μ—λŠ” λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ children _ 톡일 된 λ°©μ‹μœΌλ‘œ _ μž‘μ—… ν•  μˆ˜μžˆλŠ” λͺ‡ 가지 λ©”μ„œλ“œκ°€ ν¬ν•¨λ˜μ–΄ 있으며, 이것이 κ·Έλ“€κ³Ό μƒν˜Έ μž‘μš©ν•˜λŠ” μœ μΌν•œ 방법은 μ•„λ‹™λ‹ˆλ‹€.

일뢀 μžμ‹ (ν•˜λ‚˜ 이상)μ΄μžˆλŠ” κ²½μš°μ— props.children이 μ •ν™•νžˆ 배열이 μ•„λ‹Œ μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ (예λ₯Ό λ“€μ–΄ "Preact"μ—μ„œ μˆ˜ν–‰λ¨)?

JSX에 속기가 μžˆλ‹€λŠ” 사싀 외에 children λŠ” λ‹€λ₯Έ 속성과 κ°™μŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ λ‹€μŒκ³Ό 같이 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

<Component children={...}/>

Reactκ°€ DOM을 μ—…λ°μ΄νŠΈν•΄μ•Ό ν•  λ•Œ 두 개의 단일 ν•­λͺ© 배열이 λ™μΌν•œ 지 μ—¬λΆ€λ₯Ό 두 개의 κΈ°λ³Έ κ°’ (예 : λ¬Έμžμ—΄)이 λ™μΌν•œ 지 μ—¬λΆ€λ₯Ό μ•Œλ €μ£ΌλŠ” 것이 훨씬 더 λΉ„μŒ‰λ‹ˆλ‹€.

즉, React.Children λ¬Έμ„œκ°€ μ•½κ°„ ν™•μž₯ 될 수 μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ reactjs / reactjs.org μ €μž₯μ†Œμ— κΈ°λ‘ν•˜λŠ” 것이 λ¬Έμ œμž…λ‹ˆλ‹€.

이 기사 λŠ” 일을 μ•½κ°„ λͺ…ν™•νžˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  6 λŒ“κΈ€

_ 뢈투λͺ… ν•œ 데이터 ꡬ쑰 _λŠ” 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 λ‹΅λ³€ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰