无法使用 @emotion/styled 访问样式化组件中的主题

Posted

技术标签:

【中文标题】无法使用 @emotion/styled 访问样式化组件中的主题【英文标题】:Not able to access theme in styled component using @emotion/styled 【发布时间】:2021-12-11 13:16:55 【问题描述】:

我正在使用@emotion/react 进行主题化并将主题注入其中,我可以使用useTheme 将主题访问到组件中,但无法使用@emotion/styled 将主题访问到样式中。请问有什么帮助吗?

//libs
import React from 'react';
import styled from '@emotion/styled';

import StylesProvider from '@mui/styles/StylesProvider';
import  ThemeProvider  from '@emotion/react';


const THEME = 
  primary: 'red'


const StyledText = styled('p')`
  color: $( theme ) => theme.primary;
`;

function App() 
  return (
    <StylesProvider injectFirst>
      <ThemeProvider theme=THEME>
        <StyledText>test</StyledText>
      </ThemeProvider>
    </StylesProvider>
  );


export default App;



here is sample code

【问题讨论】:

在我的问题中添加了示例代码。 【参考方案1】:

你需要这样称呼它。有关详细信息,请参阅this 部分。

const StyledTextField = styled('div')(( theme ) => `
  margin: $theme.spacing(1);
  background-color: $theme.palette.primary.main;
  /* ... */
`);

或者你也可以像文档中那样使用 JS 对象:

const StyledTextField = styled('div')(( theme ) => (
  margin: theme.spacing(1),
  backgroundColor: theme.palette.primary.main,
  // ...
));

【讨论】:

它不起作用,错误似乎是“'主题'类型上不存在属性'间距'。” @RupinderpalThind 查看我更新的答案。您可以探索主题对象here。如果你想访问原色,它是theme.palette.primary.main,而不是theme.primary 这里仍然无法访问主题,我正在使用打字稿,可能会导致任何问题吗? @RupinderpalThind 我看不到你在哪里导入 styled 函数,但你需要从 @mui/material/styles 导入它才能与 MUI 主题对象一起使用。 我在“@emotion/styled”中使用它【参考方案2】:
    创建“emotion.d.ts”并声明您的主题:
import "@emotion/react";

declare module "@emotion/react" 
  export interface Theme 
    color: 
      primary: string;
    
  

    将文件“emotion.d.ts”导入“tsconfig.ts”:
"typeRoots": ["emotion.d.ts"]
    重新加载窗口并像这样使用它:
const StyledText = styled('p')`
  color: $( theme ) => theme.color.primary;
`;
    如果您使用 Mui,让我们扩展您的主题:
export interface Theme extends ThemeOfMui

【讨论】:

以上是关于无法使用 @emotion/styled 访问样式化组件中的主题的主要内容,如果未能解决你的问题,请参考以下文章

React Emotion Styled Component:类选择器不起作用

未找到模块:错误:运行故事书时无法解析“@emotion/styled/base”

MUI v5:我是不是需要安装 @emotion/react 或 @emotion/styled 才能使用 sx 道具?

WebStorm 中的情感样式组件未自动完成

不能使用带有情感 js 和 typescript 的样式组件的道具

React JSX / TSX:使用 Emotion 导入/导出多个模块(主题对象)