Redux Toolkit createAction传Payload失败,Sagas登录报错求助
问题根源
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

