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

React中onSubmit调用Context内register函数显示undefined问题

问题分析与解决方法

核心问题1:变量定义顺序错误

你在authState对象里提前引用了handleRegister,但这个函数是在authState之后才声明的。按照JavaScript的变量提升规则,此时handleRegister还处于未初始化状态,导致authState.register值为undefined。

修复方法:将handleRegister的定义移到authState之前:

const AuthProvider = ({children}) => {
const [signUp, setSignUp] = useState([]);
const [formData, setFormData] = useState(FORM_FIELDS);

// 先定义handleRegister函数
const handleRegister = async () => {
   const response = await axios
    .post(process.env.API_BASE_URL + API_ENDPOINTS.SIGN_UP, {
     email: formData.email,
     first_name: formData.firstName,
     last_name: formData.lastName,
     password: formData.password,
   })
   .then(data => console.log(data, 'apiData'));
 console.log(response, 'response');
};

// 再创建authState,此时handleRegister已存在
const authState = {
  signUpData: signUp,
  setSignUp: setSignUp,
  setFormData: setFormData,
  formData: formData,
  register: handleRegister,
};

 return (
   <ApiContext.Provider value={authState}>{children}</ApiContext.Provider>
  );
};

核心问题2:createContext初始值错误

你创建上下文时传入了AuthProvider组件作为初始值:

export const ApiContext = createContext(AuthProvider);

这不符合React Context的使用规范,初始值应该是一个与上下文值结构匹配的默认值(比如空对象),避免组件未被Provider包裹时出现异常:

export const ApiContext = createContext({});

额外优化建议

  • handleRegister中同时使用await和.then()写法冗余,统一风格更易维护:
const handleRegister = async () => {
  try {
    const response = await axios.post(process.env.API_BASE_URL + API_ENDPOINTS.SIGN_UP, {
      email: formData.email,
      first_name: formData.firstName,
      last_name: formData.lastName,
      password: formData.password,
    });
    console.log(response, 'apiData');
  } catch (error) {
    console.error('注册失败:', error);
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:47:36