材质 UI + Nextjs:抽屉

IT技术 reactjs material-ui next.js
2021-05-06 09:27:52

我的 React Nextjs 项目中 Material UI Drawer 的实现有问题。

问题是当我在导航器中重新加载页面时,抽屉和应用栏的样式崩溃了。这在我重新加载服务器时没有发生,只是在页面重新加载时发生。

在此处输入图片说明

目前我不知道我必须尝试解决这个问题,我不知道为什么会发生这种情况,因为我唯一能做的就是打印和粘贴示例 o material UI https ://material-ui.com/components/drawers/#drawer在布局组件中,而不是在页面中。

4个回答

那是因为 NextJS 使用 SSR。在 Material UI 文档中,有一部分完全专用于 NEXTJS:

https://material-ui.com/styles/advanced/#next-js

或者,如果你愿意,你可以检查 material-ui repo(查看 _app.js 和 _document.js)

https://github.com/mui-org/material-ui/tree/master/examples/nextjs

我也遇到了这个问题并找到了解决方案。

问题源于这样一个事实,即 Mui (MakeStyles) 获取您的 CSS 类名称并尝试创建唯一名称以避免冲突。

你可以在这里阅读:https : //material-ui.com/styles/advanced/#next-js

当我们进行静态导出时,预渲染的 html 文件引用的类名与 /_next/ 文件夹中定义的类名不同。

在上面的文档中提到,如果满足三个条件,类名是确定性的(阅读上文)。我的解决方案只是将我的样式表命名为以“Mui”开头的名称。然后类名在预渲染的 html 和 /_next/ 中的 JS 中是相同的。

    const useStyles = makeStyles(theme => (
          {
              ...
          }), 
          {
              name: "MuiCustomStyle"
          });

我确定这不是一个“正确”的解决方案,但它为我解决了这个问题。

如果按照 Material-UI NextJS 示例中的建议修改应用程序没有帮助,您可以延迟加载您的组件。这样,您将仅在加载客户端后强制它创建样式。

为组件禁用 SSR 的指南:https : //nextjs.org/docs/advanced-features/dynamic-import#with-no-ssr

import dynamic from 'next/dynamic'

export const ComponentWithNoSSR = dynamic(() => import('./Component'), {
  ssr: false,
})

我遇到过同样的问题。所以这是解决方案

https://codeload.github.com/mui-org/material-ui/tar.gz/master

从那个 URL 材料下载 UI+NextJS 样板代码

下载 tar.gz 文件 > material-ui-master > examples > nextJS