函数的返回值不可迭代

问题描述 投票:0回答:1

我正在使用next14.2.4和mui5.15.20构建一个项目。这是我遇到问题的代码部分。

主题.js

"use client";
import { createTheme } from "@mui/material";
import { createContext, useMemo, useState } from "react";

//use different color palette for dark mode and white mode
export const tokens = (mode) => ({
  ...(mode === "dark"
    ? {
        white: {
          100: "#ffffff",
          200: "#fefdfc",
         //and so on
        },
        black: {
         //same as above
        },
        brown: {
          //same as above
        },
      }
    : {
        white: {
          //same as above
        },
        black: {
          //same as above
        },
        brown: {
          //same as above
        },
      }),
});

//mui theme settings
export const themeSettings = (mode) => {
  const colors = tokens(mode);

  return {
    palette: {
      mode: mode,
      ...(mode === "dark"
        ? {
            primary: {
              main: colors.black[500],
            },
            secondary: {
              main: colors.white[500],
            },
            background: {
              default: colors.black[500],
            },
          }
        : {
            primary: {
              main: colors.white[500],
            },
            secondary: {
              main: colors.black[500],
            },
            background: {
              default: colors.white[500],
            },
          }),
    },
    typography: {
      fontFamily: ["Source Sans Pro", "sans-serif"].join(","),
      fontSize: 15,
    },
  };
};

export const ColorModeContext = createContext({
  toggleColorMode: () => {},
});

// theme.js
export const useMode = () => {
  const [mode, setMode] = useState("dark");
  const colorMode = useMemo(
    () => ({
      toggleColorMode: () =>
        setMode((prev) => (prev === "light" ? "dark" : "light")),
    }),
    []
  );
  const theme = useMemo(() => createTheme(themeSettings(mode)), [mode]);
  return [theme, colorMode];
};

为了在我的项目中使用上述自定义主题,我在 laayout.js 中做了以下操作。

import { AppRouterCacheProvider } from "@mui/material-nextjs/v13-appRouter";
import { CssBaseline, ThemeProvider } from "@mui/material";
import { ColorModeContext, useMode } from "./theme";
import "./globals.css";

export const metadata = {
  title: "Blog App",
  description: "Simple blog app",
};

export default function RootLayout({ children }) {
  const [theme, mode] = useMode();
  return (
    <html lang="en">
      <body>
        <AppRouterCacheProvider>
          <ColorModeContext.Provider value={colorMode}>
            <ThemeProvider theme={theme}>
              <CssBaseline />
              {children}
            </ThemeProvider>
          </ColorModeContext.Provider>
        </AppRouterCacheProvider>
      </body>
    </html>
  );
}

但它显示以下错误:

Error: (0 , _theme__WEBPACK_IMPORTED_MODULE_1__.useMode) is not a function or its return value is not iterable

如何解决?

这是在最新的 Nextjs 中使用 MUI 的正确方法吗?因为我在某个地方看到我们必须在 src 目录中创建 .js 文件才能使用它?

reactjs next.js material-ui react-context nextjs14
1个回答
0
投票

您的

layout.js
是一个服务器组件,请在其顶部添加
"use client"

© www.soinside.com 2019 - 2024. All rights reserved.