Jak mogę użyć warunkowego renderowania w składnikach stylizowanych, aby ustawić klasę przycisku, aby aktywować za pomocą elementów stylistycznych w reakcji?

W CSS zrobiłbym to podobnie do tego:

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

W składzie w stylu, jeśli spróbuję użyć "&&" w nazwie klasy, to nie lubi.

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>
     )
  }}
95
tom harrison 29 styczeń 2018, 16:40

4 odpowiedzi

Najlepsza odpowiedź

Możesz to po prostu zrobić

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

A w twoich stylach coś takiego:

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;
  `}
`;
112
João Cunha 29 styczeń 2018, 13:48

Nie zauważyłem żadnych i w twoim przykładzie, ale za warunkowe renderowanie w składnikach stylu wykonasz następujące czynności:

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

W powyższym przypadku tło będzie darkred, gdy StyleredourComponent jest renderowany z aktywnym rekwizytem i ogranicznikiem, jeśli nie ma aktywnego podporu, ani nie jest isz fałszywych elementów stylizowanych generuje do Classnames dla Ciebie automatycznie :)

Jeśli chcesz dodać właściwości wielu stylów, musisz użyć znacznika CSS, który jest importowany z elementów stylizowanych:

Nie zauważyłem żadnych i w twoim przykładzie, ale za warunkowe renderowanie w składnikach stylu wykonasz następujące czynności:

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

Możesz też użyć obiektu, który ma stylizowany, ale pamiętaj, że właściwości CSS powinny być 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'
  })
`
25
Mosh Feu 27 luty 2020, 21:42

Oto prosty przykład z maszynopisem:

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>
5
Saleh Muhammad 16 grudzień 2019, 08:44

Jeśli twój stan jest zdefiniowany w takim komponencie klasy:

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

Zdefiniuj składnik stylu za pomocą operatora trójsego na podstawie tego stanu

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

Powinien uczynić tylko znacznik <p> jako zielony.

Jest to bardzo sasowy sposób stylizacji

3
Vincent Tang 5 kwiecień 2019, 15:32