【问题标题】:Does ReplaySubject.next(value) violate immutable state principle of redux store?ReplaySubject.next(value) 是否违反了 redux store 的不可变状态原则?
【发布时间】:2017-06-27 18:15:07
【问题描述】:

我有一个 Angular2 应用程序,它从需要身份验证的源中获取数据,因此应用程序组件的 init 事件会像这样启动 auth 令牌获取:

import { Component, OnInit } from '@angular/core';
import { NgRedux } from '@angular-redux/store';
import { rootReducer } from './app.reducer';
import * as createLogger from 'redux-logger';
import { AppActions } from './app.actions';
import { createEpicMiddleware, combineEpics } from 'redux-observable';
import { UserEpics } from './users/user.epics';
import { ReplaySubject } from 'rxjs/ReplaySubject';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  constructor(
    private ngRedux: NgRedux<any>,
    private actions: AppActions,
    private userEpics: UserEpics,
  ) {
    ngRedux.configureStore(
      rootReducer,
      { user: { auth: { token$: new ReplaySubject(1) } } },
      [
        createLogger(),
        createEpicMiddleware(combineEpics(...userEpics.epics)),
      ]);
  }
  ngOnInit() {
    this.ngRedux.dispatch(this.actions.getAuthToken());
  }
}

Redux 正在存储一个 Rxjs5 ReplaySubject,并且这个主题将从 reducer 中获取令牌值,如下所示:

case AppActions.GET_AUTH_TOKEN_DONE:
  user.auth.token$.next(action.token);
  return Object.assign({}, user, {
    auth: {
      isFetching: false,
      token$: user.auth.token$,
      reason: undefined
    }
 });

这段代码对我有用,但它是否违反了 redux store 的不可变状态原则?

【问题讨论】:

    标签: angular redux rxjs5 redux-observable


    【解决方案1】:

    我会说确实如此 - 因为您可以通过调用 .next(...) 从任何地方改变状态 - 如果它是 Observable 而不是 Subject 它可能会有点不同 - 但无论如何我个人认为将Observables 存储为状态的一部分是一种不好的做法。

    【讨论】:

    • 确实非常不鼓励这样做。商店中的所有内容都应该是可序列化的,即使您实际上从未对其进行序列化。你不必对它抱有宗教信仰——如果它包含一些从未使用过的意外事件——但依赖它是不好的形式。所有这一切都说,如果没有通向正义的简单明确的道路,那就运送它,但不要养成它的习惯。至少这是我的看法。为了给你提供一个更干净的解决方案,我需要看看你为什么觉得你需要 Subject to back with。例如你的史诗代码。看来您可以在没有主题的情况下按原样在商店中设置令牌?
    • @jayphelps 谢谢,我也很怀疑。我临时这样做是为了满足依赖于身份验证令牌的组件以获取视图数据。我将此重构为一个方案,其中组件路由由订阅商店的身份验证令牌保护,使用@angular-redux/store
    猜你喜欢
    • 2016-04-15
    • 2014-02-15
    • 2010-11-29
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2016-12-29
    相关资源
    最近更新 更多