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

Redux Toolkit createAction传Payload失败,Sagas登录报错求助

解决Redux Toolkit createAction结合Redux Saga传递Payload失败的问题

问题根源

Redux Toolkit的createAction用法与你之前自定义的createAction不一致,导致payload传递失败,进而Firebase登录方法返回undefined,解构user时抛出Cannot read properties of undefined (reading 'user')错误。

问题分析

你当前用RTK的createAction定义emailSignInStart时,payloadCreator接收的是一个包含email和password的对象参数:

export const emailSignInStart = createAction(
  "user/EmailSignInStart",
  ({ email, password }) => ({
    payload: {
      email,
      password
    }
  })
);

但你大概率仍按照旧代码的方式调用该action:

dispatch(emailSignInStart(email, password)); // 传递两个独立参数,而非对象

这会导致payloadCreator的参数为undefined,最终action的payload为空。Saga中解构payload: { email, password }时,这两个值都是undefined,传给Firebase的signInAuthUserWithEmailAndPassword后返回undefined,解构const { user }自然触发报错。

另外需注意:RTK生成的action类型是"user/EmailSignInStart",而旧代码的类型是"user/EMAIL_SIGN_IN_START",要确保saga的监听逻辑(如takeLatest)使用emailSignInStart.type,而非旧的字符串常量,否则saga无法触发正确的处理函数。

解决方案

两种修改方式任选其一即可:

方案1:修改createAction的payloadCreator,兼容旧调用方式

让payloadCreator接收两个独立参数,而非对象:

import { createAction } from "@reduxjs/toolkit";

export const emailSignInStart = createAction(
  "user/EmailSignInStart",
  (email, password) => ({
    payload: { email, password }
  })
);

修改后仍可按旧方式调用:dispatch(emailSignInStart(email, password)),payload会正确传递。

方案2:修改action调用方式,传递对象参数

保持当前createAction定义不变,调用时传入包含email和password的对象:

// 调用处代码
dispatch(emailSignInStart({ email, password }));

验证要点

  • 确认saga监听的action类型为emailSignInStart.type,示例:
    yield takeLatest(emailSignInStart.type, EmailSignIn);
    
  • 调用action后,可通过Redux DevTools查看action的payload是否包含正确的email和password值,验证传递是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:30:55