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

React点击按钮调用含useQuery函数报invalid hook call如何解决

错误原因

useQuery是React Hook,必须在函数组件的最顶层调用,不能放在事件回调、循环、条件判断内部执行。你将useQuery写在点击触发的onFollowingClick、onFollowClick函数内,只有点击按钮时才会执行Hook调用,违反了React Hook的调用规则,所以抛出报错。
另外关注、取关属于数据变更操作,本身不应该使用用于数据查询的useQuery,应该使用React Query提供的useMutation处理这类触发式的写入操作。

解决步骤
  1. 在你的函数组件最顶层(不要放在任何回调、循环、条件分支内),声明关注、取关对应的useMutation:
import { useMutation, useQueryClient } from '@tanstack/react-query'

function 你的组件名() {
  // 组件顶层先声明相关Hook
  const queryClient = useQueryClient()

  // 取关操作的mutation
  const { mutate: deleteFollowerMutate, isLoading: deleteFollowerLoading } = useMutation({
    mutationFn: (followerId) => deleteFollower(followerId),
    // 操作成功后刷新关注列表缓存,保证页面数据同步
    onSuccess: () => {
      queryClient.invalidateQueries(['myFollowings']) // 替换为你自己的关注列表查询Key
    }
  })

  // 关注操作的mutation
  const { mutate: createFollowerMutate, isLoading: createFollowerLoading } = useMutation({
    mutationFn: (userInfo) => createFollower(userInfo), // 需要传参就调整参数接收逻辑
    onSuccess: () => {
      queryClient.invalidateQueries(['myFollowings'])
    }
  })

  // 剩下的你的组件原有逻辑
  // ...
  1. 调整点击处理函数,不要在内部调用Hook,只执行mutation的触发方法:
const onFollowingClick = (myFollowerId) => {
  deleteFollowerMutate(myFollowerId)
  console.log("following call")
}

const onFollowClick = (followUserInfo) => {
  createFollowerMutate(followUserInfo)
  console.log("follower call")
}
  1. 修改按钮的onClick绑定,传入当前循环项对应的用户ID等参数:
<Button
  // 其他原有属性不变
  onClick = { () => {
    if(myFollowings.includes(e.requested_profile.Userlink)){
      // 替换为当前循环项对应的followerId字段
      onFollowingClick(e.myFollowerId)
    } else {
      // 需要传递关注用户的信息就传入,不需要就不用传
      onFollowClick(e.requested_profile)
    }
  } }
>
{/* 按钮内容不变 */}
</Button>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:15:04