【问题标题】:How to use MUI v5 makeStyles without ThemeProvider?如何在没有 ThemeProvider 的情况下使用 MUI v5 makeStyles?
【发布时间】:2021-12-09 04:19:19
【问题描述】:

我有一个 styles.tsx 文件,因为我不想将样式放在我的组件中:

//styles.tsx

import {grey, purple} from '@mui/material/colors';
import {styled, Theme} from '@mui/material/styles';
import {createStyles, makeStyles} from '@mui/styles';

export const drawerStyles = makeStyles((theme: Theme) =>
  createStyles({
    logo: {
      'fontSize': '2em',
      'fontFamily': 'Oleo Script Swash Caps',
      'background': 'transparent',
      'border': 'none',
      'marginLeft': theme.spacing(1),
      'width': '41px',
      'overflow': 'hidden',
      'transition': 'all 0.1s ease-out',
      'cursor': 'pointer',
      '&:hover': {
        color: purple[700],
      },
    },
    slide: {
      paddingLeft: '8px',
      width: '100%',
    },
  }),
);

在另一个组件中我导入drawerStyles:

// drawerContainer.tsx

import {drawerStyles} from 'Src/styles';

export const DrawerContainer = () => {
  const classes = drawerStyles();

  return (
    <Box className={`${classes.logo}>
      <p>some text</p>
    </Box>
  )

代码编译但浏览器返回错误:

MUI:提供的styles 参数无效。您在上下文中提供了一个没有主题的函数。其中一个父元素需要使用 ThemeProvider。

在我的index.tsx 上,我使用ThemeProvider

// index.tsx

import {ThemeProvider, StyledEngineProvider} from '@mui/material/styles';
import {theme} from 'Src/theme';

  const Root = () => {
    return (
      <ApolloProvider client={client}>
        <StyledEngineProvider injectFirst>
          <ThemeProvider theme={theme}>
            <CssBaseline>
              <App />
            </CssBaseline>
          </ThemeProvider>
        </StyledEngineProvider>
      </ApolloProvider>
    );
  };

  render(<Root />, document.getElementById('root'));

我认为问题在于styles.tsx 不在index.tsx 范围内。所以当浏览器加载文件时它没有themeprovider上下文。

我应该只移动组件中的所有样式吗?还是有别的办法?

// 编辑 //

使用样式化 api 创建样式:

// styles.tsx

export const Logo = styled(Box)(({theme}) => ({
  'fontSize': '2em',
  'fontFamily': 'Oleo Script Swash Caps',
  'background': 'transparent',
  'border': 'none',
  'marginLeft': theme.spacing(1),
  'width': '41px',
  'overflow': 'hidden',
  'transition': 'all 0.1s ease-out',
  'cursor': 'pointer',
  '&:hover': {
    color: purple[700],
  },
}));
// DrawerContainer.tsx

  <Link data-cy='btn_home' to='/'>
    <Logo component='button'>Movieseat</Logo>
  </Link>

我有点不喜欢这种语法,不清楚Logo是什么类型的对象。

【问题讨论】:

    标签: reactjs material-ui jss


    【解决方案1】:

    请参阅this 答案以获取更多详细信息。简而言之,makesStyles/withStyles 不再是 MUI v5 中的第一类 API,并计划在 v6 中删除。如果您使用旧 API,则必须自己添加主题。

    在 v4 中,您可以从 @material-ui/core/stylesimport makeStyles,而无需提供自定义主题。您可以在 v5 中执行相同的操作,但仅限所有 MUI 组件内部使用的 with the new styled API

    【讨论】:

    • Styled api 使用添加的样式创建了一个新组件,对吧?我已经用我现在的编码方式更新了我的问题,你能看一下吗?
    • @PeterBoomsma 你对styled()有什么问题,你还有同样的错误吗?
    • 没有错误。一切都按预期工作。只是想知道这种带有styled() 组件的方法是否有意义。
    • @PeterBoomsma 对我来说看起来不错。 styled/sx prop 是 v5 中推荐使用的 2 个 API。如果要在使用 typescript 时添加 prop 类型。请参阅this 一个小时前我刚刚写的答案。阅读 this 文档部分以了解更多信息。
    猜你喜欢
    • 2021-12-03
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2021-10-30
    • 2021-12-19
    相关资源
    最近更新 更多