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

使用React+Firebase9实现用户注册完成后调用多个函数报错如何解决

问题根因与解决方案

现有代码的核心错误

  • 语法错误:then()回调函数写完后缺少闭合括号,会直接导致编译报错
  • 逻辑错误:你要实现的是注册功能,却调用了登录API signInWithEmailAndPassword,注册应该用Firebase Auth v9的createUserWithEmailAndPassword方法
  • 传参错误:触发signUpSubmit的表单提交事件没有传入closeSignUpCard和openSignInCard两个回调函数,导致函数执行时访问不到这两个变量

可行实现方案

方案1:修正原有传参写法

第一步:修复signUpSubmit函数逻辑

import { createUserWithEmailAndPassword } from "firebase/auth";
import { auth } from "你的firebase配置文件路径";

const signUpSubmit = (e, closeSignUpCard, openSignInCard) => {
  e.preventDefault();
  const email = e.target.email.value;
  const password = e.target.password.value;

  // 改用注册专属API
  createUserWithEmailAndPassword(auth, email, password)
    .then(() => {
      closeSignUpCard();
      openSignInCard();
    }) // 补充这里缺失的闭合括号
    .catch((error) => {
      alert(error.message);
    });
};

第二步:表单提交时传入回调参数

在React组件的表单绑定处传入两个控制弹窗的函数即可:

// 组件内定义的两个控制方法
const closeSignUpCard = () => setShowSignUp(false);
const openSignInCard = () => setShowSignIn(true);

// 表单提交绑定,将两个函数作为参数传入
return (
  <form onSubmit={(e) => signUpSubmit(e, closeSignUpCard, openSignInCard)}>
    <input name="email" type="email" required />
    <input name="password" type="password" required />
    <button type="submit">完成注册</button>
  </form>
)

方案2:更简洁的组件内写法(无需传参)

如果signUpSubmit直接定义在组件内部,可以直接调用组件内的方法,不需要额外传参:

import { useState } from "react";
import { createUserWithEmailAndPassword } from "firebase/auth";
import { auth } from "你的firebase配置文件路径";

const AuthComponent = () => {
  const [showSignUp, setShowSignUp] = useState(true);
  const [showSignIn, setShowSignIn] = useState(false);

  const closeSignUpCard = () => setShowSignUp(false);
  const openSignInCard = () => setShowSignIn(true);

  // 不用接收额外参数,直接调用组件内方法
  const signUpSubmit = async (e) => {
    e.preventDefault();
    const email = e.target.email.value;
    const password = e.target.password.value;
    try {
      await createUserWithEmailAndPassword(auth, email, password);
      closeSignUpCard();
      openSignInCard();
    } catch (error) {
      alert(error.message);
    }
  };

  return (
    <form onSubmit={signUpSubmit}>
      <input name="email" type="email" required />
      <input name="password" type="password" required />
      <button type="submit">完成注册</button>
    </form>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:27:02