2015-11-13 86 views
8

我一直試圖讓這個工作一段時間,不知道如何做到以下幾點。我的表單組件的子項包含常規的html標記以及輸入。如果孩子是輸入,我想添加attachToFormdetachFromForm函數。如果它不是輸入,我想繼續遍歷子元素以確保元素沒有子輸入字段。無論是否元素是一個輸入,我仍然希望它出現在我的頁面上,我只是想將這些函數添加到輸入中。穿越兒童的孩子,並增加功能的所有輸入,同時保持其他孩子不變

問題是我只能讓我的函數只返回輸入,刪除標籤和標題。我知道這是因爲我只添加元素與newChildren輸入,但如果我推其他元素在其他部分我得到重複,我可以想到另一種方式做到這一點。林不知道如果我不瞭解基本的JS或有大腦的差距。

React.Children.forEach(children, function(child) { 
     var current = child; 
     if (child.props && child.props.name) { 
      this.newChildren.push(React.cloneElement(child, { 
       detachFromForm: this.detachFromForm, 
       attachToForm: this.attachToForm, 
       key: child.props.name 
      })); 
     } else if (child.props && child.props.children){ 
      this.newChildren.push(child); 
      this.registerInputs(child.props.children); 
     } else { 
      *need to keep track of parent elements and elements that do not have inputs 
     } 
    }.bind(this)); 

編輯:不知道是否需要的,但是這是和示例形式的IM穿越

return ( 
      <Modal className="_common-edit-team-settings" title={`Edit ${this.props.team.name}`} isOpen={this.props.modalIsOpen && this.props.editTeamModal} onCancel={this.props.toggleEditTeamModal} backdropClosesModal> 

       <Form onSubmit={this.saveChanges}>  
        <FormSection className="edit-team-details" sectionHeader="Team Details"> 
         <FormField label="Name"> 
          <Input name="name" value={this.state.values.name} onChange={this.handleInputChange} type="text" placeholder={this.props.team.name}/> 
         </FormField> 
         <FormField label="Mission"> 
          <Input name="mission" value={this.state.values.mission} onChange={this.handleInputChange} type="text" placeholder={this.props.team.kitMission || 'Kit Mission'} multiline /> 
         </FormField> 
        </FormSection> 

        <FormSection className="privacy-settings" sectionHeader="Privacy Settings"> 
         <FormField label="Included in global search results" > 
          <SlideToggle name="globalSearch" defaultChecked={this.state.values.globalSearch} onChange={this.handleCheckedChange} type="checkbox" /> 
         </FormField> 
         <FormField label="Accessible by anyone" > 
          <SlideToggle name="public" defaultChecked={this.state.values.public} onChange={this.handleCheckedChange} type="checkbox" /> 
         </FormField> 
         <FormField label="Secured with WitCrypt" > 
          <SlideToggle name="witcryptSecured" defaultChecked={this.state.values.witcryptSecured} onChange={this.handleCheckedChange} type="checkbox" /> 
         </FormField> 
        </FormSection> 
        <FormSection sectionHeader="Participants"> 
         {participantsList} 
         <div id="add-participant" className="participant" onClick={this.toggleAddParticipantModal}> 
          <span className="participant-avatar" style={{backgroundImage:'url(/img/blue_add.svg)'}}></span> 
          <span>Add a Participant</span> 
          <span className="add-action roll"><a></a></span> 
         </div> 
        </FormSection> 
        <Button type="hollow-primary" size="md" className="single-modal-btn" block submit>Save</Button> 
       </Form> 


       <AddParticipant people={this.props.people} toggleAddParticipantModal={this.props.toggleAddParticipantModal} modalIsOpen={this.props.modalIsOpen} toggleAddParticipantModal={this.toggleAddParticipantModal} addParticipantModal={this.state.addParticipantModal} /> 
      </Modal> 
     ); 

順便說一句,我開始了一個簡單了很多想要做以下,但得到:

「無法添加屬性attachToForm,對象不可擴展」

如果有人知道爲什麼請讓我知道。

registerInputs: function (children) { 

    React.Children.forEach(children, function (child) { 

     if (child.props.name) { 

     child.props.attachToForm = this.attachToForm; 
     child.props.detachFromForm = this.detachFromForm; 
     } 

     if (child.props.children) { 
     this.registerInputs(child.props.children); 
     } 
    }.bind(this)); 
    } 

回答

1

判斷錯誤消息時,您遇到了不可變的prop對象的問題。起價陣營0.14 prop被「凍結」:現在

props對象是凍結的,創建一個組件元素不再支持經過這麼變異道具。在大多數情況下,應該使用React.cloneElement。此更改使您的組件更容易推理,並啓用上述編譯器優化。

Blog post on this

因此,在你的代碼放到你嘗試擴展prop對象導致錯誤。

您可以將proptry..catch構建的不同部分包裝起來,這將會指向您確切的問題所在。