2015-08-26 6 views
14

Ich würde gerne wissen, ob es eine bessere Möglichkeit gibt, eine Requisite bedingt als eine if-Anweisung zu übergeben.Reagieren: Inline bedingt Prop übergeben an Komponente

Zum Beispiel gerade jetzt habe ich:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    if(this.props.editable) { 
     return (
     <Child editable={this.props.editableOpts} /> 
    ); 
    } else { 
     // In this case, Child will use the editableOpts from its own getDefaultProps() 
     return (
     <Child /> 
    ); 
    } 
    } 
}); 

Gibt es eine Möglichkeit, dies ohne die if-Anweisung zu schreiben? Ich war etwas entlang der Linien von einer Art von Inline-if-Anweisung in der JSX denken:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    return (
     <Child 
     {this.props.editable ? editable={this.props.editableOpts} : null} 
     /> 
    ); 
    } 
}); 

Zur Nachbereitung: Ich versuche, einen Weg zu finden, eine Stütze für Child, zu definieren, aber Pass ein Wert (oder etwas anderes tun), so dass Child immer noch den Wert dieses Props von Child eigenen getDefaultProps() zieht.

+0

Können Sie auch den Code für "Child" hinzufügen? Willst du auch sagen: 'anstelle von' '? –

+0

@JimSkerritt Ich habe die Requisiten nicht verwechselt, obwohl ich weiß, dass es so aussieht. Ich versuche, ['react-bootstrap-table'] (http://allenfang.github.io/react-bootstrap-table/example.html) zu verwenden und das ist das Format, das sie verwenden. Ich bin mir nicht sicher, ob der 'Child'-Code wirklich wichtig ist für das, was ich frage, weshalb ich ihn nicht aufgenommen habe. Ich bin wirklich nur auf der Suche nach einer Möglichkeit, optional eine Berechtigung an "Child" weiterzuleiten oder nicht zu übergeben, die keine große Menge an ähnlichem Code in if-Anweisungen im "Parent" benötigt. –

+1

Gotcha, nur checking :) Ich werde in Kürze eine Antwort für Sie haben –

Antwort

31

Sie waren mit Ihrer Idee nah. Es stellt sich heraus, dass das Übergeben von undefined für eine Requisite das Gleiche ist, als wenn sie überhaupt nicht enthalten wäre, was immer noch den Standard-Requisitenwert auslösen würde. So könnte man so etwas tun:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    return <Child 
     editable={this.props.editable ? 
        this.props.editableOpts : 
        undefined} 
    />; 
    } 
}); 
+0

Oh, super! Hast du das irgendwo in der Dokumentation gefunden? Ich suchte nach, aber konnte während einer schnellen Suche nichts finden –

+0

nicht sicher, ob es in der Dokumentation ist oder nicht, nur etwas, was ich gelernt habe mit React :) –

+1

'null' ist nicht mit solcher Macht wie' undefined bewaffnet ', BTW. – Season

1

definieren props Variable:

let props = {}; 
if (this.props.editable){ 
    props.editable = this.props.editable; 
} 

Und dann verwenden Sie es in JSX:

<Child {...props} /> 

Hier ist eine Lösung in Ihrem Code:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    let props = {}; 
    if (this.props.editable){ 
     props.editable = this.props.editable; 
    } 
    return (
     <Child {...props} /> 
    ); 
    } 
}); 

Quelle, Reagieren Dokumentation: https://facebook.github.io/react/docs/jsx-in-depth.html#spread-attributes

-1
const CleaningItem = ({ disabled = false }) => (
<View 
    style={[styles.container, disabled && styles.disabled]} 
    pointerEvents={disabled ? 'none' : 'auto'} 
> 
    <Button 
     disabled={disabled || null} 
     title="SELECT" 
    /> 
</View> 
); 
+0

Es wäre schön, wenn Sie ein paar Wörter dazu schreiben würden, um Ihren Code zu erklären – Yannick

+0

Wenn Sie eine deaktivierte Requisite an die CleaningItem-Komponente übergeben, wird die Komponente deaktiviert und wendet den Stil an (styles.disabled) – Denis

Verwandte Themen