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

使用useContext封装函数报错:Invalid hook call问题求助

问题原因

你遇到的Invalid hook call错误,核心原因是React Hook(比如useContext)只能在函数组件的顶层代码中调用,或是在自定义Hook内部调用。你把useContext放在了普通的事件处理函数updateUserState里,违反了Hook的调用规则,因此触发了错误。

解决方案

下面提供两种符合React规范的修复方式:

方式一:封装为自定义Hook(推荐复用场景)

自定义Hook允许调用其他Hook,我们可以把状态更新逻辑封装成一个命名以use开头的自定义Hook(React规范要求),返回绑定好上下文的事件处理函数:

import { useContext } from "react";
import NewUserState from "../context/NewUserState";

// 自定义Hook,用于获取绑定好上下文的状态更新函数
export const useUpdateUserState = () => {
  const [setNewUserState] = useContext(NewUserState);
  
  return (e) => {
    setNewUserState((current) => {
      const updateUser = { ...current.updateUser };
      updateUser[e.target.name] = e.target.value;
      return { ...current, updateUser };
    });
  };
};

在UserDetails组件中使用这个自定义Hook:

import { useUpdateUserState } from "../helpers/useUpdateUserState";

const UserDetails = () => {
  // 在组件顶层调用自定义Hook,获取事件处理函数
  const updateUserState = useUpdateUserState();

  return (
    <>
      <form>
            <label htmlFor="first-name">First Name*</label>
            <input
              type="text"
              id="first-name"
              name="first_name"
              onChange={updateUserState}
            />
      </form>
    </>
  );
};
export default UserDetails;

方式二:组件内直接处理(适合复用需求低的场景)

如果不需要在多个组件复用该逻辑,可以直接在UserDetails组件内部获取上下文并定义事件处理函数:

import { useContext } from "react";
import NewUserState from "../context/NewUserState";

const UserDetails = () => {
  // 在组件顶层调用useContext获取上下文
  const [setNewUserState] = useContext(NewUserState);

  const updateUserState = (e) => {
    setNewUserState((current) => {
      const updateUser = { ...current.updateUser };
      updateUser[e.target.name] = e.target.value;
      return { ...current, updateUser };
    });
  };

  return (
    <>
      <form>
            <label htmlFor="first-name">First Name*</label>
            <input
              type="text"
              id="first-name"
              name="first_name"
              onChange={updateUserState}
            />
      </form>
    </>
  );
};
export default UserDetails;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:25:19