2017-04-02 9 views
1

Also lassen Sie uns sagen, dass ich ein einfaches Web-Layout erschaffe, wo ich eine Rückmeldung Komponente über dem MainContent Komponente haben, wie so:React.js - Rendern von Komponenten mit unterschiedlichen Stile basierend auf Requisiten

class WebLayout extends Component { 
    render() { 
    <div> 
     <Header /> 
     <FeedBackMessage 
     shouldRenderMessage={true} 
     typeMessage={"error"} 
     message={"Wrong input!"} 
     /> 
     <MainContent /> 
    </div> 
    } 
} 

Und lasst uns angenommen, dass ich verschiedene Arten von Nachrichten habe, wie error, warning, success.

Im Inneren des FeedBackMessage, kann ich etwas als so haben:

class FeedBackMessage extends Component { 
    renderMessage(){ 
    const {shouldRenderMessage, typeMessage, message } = this.props; 
    if (shouldRenderMessage === true){ 
     <div> 
     {message} 
     </div> 
    } 
    } 
    render(){ 
    return (
     <div> 
     {this.renderMessage().bind(this)} 
     </div> 
    ) 
    } 
} 

Ich bin ratlos, wie ich FeedBackMessage Styling basierend auf typeMessage prop Wert machen kann.

Zum Beispiel, wenn ich typeMessage mit "Fehler" übergebe, möchte ich die FeedbackMessage Komponente mit einem roten Rahmen Styling haben. Oder wenn ich confirm passiere, würde ich gerne mit grünem Rand rendern.

Antwort

1

Dies alles ist sehr abhängig von Ihrer Styling-Lösung.

Wenn Sie Inline-Styles verwenden möchten könnte es etwa so aussehen:

class FeedBackMessage extends Component { 
    renderMessage(){ 
    const {shouldRenderMessage, typeMessage, message } = this.props; 
    if (shouldRenderMessage === true){ 
     <div> 
     {message} 
     </div> 
    } 
    } 
    render(){ 
    const componentStyle = { 
     error: { border: "1px solid red" }, 
     confirm: { border: "1px solid green" } 
    }[this.props.typeMessage]; 

    return (
     <div style={componentStyle}> 
     {this.renderMessage().bind(this)} 
     </div> 
    ) 
    } 
} 

Wenn Sie mit Stylesheets stylen möchten, können Sie so etwas wie classnames verwenden Klassen zu wechseln, basierend auf einem gewissen Logik und fügen Sie dann die Klasse Ihre Komponente hinzu.

class FeedBackMessage extends Component { 
    renderMessage(){ 
    const {shouldRenderMessage, typeMessage, message } = this.props; 
    if (shouldRenderMessage === true){ 
     <div> 
     {message} 
     </div> 
    } 
    } 
    render(){ 
    const componentClass = classNames('FeedBackMessage', { 
     "error": this.props.typeName === 'error', 
     "confirm": this.props.typeName === 'confirm' 
    }); 

    return (
     <div className={componentClass}> 
     {this.renderMessage().bind(this)} 
     </div> 
    ) 
    } 
} 

Und ein Stylesheet haben etwa so:

.FeedBackMessage .error { 
    border: 1px solid red; 
} 

.FeedbackMessage .confirm { 
    border: 1px solid green; 
} 
+0

Danke für den Input! Gibt es eine Möglichkeit, DRY-Praktiken zu verwenden? Zum Beispiel, was würde passieren, wenn ich mehr als 10 verschiedene Nachrichten habe? Mit Ihrer Methode würde es bedeuten, dass ich mehr als 10 verschiedene css classNames haben müsste. – Alejandro

+1

In Bezug auf DRY wiederholen Sie sich nicht wirklich, wenn Sie ein anderes Verhalten basierend auf dem typeName benötigen. Wenn es 3 verschiedene mögliche Farben gibt, können Sie vielleicht die gleichen Klassennamen wiederverwenden und haben nur eine 1 zu viele Zuordnung zwischen Klassennamen und Typnamen. Sie können es wahrscheinlich kürzer machen, indem Sie 'this.props.typeName' als Klassennamen verwenden - aber Sie haben immer noch 10+ Klassen. Wenn Sie wirklich denken, dass dies immer noch zu viele Klassen sind, sollten Sie Inline-Stile ausprobieren, um Klassen ganz zu vermeiden. –

Verwandte Themen