【问题标题】:Circular dependency for extracted styles with styled-components带有样式组件的提取样式的循环依赖
【发布时间】:2020-10-03 21:48:15
【问题描述】:

我对 styled-components 还很陌生,并尝试将样式提取/重构到单独的文件中。我有循环依赖的问题 - 可能是因为缺乏样式组件良好实践的经验。 情况是这样的:

// A.js
import { StyledA } from './styles';

export default () => (
  <StyledA>
    <SomeOtherComponent />
  </StyledA>
);

// B.js
import { StyledA1 } from './styles';

export default () => (
   <SomeWrapperComponent>
     <StyledA1 />
   </SomeWrapperComponent>
);

// styles.js
import styled from 'styled-components';
import A from './A.js';

export const StyledA = styled.div`...`;
export const StyledA1 = styled(A)`...`; // causes dependency circle error

我想要实现的是扩展 A 组件样式并保留它的子组件(对于文件 B.js)。

  • export const StyledA1 = styled(StyledA) 不起作用,因为我丢失了组件 A 结构。
  • ...并在styles.js 中导入A 会因为导入A.js → styles.js → A.js 而导致eslint“依赖周期”错误。

如何保持扩展组件的 HTML 结构并解决依赖周期问题?

【问题讨论】:

  • 首先,你能重现sandbox 中的错误吗?其次,如果您想重复使用这种这种方式不是一个好的做法的样式,如果您有特定的问题想要解决并寻求建议,请解释并展示示例。
  • 好吧,在沙箱中,这个“依赖循环”错误不会出现,一切正常 - 可能是因为标准 eslint 配置(我的项目使用 Airbnb 配置)。无论如何,这是link。在components/B.js 文件中,您可以在将样式提取到单独的文件之前看到(注释掉)代码。
  • 我将添加一个良好实践示例的答案,您永远不会导出 styled 组件,将其视为一种解决方法,而不是尝试解决此特定问题。

标签: javascript reactjs eslint styled-components circular-dependency


【解决方案1】:

使用 CSS-in-JS(如 styled-components)时,您通常会将 style 生成的组件保存在同一个文件中。

那么如何导出使用 CSS-in-JS 构造函数生成的className?通过使用复合组件。

export const StyledA = styled.div`
  background: red;
  font-size: 20px;
`;

const A = ({ className }) => (
  <StyledA className={className}>
    <div>Display me always!</div>
  </StyledA>
);

// Can use any naming here
A.className = StyledA;

export default A;

此外,当您想重用样式时,您可以创建类似 styles.js 的文件并声明可重用的 css 块:

import { css } from 'styled-components';

const border = css`
  border: 2px black solid;
`;

export { border };

完全使用:

import A from './components/A';
import styled from 'styled-components';
import { border } from './components/styles';

const StyledA = styled(A)`
  background-color: palevioletred;
`;

const StyledASelector = styled.div`
  ${A.className} {
    background-color: paleturquoise;
    margin: 5px;
    ${border}
  }
`;

const App = () => {
  return (
    <>
      <A />
      <StyledA />
      <StyledASelector>
        <A />
      </StyledASelector>
    </>
  );
};

【讨论】:

  • 嗯,以前我在同一个 JS 文件中拥有大部分样式,但我听说将所有内容放在一起是一种不好的做法。我找到了这个topic 并开始提取样式 - 我依靠Spectrum repo,其中样式组件位于单独的样式文件中。那么这个回购呢?
  • React 中的一切都是自以为是的,没有标准,这是我第一次我在频谱回购中看到这样的例子。挑选 10 个评价很高的回购并检查他们的意见。此外,这是我第一次看到像在这个 repo 中那样有 500 行的组件。
猜你喜欢
  • 2019-03-15
  • 2018-10-16
  • 2020-03-14
  • 2019-03-12
  • 2021-12-16
  • 2020-01-17
  • 2019-08-20
  • 1970-01-01
  • 2018-07-26
相关资源
最近更新 更多