Material-UI 主题停止工作 升级@material-ui/core & @material-ui/styles (REACT & Next.js)
Material-UI Theme stopped working Upgrading @material-ui/core & @material-ui/styles (REACT & Next.js)
我刚刚升级了包@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 实现有任何变化。
我不确定这是否会对您的特定问题有所帮助,但我可以分享一些我在使用 Material UI 软件包时遇到的一些坑,这些坑会导致您的行为解释了。
- 确保您的项目依赖项仅包含每个
@material-ui
包的一个版本。 styles
如果项目中存在多个样式版本,则应用效果不佳。
- 确保您使用的所有
@material-ui
包都更新到最新版本。如果您错过升级,它们可能不会很好地协同工作。
- 尝试与
<ThemeProvider>
一起使用 @material-ui/core/styles
中的 <MuiThemeProvider>
(或将其替换为)。我前段时间在使用版本 4 时遇到了这个问题。如果我没记错的话,那是因为我的项目同时使用了 class 和功能组件。
我正在使用 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();
}
}
}
我刚刚升级了包@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 实现有任何变化。
我不确定这是否会对您的特定问题有所帮助,但我可以分享一些我在使用 Material UI 软件包时遇到的一些坑,这些坑会导致您的行为解释了。
- 确保您的项目依赖项仅包含每个
@material-ui
包的一个版本。styles
如果项目中存在多个样式版本,则应用效果不佳。 - 确保您使用的所有
@material-ui
包都更新到最新版本。如果您错过升级,它们可能不会很好地协同工作。 - 尝试与
<ThemeProvider>
一起使用@material-ui/core/styles
中的<MuiThemeProvider>
(或将其替换为)。我前段时间在使用版本 4 时遇到了这个问题。如果我没记错的话,那是因为我的项目同时使用了 class 和功能组件。
我正在使用 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();
}
}
}