【问题标题】:Unhandled Rejection (Error): Invalid hook call. Hooks can only be called inside of the body of a function component未处理的拒绝(错误):无效的挂钩调用。 Hooks 只能在函数组件的主体内部调用
【发布时间】:2021-11-23 16:17:44
【问题描述】:

我在useEffect 函数中使用自定义挂钩时遇到问题。我已经用谷歌搜索了几个小时,但无法找到解决此问题的方法。这是我遇到问题的代码块:

  const [ stripeApiKey, setStripeApiKey ] = useState('');

  useEffect(() => {
    store.dispatch(loadUser())

    async function getStripeApiKey() {
      const { data } = await axios.get('/api/v1/stripeapi');
      setStripeApiKey(data.stripeApiKey)
    }

    getStripeApiKey();
  }, [])

我正在尝试使用自定义挂钩来设置 Stripe API 密钥,我想稍后在返回函数中使用它。但我收到以下错误: Invalid Hook Call Error

【问题讨论】:

  • 你是如何定义你的组件的——它是类组件还是功能组件? reactjs.org/docs/…
  • @alex 我将组件定义为功能组件。

标签: reactjs react-hooks use-effect use-state


【解决方案1】:

您可以阅读以响应文档 https://reactjs.org/docs/hooks-rules.html,其中声明 不要在循环、条件或嵌套函数中调用 Hooks

【讨论】:

  • 感谢您的解释,但我找不到他在循环或条件中使用钩子的地方。正如预期的那样,它在组件主体中直接使用。
  • 感谢您的回复。我之前确实查过它,但我没有找到任何解决这个问题的方法(或解决方法)。你能告诉我如何解决这个问题吗?我是新人,此刻感到迷茫。
【解决方案2】:

您可以使用useDispatch 钩子简单地解决此问题:

首先,导入它:

import {useDispatch} from 'react-redux';

其次,在你的组件内部:

// rest of codes
const [ stripeApiKey, setStripeApiKey ] = useState('');

const dispatch = useDispatch()
// rest of codes

现在,在useEffect 中使用您的dispatch 方法:

  useEffect(() => {
    dispatch(loadUser()) // -----> replaced 

    async function getStripeApiKey() {
       try{
          const { data } = await axios.get('/api/v1/stripeapi');
          setStripeApiKey(data.stripeApiKey)
       } catch (e) {
          console.log(e)
          // you can do anything here
       }
    }

    getStripeApiKey();
  }, [])

注意:始终在您的 async/await 实现中使用 try/catch 块,尤其是在处理 API 调用时。

【讨论】:

  • 感谢您的回复。我试过了,但在同一个地方仍然收到同样的错误(在附图中提供)。
  • 我通过使用 try/catch 块包装 API 调用函数来更新我的答案。请再试一次并告诉我反馈。谢谢@TomalSheikh
  • @novomino,还是不行。不过,其他人可能会从这个解决方案中受益。我相信您是一位经验丰富的开发人员。你认为这个问题是由我的应用程序中的任何其他代码块产生的吗?如果我删除它,该应用程序可以正常工作。还有这个问题是由于后端造成的吗?在这两种情况下,我都有疑问,但我仍然只是一个初学者。我感谢你的努力。
  • 哦,先生,谢谢。我猜这个问题与您的应用程序的其他部分无关,因为错误消息告诉了这一点。但我们可以一起调试您的代码来解决问题。第一步,请确保您的应用程序的其他部分是评论,您可以简化您的项目并评论其他“页面/视图”。然后专注于产生错误的“页面”。所以评论其他部分并测试你的 useEffect 钩子。 @TomalSheikh
  • 现在注释调度操作语句并仅测试 getStripApiKey。现在反转它并评论您的功能并允许调度 loadUser 操作。
猜你喜欢
  • 1970-01-01
  • 2020-07-22
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多