预期结果:
我正在尝试更新redux状态的值
问题:
我的结局是无限循环/浏览器锁定。我读过
this 'SO' post
以及
docs
但很难看出我错在哪里。
这是我的状态:
{ id: 0, product: TV, saleItem: false },
{ id: 1, product: Fridge, saleItem: false }
我想把它更新到
{ id: 0, product: TV, saleItem: true }
{ id: 1, product: Fridge, saleItem: false }
我的url是:localhost:4200/#/0
我正在使用选择器获取我的存储中的所有项,检查url参数并返回状态中的项。上面的url将返回
{ id: 0, product: TV, saleItem: false }
然后我就跑
item = { ...item, saleItem: true };
在我看来减速机着火了。但是这导致了一个无限循环
console.log('before', item);
和
console.log('after', item);
一次又一次被注销。下面是我的代码和一些我尝试过的替代方案
选择器
export const getBasketEntities = createSelector(
getBasketState,
fromItems.getBasketEntities
);
export const getSelectedItem = createSelector(
getBasketEntities,
fromRoot.getRouterState,
(entities, router): Item => {
return router.state && entities[router.state.params.id];
}
);
组成部分
this.store.dispatch(new fromStore.UpdateItem());
行动
export class UpdateItem implements Action {
readonly type = UPDATE_ITEM;
constructor() {}
}
影响
// update effect
@Effect()
updateItem$ = this.actions$.ofType(itemActions.UPDATE_ITEM).pipe(
switchMap(() => {
return this.store.select(fromSelectors.getSelectedItem).pipe(
map((item: Item) => {
console.log('before', item);
item = { ...item, saleItem: true };
console.log('after', item);
return new itemActions.UpdateItemSuccess(item);
}),
catchError(error => of(new itemActions.UpdateItemFail(error)))
);
})
);
减速器
case fromItems.UPDATE_ITEM_SUCCESS: {
const item: Item = action.payload;
console.log('reducer', item);
const entities = {
...state.entities,
[item.id]: item
};
return {
...state,
entities
};
}
更新:
-
从效果中移除选择器。
-
调用选择器并将值传递到操作(有效负载)
-
更新减速器中的项
结果是一样的。
组成部分
onUpdate() {
this.store
.select(fromStore.getSelectedItem)
.pipe(
map((item: Item) => {
this.store.dispatch(new fromStore.UpdateItem(item));
})
)
.subscribe()
.unsubscribe();
}
影响
@Effect()
updateItem$ = this.actions$.ofType(itemActions.UPDATE_ITEM).pipe(
map((action: itemActions.UpdateItem) => action.payload),
map((item: Item) => {
return new itemActions.UpdateItemSuccess(item);
}),
catchError(error => of(new itemActions.UpdateItemFail(error)))
);
行动
export class UpdateItem implements Action {
readonly type = UPDATE_ITEM;
constructor(public payload: Item) {}
}
减速器
case fromItems.UPDATE_ITEM_SUCCESS: {
const item: Item = action.payload;
const entities = {
...state.entities,
[item.id]: { ...item, saleItem: true }
};
return {
...state,
entities
};
}