2017-02-11 1 views
2

의 구성 요소를 여러 개 관리하고 일부 소품을 부착하는 React 구성 요소가 있습니다. 는 지금까지,이React : React 구성 요소에만 소품을 추가하고 (React.Children.map 재귀 적으로)

<Form> 
    <FieldText/> 
    <FieldDropdown /> 
</Form> 

처럼 단순한 양식을 작성하지만 지금, 나는이에 Field에 소품을 추가 간단한 양식은이

<Form> 
    <div> 
     <a data-tab="first">First Tab</a> 
     <a data-tab="second">Second Tab</a> 
    </div> 

    <div data-tab="first"> 
     <FieldText /> 
    </div> 

    <div data-tab="second"> 
     <FieldText /> 
    </div> 
</Form> 

같은 더 복잡한 구조의 형태가 필요합니다 방법

var Form = React.createClass({ 

    render: function(){ 
     <form onSubmit={this.submit} acceptCharset="UTF-8" ref={cForm.id}> 
      { 
       React.Children.map(this.props.children, child => { 

        // if type is funtion the is a react component 
        if(typeof child.type === "function"){ 

         return React.cloneElement(child, { 
          attachToForm: this.attachToForm, 
          disabled: this.props.disabled 
         }); 

        } else { 

         return child; 
        } 

       }) 

      } 
     </form> 
    } 

}); 
난 단지 Field의 구성 요소에 몇 가지 소품을 추가 Form을 수정하는 방법

하지 html 태그? 등 "범위", "DIV"

로 문자열을

답변

1

각각의 하위 구성 요소는 type 필드가 있어야 정상 HTML 요소에 대해,이 것 할 수 있습니다 단순히 switch (또는 선택의 조건) 그 분야에 대한

codepen와
const Foo = (props) => (
    <div style={props.style}>FOO</div> 
); 

class App extends React.Component { 
    render() {   
    return (
     <div> 
     { React.Children.map(this.props.children, child => { 

      if(typeof child.type === 'string') { 
       switch(child.type) { 
       case 'span': 
        return React.cloneElement(child, { style: { background: 'pink' }}); 
       case 'div': 
        return React.cloneElement(child, { style: { background: 'red' }}); 
       } 
      } else { 
       switch(child.type.name) { 
       case 'Foo': 
        return React.cloneElement(child, { style: { background: 'blue' }}); 
       } 
      } 
      return child; 
     })} 
     </div> 
    ); 
    } 
} 

ReactDOM.render(
    <App> 
    <span>span</span> 
    <p>p</p> 
    <Foo /> 
    <div>div</div> 
    </App>, 
    document.getElementById('root') 
); 

: 의견을 바탕으로

http://codepen.io/cjke/pen/qRQvmY?editors=0010

편집 , 문제는 반복적으로 DOM 트리를 걸어에 대한 자세한입니다 -

간단한 추상화 된 버전은 같은 것 이 질문의 단순한 사본 : React.Children.map recursively?

+0

사실, 아이가 기능인지 아닌지를 결정하기 위해 'child.type'을 사용했습니다. html 태그를 내부 양식에 추가하는 재귀 메서드를 만드는 방법을 알아낼 수없고 필드가 다른 html 태그 안에있는 경우에만 새 소품을 추가 할 수 있습니다. – Webman

+0

"알았 으면"다음을 다시 고려해야합니다. 귀하의 질문에 대한 말씨 - 마지막 줄은 어떻게 구성 요소와 html 요소의 차이점을 말할 수 있는지 묻습니다. 그것은 재귀 적으로 DOM 트리를 걷는 것에 대해서는 아무 것도 말하지 않습니다. – Chris

+0

미안하지만 내 영어가 나쁘기 때문에 나 자신을 설명하기가 더 어렵습니다. 예를 들어, 마지막 div 안에 'Foo'를 넣으면 'Foo'가 빨간색이되고 파란색이 아닙니다. 이것은 내 이슈입니다 – Webman

관련 문제