123 votes

rendu conditionnel dans les composants stylés

Comment utiliser le rendu conditionnel dans les composants stylisés pour définir ma classe de boutons sur active à l'aide de composants stylés dans React?

En css je le ferais de la même façon:

<button className={this.state.active && 'active'} onClick={ () => this.setState({active: !this.state.active}) }>Click me</button>

Dans les composants stylés, si j'essaie d'utiliser '&&' dans le nom de la classe, cela ne lui plaît pas.

 import React from 'react'
import styled from 'styled-components'

const Tab = styled.button`
  width: 100%;
  outline: 0;
  border: 0;
  height: 100%;
  justify-content: center;
  align-items: center;
  line-height: 0.2;
`

export default class Hello extends React.Component {
  constructor() {
    super()
    this.state = {
      active: false
    }  
    this.handleButton = this.handleButton.bind(this)
}

  handleButton() {
    this.setState({ active: true })
  }

  render() {
     return(
       <div>
         <Tab onClick={this.handleButton}></Tab>
       </div>
     )
  }}
 

241voto

Lokuzt Points 3003

Vous pouvez simplement faire ceci

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

Et dans vos styles, quelque chose comme ça:

 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;
  `}
`;
 

59voto

asn007 Points 178

Je n'ai pas remarqué tout && dans votre exemple, mais pour le rendu conditionnel dans style-composants, vous devez effectuer les opérations suivantes:

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

Dans le cas ci-dessus, le fond sera rouge foncé quand StyledYourComponent est rendu avec active prop et limegreen si il n'y a aucun accessoire fourni ou il est falsy Style-composants génère des noms de classe automatiquement pour vous :)

Si vous souhaitez ajouter plusieurs propriétés de style que vous avez à utiliser les css de la balise, ce qui est importé de style-composants:

Je n'ai pas remarqué tout && dans votre exemple, mais pour le rendu conditionnel dans style-composants, vous devez effectuer les opérations suivantes:

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;`
  }
`

OU vous pouvez également utiliser l'objet pour passer de style, mais gardez à l'esprit que les propriétés CSS devrait être en camelcase:

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'
  })
`

6voto

Vincent Tang Points 694

Si votre état est défini dans votre composant de classe comme ceci:

 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>
    )
  }
}
 

Définissez votre composant stylé à l'aide d'un opérateur ternaire basé sur cet état

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

il convient que la balise <p> indiquée ici soit verte.

C'est un style très sass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X