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

React Native中useEffect调用报错:Invalid hook call问题求助

解决React Native中Invalid Hook Call错误(事件处理函数内调用useEffect)

兄弟,你这个错误的原因非常明确——你违反了React Hooks的核心规则:Hooks只能在函数组件的顶层作用域或者自定义Hook的顶层调用,绝对不能放在事件处理函数、循环、条件判断这类嵌套逻辑里!

看你的代码,在handleLoginPress这个登录按钮的点击事件处理函数里,你直接调用了useEffect,这完全踩了Hook规则的红线,React肯定会报错。而且更关键的是,这里你根本不需要用useEffect啊!你就是想在登录请求成功后更新全局的用户状态,直接调用setUser就行,完全没必要绕个Hook的弯子。

另外我还发现你代码里的几个小问题,一起给你修正了:

  1. responseData变量没有声明,要加const
  2. setLocalStorageUser函数的调用参数错了,而且AsyncStorage只能存储字符串,需要把用户数据JSON序列化
  3. 原来的setLocalStorageUser函数定义也有问题,直接调用AsyncStorage.setItem更直观

下面是修正后的完整handleLoginPress函数:

const handleLoginPress = async () => {
  try {
    const loginData = {
      username: email,
      password: password,
    }
    // 声明responseData变量
    const responseData = await axios.post(loginURL, loginData);
    // 将用户数据序列化为字符串后存入AsyncStorage
    const userData = JSON.stringify({email: email, token: responseData.token});
    await AsyncStorage.setItem('user', userData);
    // 直接更新全局状态,不需要useEffect
    setUser({email: email, token: responseData.token});
    // 登录成功后再跳转到首页,放在try块里更合理
    navigation.navigate('Home');
  } catch (error) {
    console.log(error);
    // 这里可以加个用户友好的错误提示,比如用Alert弹窗告知登录失败
  }
}

顺便再给你回顾下React Hooks的两条核心规则,避免以后再踩坑:

  • 只在React函数组件的顶层调用Hooks,不要在嵌套函数、循环、条件里用
  • 只在React函数组件或者自定义Hook里调用Hooks,普通JavaScript函数里不能用

这样修改后,你的登录逻辑就能正常工作,那个Hook错误也会消失啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:42:52