React/Next.js 对象不是函数
2018-04-25
6495
我正在使用 Next.js 呈现应用程序。在我的页面中,我有 /index,它包装在我的仪表板布局中。这完全没问题,没有任何问题。
我的页面中还有 /item 和 /add-item,它们也包装在我的仪表板布局中,但是当我调用 /index 以外的任何内容时,我收到以下错误:
TypeError: Object(...) is not a function
at Object../pages/index/index.js (C:\Users\User\Documents\Projects\Project\project-next\src\.next\dist\bundles\pages\item.js:2837:138)
让我困惑的是,为什么 /item 在 /index 处失败,而直接转到 /index 可以正常工作。 如果我像这样注释掉 /index 中的导出,那么转到 /item 或任何其他包装在 Dashboard 中的页面都可以:
//export default Dashboard(Index);
我的文件如下:
/layout/Dashboard/index.js
import React from 'react';
import Head from 'next/head';
import hoistNonReactStatics from 'hoist-non-react-statics';
import Header from './Header';
import Sidebar from './Sidebar';
import Login from '../../pages/login';
import checkUser from '../../utils/checkUser';
import redirect from '../../utils/redirect';
import './normalize.less';
import styles from './styles.less';
const Dashboard = ComposedComponent => {
class Decorator extends React.Component {
static async getInitialProps(ctx) {
const props = {
isAuthenticated: true,
data: {
name: 'dave',
},
};
return props;
}
render() {
if (!this.props.isAuthenticated) {
return <Login />;
}
const layout = children => (
<React.Fragment>
<Head>
<title>Project</title>
<link
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://unpkg.com/antd@3/dist/antd.min.css"
/>
<link
rel="apple-touch-icon"
sizes="57x57"
href="../static/icons/apple-icon-57x57.png"
/>
<link
rel="apple-touch-icon"
sizes="60x60"
href="../static/icons/apple-icon-60x60.png"
/>
<link
rel="apple-touch-icon"
sizes="72x72"
href="../static/icons/apple-icon-72x72.png"
/>
<link
rel="apple-touch-icon"
sizes="76x76"
href="../static/icons/apple-icon-76x76.png"
/>
<link
rel="apple-touch-icon"
sizes="114x114"
href="../static/icons/apple-icon-114x114.png"
/>
<link
rel="apple-touch-icon"
sizes="120x120"
href="../static/icons/apple-icon-120x120.png"
/>
<link
rel="apple-touch-icon"
sizes="144x144"
href="../static/icons/apple-icon-144x144.png"
/>
<link
rel="apple-touch-icon"
sizes="152x152"
href="../static/icons/apple-icon-152x152.png"
/>
<link
rel="apple-touch-icon"
sizes="180x180"
href="../static/icons/apple-icon-180x180.png"
/>
<link
rel="icon"
type="image/png"
sizes="192x192"
href="/android-icon-192x192.png"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="../static/icons/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="96x96"
href="../static/icons/favicon-96x96.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="../static/icons/favicon-16x16.png"
/>
<link rel="manifest" href="../static/icons/manifest.json" />
<meta name="msapplication-TileColor" content="#ffffff" />
<meta
name="msapplication-TileImage"
content="../static/icons/ms-icon-144x144.png"
/>
<meta name="theme-color" content="#ffffff" />
<script
defer
src="https://use.fontawesome.com/releases/v5.0.8/js/all.js"
integrity="sha384-SlE991lGASHoBfWbelyBPLsUlwY1GwNDJo3jSJO04KZ33K2bwfV9YBauFfnzvynJ"
crossOrigin="anonymous"
/>
</Head>
<div>
<Header />
<Sidebar user={this.props.data} />
<div className={styles.content}>{children}</div>
</div>
</React.Fragment>
);
return layout(
<React.Fragment>
<ComposedComponent {...this.props} />
</React.Fragment>
);
}
}
hoistNonReactStatics(Decorator, ComposedComponent);
return Decorator;
};
export default Dashboard;
/pages/item/index.js
import React from 'react';
import Dashboard from '../../layout/Dashboard';
import styles from './styles.less';
class Item extends React.Component {
constructor() {
super();
this.state = {
loaded: true
};
}
render() {
return (
<div>
<p>Item</p>
</div>
);
}
}
export default Dashboard(Item);
最后
/pages/index/index.js
import React from 'react';
import Dashboard from '../../layout/Dashboard';
import styles from './styles.less';
class Index extends React.Component {
constructor() {
super();
this.state = {};
}
render() {
return (
<div>
<p>Index</p>
</div>
);
}
}
export default Dashboard(Index);
正如我所说,转到
localhost:3008
可以很好地加载 Dashboard 布局中的 index。转到任何其他加载 Dashboard 布局的地方,即本例中的 item,都会引发错误
3个回答
我遇到了同样的问题,我将包 JSON 中的 react 和 react-dom 版本更改为“next”,问题就解决了。
"react": "next",
"react-dom": "next"
Prabhu
2020-12-07
您应该从 nextjs 导入 useRouter,而不是从 react 导入
正确:
import { useRouter } from 'next/router'
错误:
import { useRouter } from 'react';
cahit beyaz
2021-01-10
使用 nextjs,您应该在
pages
文件夹中每个页面只有一个文件。我看到您有类似
/pages/item.index.js
的文件。请尝试使用如下模式:
-
pages
- page1.js
- page2.js
-
components
-
page1
- page-1-component-1.js
- page-1-component-2.js
-
page2
- page2-component.js
-
page1
Carmelo Catalfamo
2018-04-25