условная рендеринг в стилизованных компонентах
Как я могу использовать условный рендеринг в стилизованных компонентах, чтобы установить класс кнопки в активный, используя стилизованные компоненты в React?
В css я бы сделал это примерно так:
<button className={this.state.active && 'active'} onClick={() => this.setState({active: !this.state.active}) }>Click me</button>
В стильных компонентах, если я пытаюсь использовать '&&' в имени класса, он не нравится.
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>
)
}}
Ответы
Ответ 1
Вы можете просто сделать это
<Tab active={this.state.active} onClick={this.handleButton}></Tab>
И в ваших стилях что-то вроде этого:
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;
'}
';
Ответ 2
Я не заметил ни одного && в вашем примере, но для условного рендеринга в стильных компонентах вы делаете следующее:
// Props are component props that are passed using <StyledYourComponent prop1="A" prop2="B"> etc
const StyledYourComponent = styled(YourComponent)'
background: ${props => props.active ? 'darkred' : 'limegreen'}
'
Ответ 3
Если ваше состояние определено в вашем компоненте класса следующим образом:
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>
)
}
}
Определите ваш стиль-компонент с помощью тернарного оператора на основе этого состояния
const CardStyles = styled.div'
p {
color: ${props => (props.toggled ? "red" : "green")};
}
'
он должен отображать только <p>
здесь зеленым.
Это очень нахальный способ укладки