2017-08-04 64 views
1

我有問題在組件渲染功能它導入子組件時生成包裝div。React js避免包裝div

父組件渲染功能:

render(){ 

     return(
      <Card style={styles.cardStyle}> 
      {this.getTitle(this.props.name, this.props.constraint)} 
      <CardText> 
      <Grid fluid={true}> 
       <Row> 
        <Fields key={0} obj={this.props.fields[0]} value={""} error={""} handler={this.props.handler}></Fields> 
       </Row> 
      </Grid> 
      </CardText> 
      </Card> 
     ) 
    } 

子組件功能:

renderFields = (obj) =>{ 
    let des = translate(obj.description); 
    let mandatory = (obj.required == true) ? " *" : "" 
    let description = des + mandatory; 
    if(obj.variable){ 
     switch(obj.dataType){ 
     case "string": 
      return ([ 
      <Col xs={12} md={3}> 
       <TextField fullWidth={true} ref={obj.code} floatingLabelText={description} value={this.props.value} onChange={(e,newValue) => this.props.handler(newValue, obj.code, obj.required, '')} errorText={this.props.error ? this.props.error : ""}/> 
      </Col>] 
     ); 
     case "integer": 
      return (
      <Col xs={12} md={3}> 
       <TextField fullWidth={true} ref={obj.code} floatingLabelText={description} value={this.props.value} onChange={(e,newValue) => this.props.handler(newValue, obj.code, obj.required, /^[+-]?\d+$/)} errorText={this.props.error ? this.props.error : ""} /> 
      </Col> 
     ); 
     case "double": 
      return (
      <Col xs={12} md={3}> 
       <TextField fullWidth={true} ref={obj.code} floatingLabelText={description} value={this.props.value} onChange={(e,newValue) => this.props.handler(newValue, obj.code, obj.required, /^[+-]?\d+(\.\d+)?$/)} errorText={this.props.error ? this.props.error : ""}/> 
      </Col> 
     ); 
     } 
    } 
} 

render(){ 
    return (
     <div> 
     {this.renderFields(this.props.obj)} 
     </div> 
    ); 
    } 

我使用的反應引導框架網格。我嘗試了很多解決方案,但不幸的是沒有爲我工作。它生成包裝div在子組件(Fields)之前。輸出看起來象下面這樣:

enter image description here

幫我找出這個問題!我是新來的反應。

+0

你很清楚地將孩子的輸出包裹在一個div中,所以它被呈現,你期望什麼?你不能只是'返回this.renderFields(this.props.obj)'? – Valentin

+1

需要注意的是,React 16將擺脫包裝元素的需求https://github.com/facebook/react/issues/2127#issuecomment-318202889 – Valentin

回答

0

是的,你能夠避免包裝DIV,原因是你要這麼直接返回一個<col>....</col>你可以寫這樣的:

render(){ 
    return this.renderFields(this.props.obj) //here no {} here 
} 

我們需要一個包裹,當我們有多個元素返回DIV從渲染方法。如果條件失敗,還要在renderFields的最後加上return null;來處理情況。

建議:

由於子組件不使用本地狀態和生命週期方法,這樣你就可以把它寫成Stateless Functional Component

像這樣:

const Child = ({obj}) => { 
    let des = translate(obj.description); 
    let mandatory = (obj.required == true) ? " *" : "" 
    let description = des + mandatory; 
    if(obj.variable){ 
     switch(obj.dataType){ 
     case "string": 
      return (
      <Col xs={12} md={3}> 
       ... 
      </Col> 
     ); 
     case "integer": 
      return (
      <Col xs={12} md={3}> 
       .... 
      </Col> 
     ); 
     case "double": 
      return (
      <Col xs={12} md={3}> 
       .... 
      </Col> 
     ); 
     } 
    } 
    return null; 
} 
+0

謝謝,Mayank!我知道這是愚蠢的錯誤,但你知道它總是有時會發生 - 這是開發人員的生活:( –

+0

燁,每個人都會發生,有一些飲料:) –