Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将材质UI与Next.js一起使用?_Javascript_Reactjs_Material Ui_Next.js_Server Side Rendering - Fatal编程技术网

Javascript 如何将材质UI与Next.js一起使用?

Javascript 如何将材质UI与Next.js一起使用?,javascript,reactjs,material-ui,next.js,server-side-rendering,Javascript,Reactjs,Material Ui,Next.js,Server Side Rendering,我希望在我的React应用程序中使用带有材质UI的Next.js。我一直在关注这个问题 虽然,当我尝试运行next dev或next build时,会出现以下错误 我已经运行了npm ls react,以确保我只有一个版本的react,并确认react dom和react是相同的版本(6.13.1) 它似乎将原始渲染页面视为一个钩子。尽管如此,该官员还详细说明了自定义文档页面,并在类组件中具有相同的原始渲染页面 我已经尝试将\u document.js组件转换为功能组件而不是类,但它不起作用

我希望在我的React应用程序中使用带有材质UI的Next.js。我一直在关注这个问题

虽然,当我尝试运行
next dev
next build
时,会出现以下错误

我已经运行了
npm ls react
,以确保我只有一个版本的
react
,并确认
react dom
react
是相同的版本(6.13.1)

它似乎将
原始渲染页面
视为一个钩子。尽管如此,该官员还详细说明了自定义文档页面,并在类组件中具有相同的
原始渲染页面

我已经尝试将
\u document.js
组件转换为功能组件而不是类,但它不起作用

\u document.js
页面的内容(直接来自上面的Material UI/Next.js示例)包括:

从“React”导入React;
从“next/Document”导入文档,{Html,Head,Main,NextScript};
从“@material ui/core/styles”导入{ServerStyleSheets}”;
从“./组件/主题”导入主题;
导出默认类MyDocument扩展文档{
render(){
返回(
{/*PWA原色*/}
);
}
}
//`getInitialProps`属于`U文档`(而不是`U应用`),
//它与服务器端生成(SSG)兼容。
MyDocument.getInitialProps=async(ctx)=>{
//决议顺序
//
//在服务器上:
//1.app.getInitialProps
//2.page.getInitialProps
//3.document.getInitialProps
//4.app.render
//5.page.render
//6.document.render
//
//在服务器上,出现以下错误:
//1.document.getInitialProps
//2.app.render
//3.page.render
//4.document.render
//
//论客户
//1.app.getInitialProps
//2.page.getInitialProps
//3.app.render
//4.page.render
//呈现应用程序和页面,并获取包含收集的副作用的页面上下文。
const sheets=新服务器样式表();
const originalRenderPage=ctx.renderPage;
ctx.renderPage=()=>
原始渲染图({
enhanceApp:(应用)=>(道具)=>sheets.collect(),
});
const initialProps=wait Document.getInitialProps(ctx);
返回{
…初始道具,
//样式片段在应用程序和页面呈现完成后呈现。
样式:[…React.Children.toArray(initialProps.styles),sheets.getStyleElement(),
};
};

我从中派生了官方示例,在本地运行,运行起来没有问题。这让我相信这是一个只与codesandbox相关的错误。注意,请确保您至少使用了节点v10+,并在本地使用react 16.10+。此外,当存在无效的导入或无效的导入组件模块使用时,错误堆栈跟踪有时可能无效并指向错误的文件。也就是说,如果您仍然遇到问题,请发布一份github回购协议,并附上一个可复制的示例。在相关说明中,当我制作codesandbox示例时,我注意到
useRouter
不是从
next/router
导出的,而是导致了一个错误。再一次,这似乎是一个问题
import React from "react";
import Document, { Html, Head, Main, NextScript } from "next/document";
import { ServerStyleSheets } from "@material-ui/core/styles";
import theme from "../components/theme";

export default class MyDocument extends Document {
    render() {
        return (
            <Html lang="en">
                <Head>
                    {/* PWA primary color */}
                    <meta name="theme-color" content={theme.palette.primary.main} />
                </Head>
                <body>
                    <Main />
                    <NextScript />
                </body>
            </Html>
        );
    }
}

// `getInitialProps` belongs to `_document` (instead of `_app`),
// it's compatible with server-side generation (SSG).
MyDocument.getInitialProps = async (ctx) => {
    // Resolution order
    //
    // On the server:
    // 1. app.getInitialProps
    // 2. page.getInitialProps
    // 3. document.getInitialProps
    // 4. app.render
    // 5. page.render
    // 6. document.render
    //
    // On the server with error:
    // 1. document.getInitialProps
    // 2. app.render
    // 3. page.render
    // 4. document.render
    //
    // On the client
    // 1. app.getInitialProps
    // 2. page.getInitialProps
    // 3. app.render
    // 4. page.render

    // Render app and page and get the context of the page with collected side effects.
    const sheets = new ServerStyleSheets();
    const originalRenderPage = ctx.renderPage;

    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.Children.toArray(initialProps.styles), sheets.getStyleElement()],
    };
};