conditional rendering in styled components

后端 未结 5 2203
失恋的感觉
失恋的感觉 2020-12-07 14:19

How can I use conditional rendering in styled-components to set my button class to active using styled-components in React?

In css I would do it similarly to this:<

相关标签:
5条回答
  • 2020-12-07 14:56

    You can simply do this

    <Tab active={this.state.active} onClick={this.handleButton}></Tab>
    

    And in your styles something like this:

    const Tab = styled.button`
      width: 100%;
      outline: 0;
      border: 0;
      height: 100%;
      justify-content: center;
      align-items: center;
      line-height: 0.2;
    
      ${({ active }) => active && `
        background: blue;
      `}
    `;
    
    0 讨论(0)
  • 2020-12-07 15:00

    I didn't notice any && in your example, but for conditional rendering in styled-components you do the following:

    // Props are component props that are passed using <StyledYourComponent prop1="A" prop2="B"> etc
    const StyledYourComponent = styled(YourComponent)`
      background: ${props => props.active ? 'darkred' : 'limegreen'}
    `
    

    In the case above, background will be darkred when StyledYourComponent is rendered with active prop and limegreen if there is no active prop provided or it is falsy Styled-components generates classnames for you automatically :)

    If you want to add multiple style properties you have to use css tag, which is imported from styled-components:

    I didn't notice any && in your example, but for conditional rendering in styled-components you do the following:

    import styled, { css } from 'styled-components'
    // Props are component props that are passed using <StyledYourComponent prop1="A" prop2="B"> etc
    const StyledYourComponent = styled(YourComponent)`
      ${props => props.active && css`
         background: darkred; 
         border: 1px solid limegreen;`
      }
    `
    

    OR you may also use object to pass styled, but keep in mind that CSS properties should be camelCased:

    import styled from 'styled-components'
    // Props are component props that are passed using <StyledYourComponent prop1="A" prop2="B"> etc
    const StyledYourComponent = styled(YourComponent)`
      ${props => props.active && ({
         background: 'darkred',
         border: '1px solid limegreen',
         borderRadius: '25px'
      })
    `
    
    0 讨论(0)
  • 2020-12-07 15:00

    I haven't seen this syntax, which I feel is the cleanest when you need to make a complete block conditional:

    const StyledButton = styled(button)`
        display: flex;
        background-color: white;
    
        ${props => !props.disabled} {
            &:hover {
                background-color: red;
            }
    
            &:active {
                background-color: blue;
            }
        }
    `;
    

    So there's no need to close/open ticks to get it working.

    0 讨论(0)
  • 2020-12-07 15:04

    Here is an simple example with TypeScript:

    import * as React from 'react';
    import { FunctionComponent } from 'react';
    import styled, { css } from 'styled-components';
    
    interface IProps {
      isProcessing?: boolean;
      isDisabled?: boolean;
      onClick?: () => void;
    }
    
    const StyledButton = styled.button<IProps>`
      width: 10rem;
      height: 4rem;
      cursor: pointer;
      color: rgb(255, 255, 255);
      background-color: rgb(0, 0, 0);
    
      &:hover {
        background-color: rgba(0, 0, 0, 0.75);
      }
    
      ${({ disabled }) =>
        disabled &&
        css`
          opacity: 0.5;
          cursor: not-allowed;
        `}
    
      ${({ isProcessing }) =>
        isProcessing &&
        css`
          opacity: 0.5;
          cursor: progress;
        `}
    `;
    
    export const Button: FunctionComponent<IProps> = ({
      children,
      onClick,
      isProcessing,
    }) => {
      return (
        <StyledButton
          type="button"
          onClick={onClick}
          disabled={isDisabled}
          isProcessing={isProcessing}
        >
          {!isProcessing ? children : <Spinner />}
        </StyledButton>
      );
    };
    
    <Button isProcessing={this.state.isProcessing} onClick={this.handleClick}>Save</Button>
    
    0 讨论(0)
  • 2020-12-07 15:05

    If your state is defined in your class component like this:

    class Card extends Component {
      state = {
        toggled: false
      };
      render(){
        return(
          <CardStyles toggled={this.state.toggled}>
            <small>I'm black text</small>
            <p>I will be rendered green</p>
          </CardStyles>
        )
      }
    }
    

    Define your styled-component using a ternary operator based on that state

    const CardStyles = styled.div`
      p {
        color: ${props => (props.toggled ? "red" : "green")};
      }
    `
    

    it should render just the <p> tag here as green.

    This is a very sass way of styling

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