javascript - Next js 服务器错误:元素类型无效:需要一个字符串(用于内置组件)或一个类/函数,但得到:未定义
问题描述
我试图了解为什么会出现以下服务器错误。
错误:元素类型无效:应为字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。您可能忘记从定义组件的文件中导出组件,或者您可能混淆了默认导入和命名导入。
我的_document.js
样子是这样的:
// eslint-disable-next-line @next/next/no-document-import-in-page
import React from "react";
// eslint-disable-next-line @next/next/no-document-import-in-page
import Document, { Html, Head, Main, NextScript } from "next/document";
import { ServerStyleSheets } from "@material-ui/core/styles";
export default class MyDocument extends Document {
render() {
return (
<Html lang="en">
<Head>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin />
<link
href="https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@100&display=swap"
rel="stylesheet"
/>
</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) => {
// 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({
// eslint-disable-next-line react/display-name
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(),
],
};
};
该错误特别指向这一行:
ctx.renderPage = () =>
originalRenderPage({
enhanceApp: (App) => (props) => sheets.collect(<App {...props} />),
});
UDPATE:我的_app.js
文件如下所示:
import React from "react";
import PropTypes from "prop-types";
import { ThemeProvider } from "@material-ui/core/styles";
import CssBaseline from "@material-ui/core/CssBaseline";
import theme from "../src/theme";
export default function MyApp({ Component, pageProps }) {
React.useEffect(() => {
// Remove the server-side injected CSS.
const jssStyles = document.querySelector("#jss-server-side");
if (jssStyles) {
jssStyles.parentElement.removeChild(jssStyles);
}
}, []);
console.log("_app.js", theme);
return (
<React.Fragment>
<ThemeProvider theme={theme}>
{/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}
<CssBaseline />
<Component {...pageProps} />
</ThemeProvider>
</React.Fragment>
);
}
MyApp.propTypes = {
Component: PropTypes.elementType.isRequired,
pageProps: PropTypes.object.isRequired,
};
对可能发生的事情有任何想法吗?
解决方案
替换此行
从“@material-ui/core/styles”导入 { ThemeProvider };
和
从“@material-ui/styles/ThemeProvider”导入 ThemeProvider;
推荐阅读
- reactjs - 使用@apollo/react-hooks,react 应用程序在刷新过期时会严重崩溃
- database - 使用 PostgreSQL 进行数据库设计:实现外键和主键
- vue.js - 在类星体上导入蓝鸟
- google-sheets - 使用 Google QUERY 从其他列返回 MAX 值和相应值
- python - Python - 寻找最佳的单字符通配符组合
- reactjs - 如何在 React js 中使用 jquery ui 滑块
- google-bigquery - 加入条件下的 BigQuery 子查询
- reactjs - 如何在 react-native 中向此按钮添加导航
- python - 球的代码出现错误 - ball = Ball(canvas, paddle, 'red') TypeError: __init__() missing 1 required positional argument: 'color'
- javascript - 函数更新联系人未定义,虽然已定义