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

React调用API渲染页面问题时出现无效Hook调用报错该如何解决?

问题原因

  • 核心错误是你在onClick={FetchQuestion}中直接把组件函数当做普通回调调用了:React Hook只能在组件顶层渲染阶段或者自定义Hook内部执行,直接在事件回调里调用组件函数,相当于普通函数执行上下文调用Hook,不符合Hook调用规则,就会抛出无效Hook调用的错误。
  • 现有逻辑里useEffect依赖项是空数组,只会在组件首次挂载时执行一次请求,本身也不支持点击刷新的需求。
  • 小细节问题:原代码中useState初始值设置为数组[],但实际存储的是问题字符串,类型不匹配存在潜在隐患。

修复方案

把请求逻辑抽离成独立函数,点击按钮时直接调用该函数即可,无需重新调用整个组件,修复后代码如下:

function FetchQuestion(){
  const [triviaq, setTriviaq] = React.useState("");

  // 抽离单独的请求函数
  const fetchNewQuestion = () => {
    fetch('https://opentdb.com/api.php?amount=1')
      .then(response => response.json())
      .then(data => {
        setTriviaq(data.results[0].question);
      })
      .catch(err => console.error(err))
  }

  // 首次挂载执行一次请求
  React.useEffect(() => {
    fetchNewQuestion();
  }, []);

  return(
    <div>
      Question: {triviaq}
      {/* 点击调用请求函数,不是调用组件 */}
      <button onClick={fetchNewQuestion}> Next Question </button>
    </div>
  )
}

ReactDOM.render(<FetchQuestion/>, document.getElementById("root"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:00:01