NgRx 是一个基于 RxJS 的状态管理库,用于 Angular 应用程序。它遵循 Redux 架构模式,通过单向数据流来管理应用程序的状态。NgRx 提供了一组工具和模式,帮助开发者构建可预测、可维护的状态管理解决方案。
NgRx 主要包括以下几个部分:
NgRx 适用于需要复杂状态管理的 Angular 应用程序,特别是在以下场景:
在 NgRx 中完成远程操作前,通常需要进行以下步骤:
假设我们要实现一个简单的远程数据获取功能:
// actions.ts
import { createAction, props } from '@ngrx/store';
export const fetchDataRequest = createAction('[Data] Fetch Data Request');
export const fetchDataSuccess = createAction('[Data] Fetch Data Success', props<{ data: any[] }>());
export const fetchDataFailure = createAction('[Data] Fetch Data Failure', props<{ error: any }>());
// effects.ts
import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { of } from 'rxjs';
import { catchError, map, mergeMap } from 'rxjs/operators';
import { DataService } from './data.service';
@Injectable()
export class DataEffects {
constructor(
private actions$: Actions,
private dataService: DataService
) {}
fetchData$ = createEffect(() =>
this.actions$.pipe(
ofType('[Data] Fetch Data Request'),
mergeMap(() =>
this.dataService.fetchData().pipe(
map((data) => ({ type: '[Data] Fetch Data Success', payload: { data } })),
catchError((error) => of({ type: '[Data] Fetch Data Failure', payload: { error } }))
)
)
)
);
}
// reducers.ts
import { createReducer, on } from '@ngrx/store';
import * as DataActions from './actions';
export interface State {
data: any[];
loading: boolean;
error: any;
}
export const initialState: State = {
data: [],
loading: false,
error: null,
};
const _dataReducer = createReducer(
initialState,
on(DataActions.fetchDataRequest, (state) => ({ ...state, loading: true })),
on(DataActions.fetchDataSuccess, (state, { payload }) => ({ ...state, data: payload.data, loading: false })),
on(DataActions.fetchDataFailure, (state, { payload }) => ({ ...state, error: payload.error, loading: false }))
);
export function dataReducer(state, action) {
return _dataReducer(state, action);
}
原因:可能是 Effects 中的错误处理逻辑不正确,或者 Reducers 未正确处理失败的 Action。
解决方法:
catchError((error) => of({ type: '[Data] Fetch Data Failure', payload: { error } }))
确保错误被正确捕获并分发相应的失败 Action。
on(DataActions.fetchDataFailure, (state, { payload }) => ({ ...state, error: payload.error, loading: false }))
确保 Reducers 正确处理失败的 Action,并更新状态。
通过以上步骤和示例代码,你可以在 NgRx 中完成远程操作前的功能,并处理相关的状态管理逻辑。
领取专属 10元无门槛券
手把手带您无忧上云