styled-components - 为啥在组件样式之后注入全局样式?

Posted

技术标签:

【中文标题】styled-components - 为啥在组件样式之后注入全局样式?【英文标题】:styled-components - Why is global style injected after component styles here?styled-components - 为什么在组件样式之后注入全局样式? 【发布时间】:2021-12-28 13:13:06 【问题描述】:

考虑这个使用 styled-components 的 react-app 示例:

import styled from "styled-components";
import  createGlobalStyle  from "styled-components";
import React from "react";

const GlobalStyle = createGlobalStyle`
    [type="submit"] 
      color: red;
    
`;

const StyledButton = styled.button`
  color: blue;
`;

function MyComponent() 
  return (
    <>
      <h1>My Component</h1>
      <button type="submit">regular button</button>
      <StyledButton type="submit">styled button</StyledButton>
    </>
  );


export default function App() 
  return (
    <>
      <GlobalStyle />
      <MyComponent />
    </>
  );

(见codesandbox)

我正在使用 [type="submit"] 为元素(按钮)设置全局样式,并希望稍后使用 StyledButton 覆盖该样式。

但 styled-components 似乎在组件样式之后注入全局样式,或者至少以这种方式打印它。如果我们使用浏览器开发工具检查输出的&lt;head&gt;,我们会发现:

.cshqdfcolor:blue;
[type="submit"]color:red;

这样,StyledButton 设置的蓝色被全局样式覆盖。 (这两个 css 选择器具有相同的优先级,因此依赖于顺序。我在示例中专门使用了这些选择器来说明问题。)

我的问题:

为什么没有在组件样式之前注入全局样式?我预计会出现这种情况,因为 &lt;GlobalStyle/&gt; 在组件树中更高。 如何确保在组件样式之前注入我的全局样式,以便更轻松地覆盖它?

注意: 我完全知道有多种方法可以让StyledButton 应用它的样式,而不关心样式注入的顺序。一种可能性当然是:

const StyledButton = styled.button`
   && 
     color: blue;
   
`;

但是,这样的解决方案不是我想要的。我正在尝试了解如何处理样式化组件的全局样式,以使具有相同优先级的选择器(用于组件)随后出现在样式表中,因此我不需要额外的技巧。

【问题讨论】:

【参考方案1】:

这是一个已知的错误:

https://github.com/styled-components/styled-components/issues/3146

您可以在 github 问题中查找解决方法。

【讨论】:

以上是关于styled-components - 为啥在组件样式之后注入全局样式?的主要内容,如果未能解决你的问题,请参考以下文章

使用 styled-components 在组件/元素之间共享样式

为啥 styled-components 样式没有应用到我的 CRA/Typescript/Storybook 项目中?

styled-components不能覆盖antd组件样式?

styled-component 组件中的 props 没有类型

如何使用 styled-components 更改其他组件中单个组件的样式?

styled-components:使用额外的样式扩展现有组件