使用React JS中的样式组件,添加条件样式的更优选方法是什么?

示例代码( Learning React 中的代码示例,第146-150页);

请注意,与两年前写的书不同,我正在尝试使用样式化组件实现相同的功能。在本书中,CSS全部在app.css内部完成,而Star组件看起来像这样:

const Star = ({ selected=false,onClick= f=>f }) =>
  <StyledStar classname={(selected) ? "selected star" : "star"}
    onClick={onClick}>
  </StyledStar> 

和app.css看起来像这样:

.star {
  display: inline;
  cursor: pointer;
  height: 25px;
  width: 25px;
  margin: 2px;
  float: left;
  background-color: grey;
  clip-path: polygon(
          50% 0%,63% 38%,100% 38%,69% 59%,82% 100%,50% 75%,18% 100%,31% 59%,0% 38%,37% 38%
      );
}



.star.selected {
  background-color: red;
}

如您所见,如果选择了星星,则它显示为红色而不是灰色。

我想使用样式化的组件来重构它,这是我尝试过的:

// star.js

import React from 'react'
import PropTypes from 'prop-types'
import styled from 'styled-components'

const StyledStar = styled.div`
  display: inline;
  cursor: pointer;
  height: 25px;
  width: 25px;
  margin: 2px;
  float: left;
  background-color: ${`this.props.selected ? 'grey' : 'red'`};
  clip-path: polygon(
          50% 0%,37% 38%
  );
`

const Star = ({ selected=false,onClick= f=>f }) =>
  <StyledStar classname={(selected) ? "selected" : ""}
    onClick={onClick}>
  </StyledStar>

Star.propTypes = {
  selected: PropTypes.bool,onClick: PropTypes.func
}

export default Star

由于某种原因,我在background-color: ${`this.props.selected ? 'grey' : 'red'`};中期望的插值无法正常工作,而我的三元条件在我用JavaScript编写时在CSS中出现。

我想念什么吗?我以为可以像这样在样式div内插,但我想不是吗?

我也尝试过

const StyledStar = styled.div`
  display: inline;
  cursor: pointer;
  height: 25px;
  width: 25px;
  margin: 2px;
  float: left;
  background-color: grey;
  clip-path: polygon(
          50% 0%,37% 38%
  );

  .selected {
    background-color: red;
  }

...但是我也无法正常工作。 (与我熟悉的SCSS不同,您看不到将CSS声明嵌套在样式块内,对吗?)

jiguanni 回答:使用React JS中的样式组件,添加条件样式的更优选方法是什么?

在样式化的组件中,使用props调用传递给插值的函数。您可以对props进行解构以获得selected

const StyledStar = styled.div`
  display: inline;
  cursor: pointer;
  height: 25px;
  width: 25px;
  margin: 2px;
  float: left;
  background-color: ${({ selected }) => selected ? 'grey' : 'red'};
  clip-path: polygon(
          50% 0%,63% 38%,100% 38%,69% 59%,82% 100%,50% 75%,18% 100%,31% 59%,0% 38%,37% 38%
  );
`

用法-以与传递onClick相同的方式将prop传递给样式化的组件:

const Star = ({ selected = false,onClick = f => f }) => (
  <StyledStar
    selected={selected}
    onClick={onClick}>
  </StyledStar>
)
,

直接从样式化组件文档中报价:

  

插值:可以是字符串函数。字符串按原样与规则组合。函数将接收样式化组件的props作为第一个也是唯一的参数。

您组件的插值应该是一个函数:

const StyledStar = styled.div`
  display: inline;
  cursor: pointer;
  height: 25px;
  width: 25px;
  margin: 2px;
  float: left;
  background-color: ${props => props.selected ? 'grey' : 'red'};
`

或者,您可以通过在顶层传递函数来使此操作更加简洁:

const StyledStar = styled.div(
  props => `
  /* props can be accessed from the above props */
  color: ${props.color};
  background: ${props.selected ? 'grey' : 'red'};
`
)

demo

编辑:固定错字

本文链接:https://www.f2er.com/3158563.html

大家都在问