你能告诉我如何只在第一次从服务器获取数据并显示到屏幕上吗?但是如果用户再次来或者组件再次加载它从商店获取数据。我正在使用 redux 和 ngrx 。
我制作了一个示例应用程序,其中有两个按钮home screen
和new screen
主屏幕,我显示来自的列表server
。当我单击new screen
按钮并返回主屏幕时,它再次服务器并获取数据。我不想再次点击。我想从中获取数据。store
我将如何获取它
这是我的代码
(不要在 chrome stackblitz 中打开此链接在 chrome 中有问题)
export class ListComponent implements OnInit {
products$: Observable<Product[]>;
constructor(private productService: ProductService,
private store: Store<fromApp.ProductState>,
private router : Router
) {}
ngOnInit() {
this.store.dispatch(new productActions.Load());
this.products$ = this.store.pipe(select(fromProduct.getProducts))
}
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,我的商店中可能会有一个属性来指示数据是否已加载,例如loaded
. 当您第一次分派在您的 Effect 中获取数据的操作时,当数据返回时,您还需要将此loaded
属性设置为true
。默认值为false
。在您的 Effect 中,您可以使用withLatestFrom
并选择该loaded
属性。如果设置为true
,则不执行任何操作,如果设置为false
,则去获取数据。
首先,改变你的ProductState
并引入一个loaded
属性:
export interface ProductState {
toggleCheckBox: boolean,
products: Product[],
loaded: boolean;
error: string
}
const initialState: ProductState = {
toggleCheckBox: true,
products: [],
loaded: false,
error: ''
};
Run Code Online (Sandbox Code Playgroud)
在您的减速器中,LoadSuccess
将loaded
属性设置为true
:
case ProductActionTypes.LoadSuccess:
return {
...state,
products: [...action.payload],
loaded: true,
error: ''
}
Run Code Online (Sandbox Code Playgroud)
现在,在您的 Effect 中,检查该loaded
属性,然后根据其值获取数据:
@Effect()
loadProduct$: Observable<Action> = this.action$.pipe(
ofType(productAction.ProductActionTypes.Load),
withLatestFrom(this.store.pipe(select(fromProduct.getLoaded))),
switchMap(([, loaded]) => {
if (loaded) {
return empty();
}
return this.productService.getProducts().pipe(
map((products) => {
return new productAction.LoadSuccess(products)
}),
catchError(err => of(new productAction.LoadFail(err)))
)
})
);
Run Code Online (Sandbox Code Playgroud)
这意味着,你的影响只会取的时候它尚未加载的数据,这是由指示loaded
你的财产ProductState
。
查看此StackBlitz以查看它的实际效果。打开开发控制台的网络选项卡以验证请求仅触发一次,之后由于loaded
属性而被“缓存” 。
归档时间: |
|
查看次数: |
3074 次 |
最近记录: |