You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS中useUserAuthContext导出函数调用时报错:不是函数

NextJS Context 使用报错解决

问题现象

使用自定义的useUserAuthContext钩子时出现报错,初始错误提示:

TypeError: (0 , _context_user_auth_context__WEBPACK_IMPORTED_MODULE_2__.useUserAuthContext) is not a function or its return value is not iterable
    at Home (./src/app/page.js:14:93)
    at stringify (<anonymous>)

后续测试时错误变为:

src\app\page.js (5:30) @ useUserAuthContext
 ⨯ TypeError: (0 , _context_user_auth_context__WEBPACK_IMPORTED_MODULE_2__.useUserAuthContext) is not a function
    at Home (./src/app/page.js:14:93)
    at stringify (<anonymous>)
digest: "1948578294"
  3 |
  4 | export default function Home() {
> 5 |   const a = useUserAuthContext();
    |                              ^

相关代码

Context 定义文件(src/app/context/user-auth.context.js)

"use client";

import { createContext, useContext, useState } from "react";

const UserAuthContext = createContext();

export function UserAuthWrapper({ children }) {
  const [user, setUser] = useState({ name: "test user" });

  return (
    <UserAuthContext.Provider value={[user, setUser]}>
      {children}
    </UserAuthContext.Provider>
  );
}

export function useUserAuthContext() {
  return useContext(UserAuthContext);
}

RootLayout 使用(src/app/layout.js)

import { Inter } from "next/font/google";
import "./globals.css";
import { UserAuthWrapper } from "./context/user-auth.context";

const inter = Inter({ subsets: ["latin"] });

export const metadata = {
  title: "Create Next App",
  description: "Generated by create next app",
};

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <UserAuthWrapper>{children}</UserAuthWrapper>
      </body>
    </html>
  );
}

Home 页面调用代码

import { useUserAuthContext } from "./context/user-auth.context";

export default function Home() {
  const [user, setUser] = useUserAuthContext();
  return (
    <main className="flex min-h-screen flex-col items-center justify-between p-24">
      <div>{user.name}</div>
    </main>
  );
}

更新测试后的Home页面代码

import Image from "next/image";
import { useUserAuthContext } from "./context/user-auth.context";

export default function Home() {
  const a = useUserAuthContext();
  console.log(a);

  const [user, setUser] = useUserAuthContext();
  return (
    <main className="flex min-h-screen flex-col items-center justify-between p-24">
      <div>{user.name}</div>
    </main>
  );
}

文件结构

src/
├─ app/
│  ├─ context/
│  │  └─ user-auth.context.js
│  ├─ layout.js
│  └─ page.js
├─ globals.css

解决步骤

  1. 标记Home页面为客户端组件
    在page.js顶部添加"use client";指令,因为App Router中默认组件是服务器组件,无法使用React Hooks:

    "use client";
    
    import { useUserAuthContext } from "./context/user-auth.context";
    
    export default function Home() {
      const [user, setUser] = useUserAuthContext();
      return (
        <main className="flex min-h-screen flex-col items-center justify-between p-24">
          <div>{user.name}</div>
        </main>
      );
    }
    
  2. 给Context添加默认值
    避免组件未被Provider包裹时useContext返回undefined,创建Context时传入默认值:

    // 在user-auth.context.js中修改
    const UserAuthContext = createContext([{}, () => {}]);
    
  3. 验证文件扩展名
    确保user-auth.context.js的扩展名是.js或.jsx,保证NextJS能正确识别为React文件。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:36:00