2017-07-27 5 views
0

Ich lerne derzeit reagieren.Container Komponente Requisiten Fehler

Ich habe einen Container-Komponente:

<SceneSelectNumber 
    goBack={this.goBack} 
    onChangeNumber={sceneConfig.onChangeNumber} 
    selectedNumberValue={this.props.daysInAweek} 
    onDone={this.onDone} 
    renderHowMuch 
    helpMeCalculate 
    sceneConfig={sceneConfig} 
    /> 

, die alle zugehörigen untergeordneten Komponenten enthält:

<Flexible> 
    <LYDSceneContainer 
     goBack={this.props.goBack} 
     subSteps={this.props.subSteps}> 
     <Flexible> 
     <LYDSceneQuestion {...this.props.sceneConfig.question[0]} /> 
     <LYDSelectNumber 
      selectedNumberValue={this.props.selectedNumberValue[0]} 
      onChangeNumber={this.props.onChangeNumber} 
     /> 
     </Flexible> 
     {this.props.renderHowMuch && this.renderHowMuch()} 
     {this.props.helpMeCalculate && this.renderHelpMeCalculateButton()} 
    </LYDSceneContainer> 

    <NextButton 
     onPress={this.props.onDone} 
     disabled={!this.props.selectedNumberValue} 
     fullWidth 
    /> 
    </Flexible> 

Aber, wie ich ein anderes Kind Komponente hinzufügen müssen, ich Daten in einem Array bin Speicherung von Objekten sceneConfig. Dies bricht meine anderen Seiten, die die Komponente verwenden

question: [ 
    { 
     text: ['on how many of the last 7 days', 'did you have a drink?'], 
    }, 
    { 
     text: [ 
     'On your drinking days', 
     'how many units of alcohol did you typically drink?', 
     ], 
    }, 
    ], 

die neuen Daten anzuzeigen, ich habe aus, {props.text} zu {props.text[1]}

<View style={[styles.container, props.style]}> 
    <Text style={styles.textRowNormal}> 
    {props.text[0]} 
    </Text> 
    <Text style={styles.textRowBold}> 
    {props.text[1]} 
    </Text> 
</View> 

meine LYDSceneQuestion Komponente ändern.

Wie kann ich meine Komponente ändern, damit andere Seiten, die sie verwenden, nicht beschädigt werden?

Ich habe meine Daten geändert:

const sceneConfig = { 
    question: { 
    text: 'string, 'string')], 
    }, 

An:

question: [ 
    { 
     text: ['on how many of the last 7 days', 'did you have a drink?'], 
    }, 
    { 
     text: [ 
     'On your drinking days', 
     'how many units of alcohol did you typically drink?', 
     ], 
    }, 
    ], 
    selectNumber: [() => {},() => {}], 
    onChangeNumber: [ 
    number => { 
     const data = { [field]: number }; 
     this.props.dispatch(assessmentActions.updateAssessment(step, data)); 
    }, 
    number => { 
     const data = { [field]: number }; 
     this.props.dispatch(assessmentActions.updateAssessment(step, data)); 
    }, 
    ], 
+0

Es ist sehr schwierig, den Kontext Ihres Problems anhand dieses Beispiels zu verstehen. Sie können einen ternären Operator verwenden, um bei Bedarf bedingtes Rendering auszuführen. –

+0

So etwas, '{props.text? props.text: props.text [0]} '? – Bomber

+0

Wenn Sie sicher sein wollen, ob props.text existiert und ein String oder Array ist, können Sie diese '' {props.text && props.text.constructor === String verwenden? props.text: props.text [0]} '' '. Wenn Sie mehr Elemente haben, sollten Sie das Array mit * Array.prototype.map * abbilden, anstatt Elemente direkt nach dem Index aufzurufen. –

Antwort

0

Sie dieses

<View style={[styles.container, props.style]}> 
    {props.text.map(function(item, i){ 
    return (
     <Text style={ i=0 ? styles.textRowNormal : styles.textRowBold }> 
     {item} 
     </Text> 
    ) 
    })} 
</View> 

Update 1 verwenden können

vorausgesetzt, Sie quesion als Requisiten

1) erstellen stateless Komponente

const ViewText = ({props}) => { 
    return(
     {props.data.text.map(function(item, i){ 
     return (
      <Text style={ i=0 ? styles.textRowNormal : styles.textRowBold }> 
      {item} 
      </Text> 
     ) 
     })} 
    ) 
}; 

2) Erstellt Funktion sind vorbei isArray

function isArray(obj) { 
    return (typeof obj !== 'undefined' && 
      obj && obj.constructor === Array); 
} 

3) Container

sein wird, um zu überprüfen
<View style={[styles.container, props.style]}> 
    {if(isArray(this.props.quesion)? 
     this.props.quesion.map(function(obj){ 
      <ViewText data={obj}/> 
     }): 
    <ViewText data={this.prop.quesion}/> 
    } 
</View> 
+0

Danke, manchmal ist es ein Array und nicht ein Eigenschaftswert, kann ich das überprüfen? – Bomber

+0

Testdaten bitte ..? –

+0

aktualisierte Frage, danke – Bomber

Verwandte Themen