首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ngrx中有不可变状态的问题

在ngrx中有不可变状态的问题
EN

Stack Overflow用户
提问于 2020-12-30 19:22:27
回答 1查看 46关注 0票数 0

我是ngrx的新手。试图让不可变的状态工作,但似乎对我不起作用。

我这里有一个reducer:https://stackblitz.com/edit/brewbrut?file=src%2Fapp%2Fstate%2Fbreweries.reducer.ts

breweryDetails应该返回一个新的数组(状态),以及过滤后的结果。如果我单击一家酿酒厂,然后返回,或者单击导航回酿酒厂列表的链接,状态仍然被过滤。

下面是stackblitz:https://brewbrut.stackblitz.io/

下面是reducer:

代码语言:javascript
复制
import { createReducer, on } from "@ngrx/store";
import { IBrewery } from "../definitions/brewery.definition";
import {
  retrievedBreweries,
  listAllBreweries,
  breweryDetails
} from "./breweries.actions";

export const initialState: ReadonlyArray<IBrewery> = [];
export const breweriesReducer = createReducer(
  initialState,
  on(retrievedBreweries, (state, { breweries }) => [...state, ...breweries]),
  on(listAllBreweries, state => state),
  on(breweryDetails, (state, { breweryId }) =>
    state.filter(brewery => brewery.id === breweryId)
  )
);

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-30 21:59:41

我调查过你的代码,

实际上,你的代码工作得很好,没有任何变化,

当你选择一些啤酒厂时,你只需清除所有的啤酒厂

在这种情况下,您应该在store中为选定的Brewery创建单独的属性

因此,我更改了您的AppState,我为包括breweriesselected在内的所有brews内容创建了一个属性。现在看起来是这样的:

代码语言:javascript
复制
import { ActionReducerMap } from "@ngrx/store";
import { IBrewery } from "../definitions/brewery.definition";
import { breweriesReducer } from "./breweries.reducer";

export interface AppState {
  brews: Brews;
}
export interface Brews {
  breweries: ReadonlyArray<IBrewery>;
  selected: IBrewery;
}

export const reducers: ActionReducerMap<AppState> = {
  brews: breweriesReducer
};

还在app.module中更改了主减速器

代码语言:javascript
复制
@NgModule({
  declarations: [AppComponent, HeaderComponent, FooterComponent],
  imports: [
    BrowserModule,
    BrowserTransferStateModule,
    AppRoutingModule,
    HttpClientModule,
    CoreModule,
    BrowserAnimationsModule,
    StoreModule.forRoot(reducers)
  ],
  providers: [],
  bootstrap: [AppComponent]
})

另外,我对你的减速器做了一点改动:

代码语言:javascript
复制
import { createReducer, on } from "@ngrx/store";
import { IBrewery } from "../definitions/brewery.definition";
import { retrievedBreweries, breweryDetails } from "./breweries.actions";

export const initialState = {
  breweries: [],
  selected: null
};
export const breweriesReducer = createReducer(
  initialState,
  on(retrievedBreweries, (state, { breweries }) => ({
    ...state,
    breweries
  })),
  on(breweryDetails, (state, { breweryId }) => ({
    ...state,
    selected: [...state.breweries].filter(brewery => brewery.id === breweryId)
  }))
);

而不是你的选择器,我在BreweriesComponent和BreweryComponent中使用了一个简单的箭头函数(更简单):

代码语言:javascript
复制
  ngOnInit(): void {
    this.breweries$ = this.store
      .select(s => s.brews.breweries)
      .pipe(takeUntil(this.destroy$));
  }

你可以在这里找到完整的(编辑过的)项目:

https://stackblitz.com/edit/brewbrut-envssk?file=src/app/state/breweries.reducer.ts

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65506161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档