【问题标题】:Material-UI Theme stopped working Upgrading @material-ui/core & @material-ui/styles (REACT & Next.js)Material-UI 主题停止工作升级 @material-ui/core & @material-ui/styles (REACT & Next.js)
【发布时间】:2020-05-04 19:21:36
【问题描述】:

我刚刚升级了包@material-ui/core*(4.4.1 => 4.8.3)* & @material/styles*(4.4.1 = 4.8.2)*

现在使用主题的所有内容都不会应用正确的颜色和边距。

主题包中是否有我不知道的重大变化?

我正在使用 Next.js 进行服务器渲染。重要提示:在升级软件包之前一切正常。降级不是一种选择,因为我需要访问在较新版本中发布的组件之一。此外,我不想因此将自己锁定在较低版本上。

编辑:代码清晰

_app.js

<Provider store={store}>
  <PersistGate persistor={store.__PERSISTOR} loading={null}>
    <ThemeProvider theme={theme}>
      <CssBaseline />
      <Component {...pageProps} user={this.state.user} />
    </ThemeProvider>
  </PersistGate>
</Provider>

_document.js

 ctx.renderPage = () =>
    originalRenderPage({
      enhanceApp: App => props => sheets.collect(<App {...props} />)
    });

  const initialProps = await Document.getInitialProps(ctx);

  return {
    ...initialProps,
    // Styles fragment is rendered after the app and page rendering finish.
    styles: [
      <React.Fragment key="styles">
        {initialProps.styles}
        {sheets.getStyleElement()}
      </React.Fragment>
    ]
  };

这一切都非常类似于提供的 Material-UI 示例。而且我没有看到他们的 git repo 中的 nextjs 实现有任何变化。

【问题讨论】:

  • 你能把你的代码发给我们吗?我去看看。
  • 为清楚起见添加了代码

标签: reactjs themes material-ui next.js


【解决方案1】:

我不确定这是否会对您的特定问题有所帮助,但我可以分享一些我在使用 Material UI 包近两年时遇到的一些坑,这些坑都会导致您所解释的行为。

  • 确保您的项目依赖项仅包含每个 @material-ui 包的一个版本。如果项目中存在多个样式版本,styles 将不适用。
  • 确保您使用的所有@material-ui 软件包都已更新到最新版本。如果您错过升级,它们可能无法很好地协同工作。
  • 尝试与&lt;ThemeProvider&gt;一起使用&lt;MuiThemeProvider&gt; 来自@material-ui/core/styles(或替换为)。前段时间我在使用版本 4 时遇到了这个问题。如果我没记错的话,那是因为我的项目同时使用了类和函数式组件。

【讨论】:

  • 嘿 - 这有帮助。现在似乎有一个与 /core 一起打包的 Styles 文件夹。删除 Styles 依赖项并在我引用 /styles 的任何地方引用 /core/styles 直接解决了它。谢谢!
  • 我刚刚引用了文档中的一句话:@material-ui/styles is re-exported as @material-ui/core/styles - you only need to install it if you wish to use it independently from Material-UI. 我很确定你可以让它们和谐地工作,但如果没有必要,何必费心呢。很高兴能帮上忙!
  • 在 4.9.11 使用 @material-ui/core 我遇到了同样的问题。用 MuiThemeProvider 替换 ThemeProvider 解决了这个问题。
  • 哇,你绝对的救命稻草 - 我将导入从 @material-ui/styles 更改为 @material-ui/core/styles,一切都恢复正常了
【解决方案2】:

我正在使用 Nextjs v9.3 并配置 material-ui 如下

_app.js

import React, { useEffect } from "react";
import { ThemeProvider } from "@material-ui/core/styles";
import { CssBaseline } from "@material-ui/core";

import { theme } from "../lib/theme";

function MyApp(props) {
  useEffect(() => {
    const jssStyles = document.querySelector("#jss-server-side");
    if (jssStyles && jssStyles.parentNode)
      jssStyles.parentNode.removeChild(jssStyles);
  }, []);
  const { Component, pageProps } = props;
  return (
    <ThemeProvider theme={theme}>
      <CssBaseline />
      <Component {...pageProps} />
    </ThemeProvider>
  );
}

export default MyApp;

_document.js

import React from "react";
import NextDocument from "next/document";
import { ServerStyleSheets as MaterialUiServerStyleSheets } from "@material-ui/core/styles";
import flush from "styled-jsx/server";

export default class Document extends NextDocument {
  static async getInitialProps(ctx) {
    const materialUiSheets = new MaterialUiServerStyleSheets();
    const originalRenderPage = ctx.renderPage;

    try {
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: App => props =>
            materialUiSheets.collect(<App {...props} />)
        });

      const initialProps = await NextDocument.getInitialProps(ctx);

      return {
        ...initialProps,
        styles: [
          <React.Fragment key="styles">
            {initialProps.styles}
            {materialUiSheets.getStyleElement()}
          </React.Fragment>
        ]
      };
    } finally {
      flush();
    }
  }
}

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2018-06-24
    • 2019-09-14
    • 2020-04-07
    • 2020-06-04
    • 1970-01-01
    相关资源
    最近更新 更多