【问题标题】:Converting @Effect to createEffect NGRX将 @Effect 转换为 createEffect NGRX
【发布时间】:2021-07-16 09:25:07
【问题描述】:

我正在将 @Effect(显然现在已弃用)转换为 createEffect,但是我看到了一些我没有预料到的错误并且不明白为什么。

上一个效果:

  @Effect({ dispatch: false })
  LoginSuccess: Observable<any> = this.actions.pipe(
    ofType(AuthActions.SUCCESSFUL_LOGIN),
    tap((user) => {
      localStorage.setItem('jwt', user.payload.token);
      this.router.navigateByUrl('/');
    })
  );

新效果:

  loginSuccess$ = createEffect(() => {
    return this.actions.pipe(
      ofType(AuthActions.SUCCESSFUL_LOGIN),
      tap((user) => {
        localStorage.setItem('jwt', user.payload.token);
        this.router.navigateByUrl('/');
      })
    ),
    { dispatch: false }
  });

错误:

“从不”类型上不存在属性“有效负载”。

类型参数 '() => { dispatch: boolean; }' 不能分配给 '() => EffectResult' 类型的参数。

任何人都可以指出我明显的错误,我将不胜感激。

【问题讨论】:

    标签: angular typescript ngrx


    【解决方案1】:

    将从createAction返回的实际actionCreator传入ofType,即:

    export const successfulLoginAction = createAction('[User] Login Succeeded', props<{ token: string }>());
    
        return this.actions.pipe(
          ofType(successfulLoginAction),
          tap((action) => {
              localStorage.setItem('jwt', action.token);
          ...
    

    如果你想使用老式的动作类,那么你需要将动作类型传递给ofType

        return this.actions$.pipe(
          ofType<LoginSuccess>(AuthActions.SUCCESSFUL_LOGIN),
          tap((action) => {
            localStorage.setItem('jwt', action.payload.token);
          ...
      );
    

    【讨论】:

    • 嗨 - 这就是我设置操作的方式:export class LoginSuccess implements Action { readonly type = AuthActions.SUCCESSFUL_LOGIN; constructor(public payload: any) {} } - 我该如何使用上述方法?
    • 请参阅上面的更新答案,但我建议您更新您的操作以使用 createAction,就像您的效果一样。
    • 我很感激,我仍然遇到以下问题:Argument of type '() => { dispatch: boolean; }' 不可分配给“() => EffectResult”类型的参数。此处突出显示:createEffect(() => {
    • createEffect 函数末尾附近的括号会放错位置。在此处查看(有些)工作示例:stackblitz.com/edit/…
    • 完美。谢谢你。最后一个问题,当登录发生时,它当前返回 new LoginSuccess(user);如果导出为 const,我如何调用我的新操作?
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2019-02-22
    • 2023-02-16
    • 2017-10-26
    相关资源
    最近更新 更多