搜尋

首頁  >  問答  >  主體

使用"use client"指令在文件頂部添加,TypeError: createContext僅適用於客戶端元件

我創建了一個全新的 Next.js 應用程序,它使用 app 資料夾。然後我安裝了 Materiel UI 並開始使用文件中給出的範例。但我收到此錯誤:

類型錯誤:createContext 僅適用於客戶端元件。在檔案頂部新增“use client”指令以使用它。

這是我的程式碼中文件的範例:

import Button from "@mui/material/Button";

export default function Home() {
  return (
    <div>
      <Button variant="contained">Hello World</Button>
    </div>
  );
}

我希望該按鈕顯示在我的頁面上。我知道在頂部添加 "use client" 將修復錯誤,但我希望我的頁面在伺服器上渲染。

P粉811349112P粉811349112399 天前899

全部回覆(2)我來回復

  • P粉642436282

    P粉6424362822023-10-26 13:18:31

    要讓MUI 與SSR 完美配合,您需要做一些調整:https://github.com/mui/material-ui/tree/master/examples/material-next-app-router-ts

    注意:即使您配置正確,按鈕也可以在伺服器端呈現,但您無法指派 onClick 處理程序(如果我沒記錯的話)

    回覆
    0
  • P粉502608799

    P粉5026087992023-10-26 00:38:54

    顯然,您要匯入的按鈕正在使用客戶端掛鉤,在本例中為createContext。為此,您需要在文件頂部添加“use client”。但這意味著該頁面成為客戶端元件,並且沒有不再是伺服器元件

    如果這讓您煩惱,您可以在與app 同一級別創建一個lib 資料夾,在其中添加mui.js< /code> 文件,如下所示:

    // lib/mui.js
    
    "use client";
    
    export * from "@mui/material";
    

    然後您從那裡導入它(這樣,頁面的其他部分仍然是伺服器元件):

    // app/page.js
    
    import { Button } from "../lib/mui";
    
    export default function Home() {
      return (
        <div>
          <Button variant="contained">Hello World</Button>
        </div>
      );
    }
    

    旁注,您在設定上下文時可能會遇到類似的錯誤。這意味著您正在嘗試在伺服器元件中設定它。 指南是將其新增至自己的「使用客戶端」標記檔案:

    // app/theme-provider.tsx
    
    "use client";
    
    import { createContext } from "react";
    
    export const ThemeContext = createContext("");
    
    export default function ThemeProvider({ children }) {
      return (
        <ThemeContext.Provider value="dark">
          {children}
        </ThemeContext.Provider>
      );
    }

    並從那裡導入它:

    // app/layout.js
    
    import ThemeProvider from './theme-provider';
     
    export default function RootLayout({ children }) {
      return (
        <html>
          <body>
            <ThemeProvider>{children}</ThemeProvider>
          </body>
        </html>
      );
    }

    要獲得更詳細的答案,請查看此 線程

    回覆
    0
  • 取消回覆