web-dev-qa-db-ja.com

スタイル付きコンポーネントでの条件付きレンダリング

スタイル付きコンポーネントで条件付きレンダリングを使用して、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>
     )
  }}
28
tom harrison

あなたは単にこれを行うことができます

<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;
  `}
`;
62
João Cunha

あなたの例では&&に気付きませんでしたが、スタイル付きコンポーネントの条件付きレンダリングでは、次のことを行います:

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

上記の場合、StyledYourComponentがアクティブなプロップでレンダリングされ、アクティブなプロップが提供されていないか、偽のStyled-componentsがクラス名を自動的に生成する場合はライムグリーンでレンダリングされると、背景が暗くなります:)

複数のスタイルプロパティを追加する場合は、styles-componentsからインポートされるcssタグを使用する必要があります。

あなたの例では&&に気付きませんでしたが、スタイル付きコンポーネントの条件付きレンダリングでは、次のことを行います:

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

または、オブジェクトを使用してスタイルを渡すこともできますが、CSSプロパティは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'
  })
`
14
asn007

状態がクラスコンポーネントで次のように定義されている場合:

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>タグのみを緑色でレンダリングする必要があります。

これは非常に賢いスタイリング方法です

1
Vincent Tang