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

移至src目录后Context Hook中signin函数未执行问题求助

问题:Context Hook实现的signin方法未执行,调用时无任何反应

我尝试用Context Hook实现signin方法,但该方法在AuthContext文件内完全没执行。从首页调用时,signin里的console.log和setUser都没运行,怎么解决?


相关代码文件

_app.tsx

import '../styles/globals.css'
import type { AppProps } from 'next/app'
import {AuthProvider} from '../contexts/AuthContext'

export default function App({ Component, pageProps }: AppProps) {
  return (
    <AuthProvider>
      <Component {...pageProps} />
    </AuthProvider>
  )
}

AuthContext.tsx

import { createContext, useState } from "react";

type AuthContextType = {
  user: FirebaseUserAuth | null;
  signin: (email: string, password: string) => void
}

const initialValue: AuthContextType= {
  user: null,
  signin: (email: string, password: string) => {}
}

export const AuthContext = createContext(initialValue);

export const AuthProvider = ({children}: PropsWithChildren) => {

  const [user, setUser] = useState<FirebaseUserAuth | null>(initialValue.user)

  const signin = (email: string, password: string) => {
    console.log("SIGNIN FROM AUTHCONTEXT")
    setUser({
      uid: "a",
      email: "b",
      name: "c"
    })
    
  }

  return (
    <AuthContext.Provider 
      value={{
        user,
        signin
      }}
    >
      {children}
    </AuthContext.Provider>
  )
}

index.tsx

import { NextPage } from 'next'
import { FormEvent, useContext } from 'react'
import { AuthContext } from '../contexts/AuthContext'

const Home: NextPage = () => {

  const { user, signin } = useContext(AuthContext)

  function handleSubmit(e: FormEvent<HTMLFormElement>) {
    e.preventDefault()
    const email = e.currentTarget.email.value
    const password = e.currentTarget.password.value
    console.log(email, password)
    signin(email, password)
    
  }
  
  return (
    <>
      <h1>User: {user?.name}</h1>
      <form onSubmit={handleSubmit}>
        <input type="text" name='email' id='email'/>
        <input type="text" name='password' id='password'/>
        <button type='submit'>SignIn</button>
      </form>
      
    </>
  )
}
export default Home

补充信息

文件夹结构如下,且仅当将context、pages、styles文件夹移至src目录时才会出现此问题:

Project
-- .next
-- node_modules
-- public
-- src
  |-- context
  |-- pages
  |-- styles

解决方法

这个问题核心是导入路径不匹配,文件移到src目录后,你代码里的导入路径和实际文件夹结构不一致,导致调用的是初始值里的空signin函数,而非AuthProvider中定义的方法。

1. 修正所有文件的导入路径

你的文件夹结构里是src/context,但代码里导入的是../contexts/AuthContext(多了个s),这是关键错误。

  • _app.tsx修正导入:
    import {AuthProvider} from '../context/AuthContext'
    
  • index.tsx修正导入:
    import { AuthContext } from '../context/AuthContext'
    

2. 补充缺失的类型定义

AuthContext代码里用了PropsWithChildren和FirebaseUserAuth但未导入/定义,会导致TS报错,间接影响代码运行:

// 在AuthContext.tsx顶部补充
import { createContext, useState, PropsWithChildren } from "react";

// 定义FirebaseUserAuth类型(或从firebase/auth导入官方类型)
type FirebaseUserAuth = {
  uid: string;
  email: string;
  name?: string;
};

3. 重启开发服务器

路径变更后,需要重启Next.js开发服务器才能生效,避免缓存导致的旧代码运行。

完成以上步骤后,提交表单就能看到控制台输出SIGNIN FROM AUTHCONTEXT,页面也会显示User: c,说明signin方法正常执行了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:01:02