React Styled 组件:如何根据 props 添加 css 样式?

all*_*958 2 javascript reactjs

我一直在努力寻找解决我的问题的方法。我有几个标题标签(H1、H2 等),每个标签都在自己的文件中。我想在基于 prop 调用它们时添加一些 css。有些标题有一个小边框底部,有些则没有。因此,为了折射我的代码,我想添加一些基于 prop 的 css。我似乎找不到办法。

以下是标题 H2 的示例:

import styled from 'styled-components';
import colors from '../../../../colors'; 
import fonts from '../../../../fonts';
import fontWeights from '../../../../fontWeights';

const HeadingH2 = styled.h2`
  color: ${colors.text};
  font-family: ${fonts.montSerrat};
  font-size: 1.6em;
  font-weight: ${fontWeights.light};
  letter-spacing: 0.2em;
  padding-bottom: 0.7em;
  position: relative;
  text-transform: uppercase;
  text-align: center;
  &:after{
    content: "";
    display: block;
    height: 3px;
    width: 45px;
    background-color: currentColor;
    /* position */
    position: absolute;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
  }
`;

export default HeadingH2
Run Code Online (Sandbox Code Playgroud)

调用标题 H2 的示例:

import React from 'react';
import HeadingH2 from '../../common/headings/heading_h2';
import HeadingBaseline from '../../common/headings_baseline';


// Features
import {SectionContainer, FeaturesContainer} from './features.style';

import Feature from './feature';
import feature1 from '../../../img/features/feature1.png';
import feature2 from '../../../img/features/feature2.png';
import feature3 from '../../../img/features/feature3.png';

// Text
import Text from '../../../content';

const Features = () => {
  return(
    <SectionContainer id={"what"}>
      <HeadingH2>
        What We Do
      </HeadingH2>
    <HeadingBaseline>
      {Text.headingBaseline}
    </HeadingBaseline>
  <FeaturesContainer>
    <Feature 
      src={feature1} 
      headingText={Text.feature1.heading}
      paragraph={Text.feature1.paragraph}
      />
    <Feature 
      src={feature2} 
      headingText={Text.feature2.heading}
      paragraph={Text.feature2.paragraph}
      />
    <Feature 
      src={feature3} 
      headingText={Text.feature3.heading}
      paragraph={Text.feature3.paragraph}
      />
  </FeaturesContainer>
</SectionContainer>
)
};

export default Features;
Run Code Online (Sandbox Code Playgroud)

我想提取以下 CSS 属性

position: relative;
text-transform: uppercase;
text-align: center;
&:after{
 content: "";
 display: block;
 height: 3px;
 width: 45px;
 background-color: currentColor;
 /* position */
 position: absolute;
 bottom: 0;
 left: 50%;
 transform: translateX(-50%);
Run Code Online (Sandbox Code Playgroud)

因此,假设我将上述 CSS 规则放在单独的文件中,如何使用样式组件 HeadingH2 上的 props 添加/导入它们。

谢谢您的帮助 :)

jsw*_*324 5

像这样的东西有效:

const HeadingH2 = styled.h2`
  position: ${props => props.relative && 'relative'};
  padding: ${props => props.paddingBottom ? '0 0 20px 0' : '0'};
}
`;
Run Code Online (Sandbox Code Playgroud)

然后像这样使用:

<HeadingH2 relative paddingBottom />
Run Code Online (Sandbox Code Playgroud)


AWo*_*olf 5

您还可以使用csshelper fromstyled-components创建SharedStyles.js文件。

演示中您可以看到它的实际效果。仅以继承组件的样式使用它并不能按预期工作。如果我添加它,那么StyledBase之后变量将不会正确添加(悬停样式覆盖停止工作)。这就是为什么我复制${borderBottom}到每个样式组件Heading1/Heading2而不是将其添加到StyledBase.

我认为为标题设置 level 属性是一个好主意,但我会通过创建一个HeadingBase组件并将样式添加到StyledBase组件中来以不同的方式处理它(另请参阅演示中的代码)。

代码HeadingBase如下所示:

const HeadingBase = ({ className, children, level = 1 }) =>
    React.createElement(`h${level}`, { className }, children);
Run Code Online (Sandbox Code Playgroud)

它是一个根据传递的 prop 渲染 h1,h2,... 标签的组件level(默认为 h1)。h 标签className作为 props 接收(样式组件需要)并包含传递给组件的子级。

SharedStyles.js

import { css } from "styled-components";

export const borderBottom = css`
    &:after{
        content: "";
        display: block;
        height: 3px;
        width: 200px;
        background-color: ${props => props.color || "black"};
        /* position */
        position: absolute;
        bottom: 0;
        left: 50%;
        transform: translateX(-50%);
`;
Run Code Online (Sandbox Code Playgroud)

然后您可以将其导入import { borderBottom } from "./SharedStyles";并将其添加到您的样式组件中,如下所示:

const Heading1= styled.h1`
    ${borderBottom}
`;
Run Code Online (Sandbox Code Playgroud)