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

React自定义Hook报错:useScrollPosition不是函数求助

解决自定义Hook导入后报错“is not a function”的问题

问题场景

编写了带"use client"指令的useScrollPosition Hook:

"use client";
import { useEffect, useState } from "react";

export const useScrollPosition = () => {
  const [scrollPosition, setScrollPosition] = useState(0);

  useEffect(() => {
    const updatePosition = () => {
      setScrollPosition(window.pageYOffset);
    };

    window.addEventListener("scroll", updatePosition);
    updatePosition();

    return () => window.removeEventListener("scroll", updatePosition);
  }, []);

  return scrollPosition;
};

export default useScrollPosition;

在Header组件中导入使用时出现报错:Error: _app_hooks_useScrollPosition__WEBPACK_IMPORTED_MODULE_3___default(...) is not a function,已尝试修改文件后缀(tsx/ts/js)、确认导入路径正确,但问题依旧,且代码在其他项目可正常运行。

可行解决方案

1. 给使用Hook的组件添加"use client"声明

如果是在Next.js 13+ App Router环境下,默认组件是Server Component,无法直接调用客户端Hook。必须给Header组件文件也添加"use client"指令,将其声明为Client Component:

"use client"; // 必须添加这一行
import useScrollPosition from "../app/hooks/useScrollPosition";

export function Header() {
  const scrollPosition = useScrollPosition();
  console.log(scrollPosition);
  // 其他组件逻辑
}

2. 统一导出/导入方式,避免混合导出

Hook文件同时使用了命名导出和默认导出,可能导致编译解析混淆。可以统一为其中一种方式:

  • 方案一:仅保留默认导出
    修改Hook文件:
    "use client";
    import { useEffect, useState } from "react";
    
    const useScrollPosition = () => {
      // 原逻辑不变
    };
    
    export default useScrollPosition;
    
  • 方案二:仅保留命名导出,修改导入方式
    修改Hook文件:
    "use client";
    import { useEffect, useState } from "react";
    
    export const useScrollPosition = () => {
      // 原逻辑不变
    };
    
    组件中对应修改导入:
    "use client";
    import { useScrollPosition } from "../app/hooks/useScrollPosition"; // 用花括号导入命名导出
    

3. 清理缓存并重启开发服务器

Next.js的开发缓存可能导致模块解析异常,执行以下操作:

  • 停止当前开发服务器(Ctrl+C)
  • 删除项目根目录下的.next文件夹和node_modules/.cache目录
  • 可选:重新执行npm install或yarn install
  • 重启开发服务器(npm run dev或yarn dev)

4. 检查tsconfig.json配置正确性

确保tsconfig.json的compilerOptions包含React相关的正确配置,示例如下:

{
  "compilerOptions": {
    "jsx": "preserve",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "target": "ES2020",
    "lib": ["dom", "dom.iterable", "esnext"],
    "strict": true,
    "esModuleInterop": true
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:55:22