当前位置: 首页 > 知识库问答 >
问题:

如何在样式化组件中定义class Name

岑熙云
2023-03-14

我正忙于重构React项目以使用样式化组件。它目前正在使用SASS。所以,我有一个工作组件:

import React from 'react';
import styled from 'styled-components';

const MainNavDiv = styled.div`
  display: none;
  font-weight: 300;
  font-size: 1.7rem;
  background-color: #F5F5F5;
  grid-column: 1 / span 2;
  grid-row: 2 / span 1;
  border-top: #D3D3D3 solid 1px;
  border-bottom: #D3D3D3 solid 1px;
  z-index: 3;
  @media (min-width: 51rem) {
    display: block;
  }
`;

const Ul = styled.ul`
  list-style-type: none;
  margin: 0;
  padding: 0;
`;

const Li = styled.li`
  border-bottom: 1px dotted #D3D3D3;
  text-indent: 3rem;
  padding: .5rem 0 .5rem 0;
  height: 2.1rem;
  & :last-child {
    border: none;
  }
  & a {
    text-decoration: none;
    color: #000;
    WebkitTransition: text-indent 0.5s ease, color 0.5s ease;
    MozTransition: text-indent 0.5s ease, color 0.5s ease;
    transition: text-indent 0.5s ease, color 0.5s ease;
    display: block;
    width: 200px;
  }
  & :hover {
    text-indent: 4rem;
    & a {
      color: $secondary-color;
    }
  }
  & span {
    font-size: 1.3rem;
  }
`;

 const MainNav = (props) => {
    return (
      <MainNavDiv>
        <Ul>
          <Li className={props.linkIndentHome}><a href="#" onClick={props.homeContent}>HOME</a></Li>
          <Li className={props.linkIndentSonata}><a href="#" onClick={props.sonataContent}>SONATAS <span>(adults)</span></a></Li>
          <Li className={props.linkIndentIntermezzo}><a href="#" onClick={props.intermezzoContent}>INTERMEZZI <span>(adults)</span></a></Li>
          <Li className={props.linkIndentSonatina}><a href="#" onClick={props.sonatinaContent}>SONATINA <span>(Children)</span></a></Li>
          <Li className={props.linkIndentDatesFees}><a href="#" onClick={props.datesFeesContent}>DATES & FEES</a></Li>
          <Li className={props.linkIndentLive}><a href="#" onClick={props.liveContent}>LIVE! & CHAT</a></Li>
          <Li className={props.linkIndentVideoArchive}><a href="#" onClick={props.videoArchiveContent}>VIDEO ARCHIVE</a></Li>
          <Li className={props.linkIndentGeneral}><a href="#" onClick={props.generalContent}>GENERAL</a></Li>
          <Li className={props.linkIndentMisc}><a href="#" onClick={props.miscContent}>MISC</a></Li>
        </Ul>
      </MainNavDiv>
    )
 };

export default MainNav;

每个Li组件都从附加一个类的父组件导入一个prop。例如,第一个列表项将在单击时缩进该列表项,并取消缩进所有其他列表项。这都保持在父状态。到目前为止一切都好。现在,这个缩进类在一个scss文件中定义:

.main-nav__indented {
  border-bottom: 1px dotted $secondary-color !important;
  & a {
    text-indent: 5rem;
    color: $secondary-color !important;
  }
}

我不想让那个scss文件隐藏那个缩进类。它应该在我的Main NavDiv组件中的某个地方定义,这样我就可以将该scss文件从我的项目中删除。但是我对如何实现它感到困惑。

我可以使用“attrs”方法吗

const MainNavDiv = styled.div.attrs({
  className = // something here
})`
  display: none...
  ...
`;

除了在scss文件中之外,我如何以及在何处定义main-nav__缩进类?

共有2个答案

狄奕
2023-03-14

如果您想使用默认类名,那么在我的例子中,我的项目也是typescript,所以我也必须指定类型

let Container = styled.div.attrs<LayoutProps| 

SpaceProps|HTMLAttributes<any>>(props=>{
  return  {className: `${props.className} container`}
})`
${layout}
${flex} 
${space}
那正初
2023-03-14

您可以删除classNameprop并添加一个isindended={props.linkIndentHome}props。linkIndentHome是一个bool,用于表示其是否缩进。

将道具传递给Li组件,并在那里使用它来做出决定。像下面这样的东西:

const Li = styled.li`
  border-bottom: 1px dotted #D3D3D3;
  text-indent: 3rem;
  ...other styles
  ${props => props.isIndented && `
    border-bottom: 1px dotted
    ...whatever other styles for indentation
`}
`
 类似资料:
  • 问题内容: 我想在基于类的我自己的组件的某些部分中使用主题。我什么都做不了,文档中的所有示例都是针对功能组件的。基本上,主题是定义好的,我想用它来设置自己的组件样式,这样我就可以避免重复自己并在更高级别上更改代码,并且该代码随处可见。 我的App.js 我的问题文件Nav.js 问题答案: 您不能与类组件一起使用。返回一个只能在功能组件中使用的自定义钩子。对于类组件,可以使用withStyles来

  • 我正在开发一个带有样式组件的反应应用程序,我有一个组件“导航”。在这个组件中有更多的组件,如,等。Header例如是这样声明的: 问题是,我在不同的文件中有这个导航组件,对于所有文件,样式都很好,但现在我只想在其中一个文件中更改标题组件的背景色,它位于(?)导航组件。我该怎么做?我知道可以用const NewNav=styled(导航)之类的东西从导航组件更改样式,`但是标题呢? 先谢谢你。

  • 如何自定义Video组件控制栏样式

  • 我试图找到一种方法来动态导入继承一些标准样式的svg图标。我没有看到其他人写这个...所以我想我走错了路。 我尝试过在样式化的组件中创建一个SVG包装器,但这给了我一个svg的巢 SVG图标代码 我的图标代码 导入正在工作并显示,但我希望将组件作为样式化组件,这将使我能够使用道具设置主题并动态更改SVG样式。

  • Button组件通常由Text元素组成,该元素用TouchableHighlight(或其他touchable)包装。我正在尝试创建一个使用styled-components样式的按钮组件,但是我的样式很难动态响应道具。 下面,我创建了一个按钮组件,类似于样式化组件文档中的Adapting based on props示例。 导入后,我用的按钮是这样的... 所以,我希望我的纽扣看起来像这样...

  • 我正在尝试使用Vue.js而不需要构建步骤。但是Vue没有样式属性。 所以我想在我的Vue组件实例上创建一个自定义的“style”属性,然后在创建或装载组件时将该属性的内容注入DOM。 问题是我不能理解。(我看了一下插件文档)。我需要创建某种插件,首先检查“style”属性是否存在,然后将其插入DOM。我也不想使用Vue。component()函数,因为我想使用ES6导入和导出。下面是结果的样子: