2017-03-16 7 views
1

JSON 요소를 기반으로 양식 요소를 생성하는 양식 작성기가 있습니다. 이 프로세스에서는 열린 요소를 추가하기 때문에 JSX는 오류를 발생시킵니다. 가장 좋은 방법은 무엇입니까?ReactJS 변수에 푸는 닫지 않은 요소

샘플 JSON :

[ 
    { 
     "name": "1900", 
     "label": "Year 1900" 
    }, 
    { 
     "name": "", 
     "label": "Group 2000", 
     "type": "groupstart" 
    }, 
    { 
     "name": "2000", 
     "label": "Year 2000", 
     "select": true 
    }, 
    { 
     "name": "2001", 
     "label": "Year 2002" 
    }, 
    { 
     "name": "2002", 
     "label": "Year 2002" 
    }, 
    { 
     "name": "", 
     "label": "", 
     "type": "groupend" 
    }, 
    { 
     "name": "2100", 
     "label": "Year 2100" 
    } 
] 

예상 출력

<select> 
    <option value="1900">Year 1900</option> 
    <optgroup label="Group 2000"> 
     <option value="2000" selected>Year 2000</option> 
     <option value="2001">Year 2001</option> 
    </optgroup> 
    <option value="2100">Year 2100</option> 
</select> 

내가 지금까지 가지고있는 코드 :

let fieldOptions = [] 
    field.options.selectOptions.map(function(entry){ 
     if (entry.type === 'groupstart') { 
     fieldOptions.push(<optgroup label={entry.label}>) 
     } else if (entry.type === 'groupend') { 
     fieldOptions.push('</optgroup>'); 
     } else { 
     fieldOptions.push(<option value={entry.name}>{entry.label}</option>)   
     } 
    }); 
    results.push(
     <select 
     name={field.name} 
     ref={field.name} 
     key={field.id} 
     onChange={(e) => {field.onChange(e, field.entryType); }} 
     onFocus={() => { focusFunction(field); }} 
     value={field.value}> 
      { fieldOptions } 
     </select> 
    ); 

답변

1

React (JSX)에서는 불가능합니다.

let fieldOptions = []; 
let group; 

for (let index = 0; index < field.options.selectOptions.length; index++) { 
    let entry = field.options.selectOptions[index]; 

    if (!entry.type) { 
     let option = <option value={ entry.name }>{ entry.label }</option>; 
     if (group) group.push(option); 
     else fieldOptions.push(option); 
    } else if (entry.type === 'groupstart') { 
     group = []; 
     group.push(<option value={ entry.name }>{ entry.label }</option>); 
    } else if (entry.type === 'groupend') { 
     const groupStart = group[0]; 
     group.push(<option value={ entry.name }>{ entry.label }</option>); 
     fieldOptions.push(<optgroup label={ groupStart.label }>{ group }</optgroup>); 
     group = null; 
    } 
} 

results.push(
    <select 
     name={ field.name } 
     ref={ field.name } 
     key={ field.id } 
     onChange={ (e) => { field.onChange(e, field.entryType); } } 
     onFocus={() => { focusFunction(field); } } 
     value={ field.value }> 
     { fieldOptions } 
    </select> 
); 

JSON이 왜 평면입니까? 중첩 된 요소를 지원하도록 JSON 스키마를 수정해야합니다.

더 나은 스키마는`경우 (! entry.type)에서

[ 
    { 
     "name": "...", 
     "label": "..." 
    }, 
    { 
     "type": "group", 
     "label": "...", 
     "items": [ 
      { 
       "name": "...", 
       "label": "..." 
      } 
      ... 
     ] 
    } 
] 
+2

것 {', 거기 활성 그룹이며, 만약 그렇다면 있는지 확인하기 위해'group.length'을 확인되어서는 안된다 'group'에'fieldOptions'가 아닌'group'을 덧붙이시겠습니까? 또한'group = []'을 groupend 조건으로 이동하십시오. 그렇지 않으면 그룹 시작과 끝은 있지만 둘 사이의 그룹은 갖지 않습니다. – MrCode

+0

아 좋은 지적입니다 - 고마워요. –

+0

끝내 주셔서 감사합니다. 코드를 약간 수정했습니다. 그룹을 개체로 유지하려면 그룹을 닫을 때 optgroup 레이블이 없으므로 업데이트 된 스키마, 고맙습니다. 팀 메이트에게 전달 했으므로 적절하게 업데이트 할 것입니다. 업데이트 된 코드로 코드를 편집하고 답변을 수락합니다. –