Correct way to handle conditional styling in React

前端 未结 9 1119
逝去的感伤
逝去的感伤 2020-11-27 04:25

I\'m doing some React right now and I was wondering if there is a \"correct\" way to do conditional styling. In the tutorial they use

style={{
  textDecorati         


        
相关标签:
9条回答
  • 2020-11-27 04:39

    First, I agree with you as a matter of style - I would also (and do also) conditionally apply classes rather than inline styles. But you can use the same technique:

    <div className={{completed ? "completed" : ""}}></div>
    

    For more complex sets of state, accumulate an array of classes and apply them:

    var classes = [];
    
    if (completed) classes.push("completed");
    if (foo) classes.push("foo");
    if (someComplicatedCondition) classes.push("bar");
    
    return <div className={{classes.join(" ")}}></div>;
    
    0 讨论(0)
  • 2020-11-27 04:39

    instead of this:

    style={{
      textDecoration: completed ? 'line-through' : 'none'
    }}
    

    you could try the following using short circuiting:

    style={{
      textDecoration: completed && 'line-through'
    }}
    

    https://codeburst.io/javascript-short-circuit-conditionals-bbc13ac3e9eb

    key bit of information from the link:

    Short circuiting means that in JavaScript when we are evaluating an AND expression (&&), if the first operand is false, JavaScript will short-circuit and not even look at the second operand.

    It's worth noting that this would return false if the first operand is false, so might have to consider how this would affect your style.

    The other solutions might be more best practice, but thought it would be worth sharing.

    0 讨论(0)
  • 2020-11-27 04:42

    The best way to handle styling is by using classes with set of css properties.

    example:

    <Component className={this.getColor()} />
    
    getColor() {
        let class = "badge m2";
        class += this.state.count===0 ? "warning" : danger;
        return class;
    }
    
    0 讨论(0)
  • 2020-11-27 04:47

    If you prefer to use a class name, by all means use a class name.

    className={completed ? 'text-strike' : null}
    

    You may also find the classnames package helpful. With it, your code would look like this:

    className={classNames({ 'text-strike': completed })}
    

    There's no "correct" way to do conditional styling. Do whatever works best for you. For myself, I prefer to avoid inline styling and use classes in the manner just described.

    POSTSCRIPT [06-AUG-2019]

    Whilst it remains true that React is unopinionated about styling, these days I would recommend a CSS-in-JS solution; namely styled components or emotion. If you're new to React, stick to CSS classes or inline styles to begin with. But once you're comfortable with React I recommend adopting one of these libraries. I use them in every project.

    0 讨论(0)
  • 2020-11-27 04:49
     <div style={{ visibility: this.state.driverDetails.firstName != undefined? 'visible': 'hidden'}}></div>
    

    Checkout the above code. That will do the trick.

    0 讨论(0)
  • 2020-11-27 04:49

    I came across this question while trying to answer the same question. McCrohan's approach with the classes array & join is solid.

    Through my experience, I have been working with a lot of legacy ruby code that is being converted to React and as we build the component(s) up I find myself reaching out for both existing css classes and inline styles.

    example snippet inside a component:

    // if failed, progress bar is red, otherwise green 
    <div
        className={`progress-bar ${failed ? failed' : ''}`}
        style={{ width: this.getPercentage() }} 
    />
    

    Again, I find myself reaching out to legacy css code, "packaging" it with the component and moving on.

    So, I really feel that it is a bit in the air as to what is "best" as that label will vary greatly depending on your project.

    0 讨论(0)
提交回复
热议问题