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

在onClick处理函数中调用React Hook逻辑出现无效调用报错如何解决

错误原因

你触发报错的核心原因是违反了React Hook的调用规则:所有Hook必须在React函数组件、自定义Hook的顶层作用域调用,不能嵌套在回调函数、事件处理器、条件判断/循环语句内部。

你当前代码里把useState({})写在了refresh函数内,而refresh是点击按钮才触发的事件回调,不属于自定义Hook的顶层执行上下文,所以触发了Hook调用规则校验错误。

修复方案

把所有Hook调用移到自定义Hook的顶层,状态更新操作可以在回调函数内执行,如果你需要在刷新时请求接口更新数据,按如下逻辑调整即可:

const {useState, useCallback} = React;

const useRefreshArtifacts = (setArtifactsStore) => {
  // 所有Hook必须放在自定义Hook顶层
  const [match, setMatch] = useState({});

  // 用useCallback包裹refresh避免不必要的重渲染
  const refresh = useCallback(async () => {
    console.log("do some stuff with state");
    // 这里写你的fetch请求逻辑示例
    // const res = await fetch('/your/api/path')
    // const artifacts = await res.json()
    // setArtifactsStore?.(artifacts)
    
    // 要更新match状态直接调用顶层定义的setMatch即可
    setMatch(prev => ({...prev, updateTime: Date.now()}))
  }, [setArtifactsStore])

  return {refresh, match};
};

function ArtifactApp(props) {
  const {refresh} = useRefreshArtifacts("");
  return (<div><button onClick={refresh}>Hello</button></div>);
}

const AppContainer = () => {
  return (<div><ArtifactApp /></div>);
}

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:51:03