如何解决调度动作Ngrx
我的用户可以将产品添加到列表中,并且我想为进入列表的每个产品生成一个ID(ID:1,ID:2,ID:3 ....)。 这是我的代码:
减速器:
export const productReducer = createReducer(
initialSate,on(addProductToList,(state,action) => {
console.log(state)
return {
...state,productList: [...state.productList,action]
}
}))
操作:
export const addProductToList = createAction(
"[Product] Add Product To List",props<{ product: Product; }>()
);
选择器:
export const selectFeature = (state: any) => state;
export const selectFeatureCount = createSelector(
selectFeature,(state: any) => state.products.idCounter
);
ONCLICK功能:
onSubmit(e) {
e.preventDefault();
if (this.addProductForm.valid)
{
this.store.pipe(select(selectFeatureCount)).subscribe(res => {
this.addProductForm.value.id = res;
this.addProductForm.value.isRecieved = false;
this.store.dispatch(addProductToList(this.addProductForm.value));
this.addProductForm.reset(this.addProductForm)
this.router.navigate(['/products']);
})
}
}
解决方法
在您发表评论后,我想我理解您的问题背后的原因。
以下是我可以向您建议的解决方案:
简单
因此,如果您只想标识productList
内的项目,则可以使用数组的索引,因此,如果您有一些简单的用例,例如使用{{1 }}后,您就可以在单个页面上呈现项目了
*ngFor
因此会发生的事情(如果您使用的是ngFor的默认行为,而没有使用<div *ngFor="let product of products; let i = index">
<div>{{product....}} </div>
<button (click)="delete(i)">Delete</button>
<button (click)="edit(i)">Edit</button>
</div>
选项)是,每当您修改产品列表时,元素就会重新呈现,并带有来自商店,您将能够一次又一次地编辑/修改新的(修改过的)产品列表。
在减速器内部,您将看到类似以下的内容
trackBy
稍微复杂一点
假设您有某种更复杂的视图,其中您在多个位置显示产品列表中的相同产品元素,并且数组idx与实际产品元素之间的动态关系可能会使您的代码混乱(它是动态的,因为无论何时您从数组中删除元素,索引比已删除元素高的元素将其索引减1,换句话说,将在数组内向左移动一个位置)
在这种情况下,我将建议为每个新产品创建某种唯一的ID,例如,它可能是基于时间的ID(您也可以使用Math.random或任何类似的方式),就像下面的代码片段一样。
export const productReducer = createReducer(
initialSate,on(addProductToList,(state,action) => {
return {
...state,productList: [...state.productList,action]
}
}),on(deleteProduct,{idx}) => {
return {
...state,productList: [...state.productList.slice(0,idx),...state.productList.slice(idx+1)]
}
}),{idx,modifiedProduct}) => {
return {
...state,productList: [
...state.productList.slice(0,modifiedProduct,...state.productList.slice(idx+1)
]
}
}),)
这样做,您将保证自己不会做任何有趣的事情,只要您是该产品列表的唯一消费者(更多有关以后可能出现的问题)。
在化简器内部,您可以使用相同的方法,但是从一开始,我们就需要自己找到它,而不是拥有元素的索引,这没什么大不了的。 (您可以查看{
id: Date.now(),productName: 'Whatever the products is called',productPrice: 'Whatever the price is',...
}
)
推荐的解决方案
因此,按照我前面提到的方法,可能发生的问题很少,这些问题与id-s的唯一性有关,假设我们使用Array.findIndex()
方法在以下位置创建了多个产品同时,我们有机会创建具有相同ID的多个实例,这将使事情变得很糟(假设您要删除带有Date.now()
的元素,但是有两个具有该ID的元素,一个应该删除?)。
简单的解决方法是以一种更智能的方式创建我们的id或使用一些库为我们完成此操作,并且该解决方案将在99.9%以上的情况下正常工作。
但是,发生这种重复的更为现实的情况有些不同,可以说有人故意生成具有现有ID的新产品并将该产品发送给您的BE ...您可以猜测会发生什么。
因此,我建议您做的是在创建新实体时,向BE发送请求,让其处理整个id生成的东西,然后根据需要在前端中使用该唯一id,这样可以保证不会发生重复。
要使此流程正常运行,您还必须仔细研究id=x
结论
最佳实践取决于用例,如果您正在做某种小型的辅助项目,而第二种解决方案则是如果您要进行的工作将要在生产中使用并且被客户使用,请不要让任何偶然的事情发生,寻求第三个解决方案。
**旁注:如果您对更高级的@ngrx/effects
使用感兴趣,请务必查看ngrx
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。