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

使用Redux Toolkit+Firebase Auth开发登录功能遇两类技术问题

问题解决:Firebase Auth + Redux Toolkit登录功能异常

问题1:Redux状态检测到非序列化值错误

问题原因

Redux要求状态必须是可序列化的数据类型(如字符串、数字、普通对象/数组),你在initialState中定义了login和logout函数,函数属于不可序列化的值,因此触发该错误。此外,Redux状态的职责是存储数据,业务逻辑函数不应放在状态中。

解决方案

移除状态中的函数,仅保留token和isLoggedIn两个数据字段;登录/登出时的localStorage操作放在组件逻辑中,Redux仅负责更新登录状态和token。

修改后的login-store.js:

const { configureStore, createSlice } = require("@reduxjs/toolkit");

const userAuth = createSlice({
    name: "login",
    initialState: {
        token: localStorage.getItem("userLoginToken") || "",
        isLoggedIn: !!localStorage.getItem("userLoginToken"),
    },
    reducers: {
        logginOut(state) {
            state.isLoggedIn = false;
            state.token = "";
        },
        loggingIn(state, action) {
            state.isLoggedIn = true;
            state.token = action.payload;
        },
    },
});

const authStore = configureStore({
    reducer: userAuth.reducer,
});

export const userAuthAction = userAuth.actions;

export default authStore;

问题2:切换登录/注册表单时弹出错误提示

问题原因

「New User」按钮位于<form>标签内,未指定type属性时,浏览器默认将其视为type="submit",点击会触发表单的onSubmit事件,此时输入框为空,Firebase Auth返回错误,因此弹出alert。

解决方案

给「New User」按钮添加type="button"属性,阻止其触发表单提交。

修改后的Login.js中对应按钮代码:

<button 
    type="button" 
    className={classes.newUser} 
    onClick={switchAuthTextHandler}
>
    {isLogin ? "New User?" : "Already have account"}
</button>

同时,调整Login.js中的登录逻辑,在获取到token后先存储到localStorage,再dispatch action:

.then((data) => {
    localStorage.setItem("userLoginToken", data.idToken);
    dispatch(userAuthAction.loggingIn(data.idToken));
    navigate("/");
    console.log(data);
})

注册错误截图

注册错误截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:06:02