为什么ngrx / redux效果一定要返回动作?使用像elm这样的noop动作被认为是坏习惯吗?

xpcnnkqh  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(116)

我使用的是一个redux风格的状态管理设计,带有Angular、ngrx/store和ngrx/effects。每当我没有从一个效果返回一个动作时,我就会得到一个错误:

Cannot read property 'type' of undefined

我研究了这个问题,发现在一个elm架构中有一个叫做“noop”的动作,当你不想用你的效果链接另一个动作时,它不做任何事情。在我看来,到处调用这个noop动作似乎是非常重复的。我想知道这是否是一个不好的做法。有什么理由你不能有一个不返回动作的效果吗?效果的目的是让一个动作激发另一个动作吗?我想知道我是否误解了如何使用效果。
谢谢你!

izkcnapc

izkcnapc1#

默认情况下,ngrx/effect会调度一个操作。
如果你想要一个效果是“发射后忘记”的,你所需要做的就是把{dispatch: false}作为一个参数添加到@Effects()装饰器中。
从@ngrx/effects文档中:
@Effect()装饰器装饰的可观察对象应该是要调度的操作流。将{ dispatch: false }传递给装饰器以防止操作被调度。
用法:

class MyEffects {
  constructor(private actions$: Actions) { }

  @Effect({ dispatch: false }) logActions$ = this.actions$
    .do(action => {
      console.log(action);
    });
}

在幕后,这是通过ignoreElements operator实现的。(如果你感兴趣,这里是ngrx/effects的源代码)。ignoreElements有一个内置的noop函数,每次运行效果时都会调用这个函数。
简而言之,在ngrx/effects中不需要显式的noop-action。我不会直接称分派noop-action为“坏习惯”,但在使用ngrx时肯定是不必要的。

相关问题