Angular 在角度NgRx中合并对象与状态时出现问题
我阅读了本教程,因此创建了一个具有以下形状的简单商店Angular 在角度NgRx中合并对象与状态时出现问题,angular,typescript,ecmascript-6,ngrx,Angular,Typescript,Ecmascript 6,Ngrx,我阅读了本教程,因此创建了一个具有以下形状的简单商店 export const initialState: IState = { app: initialAppState }; export function getInitialState(): IState { return initialState; } export interface IApp { id?: string; testMode?: boolean; authenticated?: boolean;
export const initialState: IState = {
app: initialAppState
};
export function getInitialState(): IState {
return initialState;
}
export interface IApp {
id?: string;
testMode?: boolean;
authenticated?: boolean;
user?: User;
role?: string;
}
export interface IAppState {
app: IApp;
}
export const initialAppState: IAppState = {
app: {
id: null,
testMode: false,
authenticated: false,
user: null,
role: 'END_USER'
}
};
它有一个动作PatchApp
,减速器如下所示
export const appReducers = (state = initialAppState, action: AppActions): IAppState => {
switch (action.type) {
case AppActionTypes.PatchApp: {
return { ...state, app: action.payload };
}
default:
return state;
}
};
现在对我来说,这似乎非常简单。我们有一个初始状态存储在app
属性中。如果我们得到一个有效负载来更新现有状态的authenticated
属性,我希望reducer只覆盖该属性而不是整个状态
但是,当我逐步使用调试器时,我可以看到状态get只使用传入的属性进行了更新
如果我有这样的初始状态:
export const initialAppState: IAppState = {
app: {
id: null,
testMode: false,
authenticated: false,
user: null,
role: 'END_USER'
}
};
然后我使用{authenticated:true,id:'someid'}
执行PatchApp
,我希望操作.payload
覆盖/合并/修补现有对象
相反,只使用属性覆盖整个存储get。因此,在完成了正式的补丁应用程序之后,我们只需要设置认证
和id
道具
你知道我的减速机为什么不能正常工作吗?我读了一篇文章,没有发现任何地方出了问题
我还尝试使用Object.assign()
合并对象
return Object.assign({}, state, { app: action.payload });
我有一个代码沙盒,它说明了我试图解决的问题
不确定我是否正确理解了您的意图,但您似乎只想修补状态的
应用程序部分。如果是这样,您应该这样做:
export const initialAppState: IAppState = {
app: {
id: null,
testMode: false,
authenticated: false,
user: null,
role: 'END_USER'
}
};
export const appruces=(state=initialAppState,action:AppActions):IAppState=>{
开关(动作类型){
案例AppActionTypes.PatchApp:{
返回{
……国家,
应用:{…state.app,…action.payload}
};
}
违约:
返回状态;
}
};
不确定我是否正确理解了您的意图,但似乎您只想修补应用程序的状态部分。如果是这样,您应该这样做:
export const initialAppState: IAppState = {
app: {
id: null,
testMode: false,
authenticated: false,
user: null,
role: 'END_USER'
}
};
export const appruces=(state=initialAppState,action:AppActions):IAppState=>{
开关(动作类型){
案例AppActionTypes.PatchApp:{
返回{
……国家,
应用:{…state.app,…action.payload}
};
}
违约:
返回状态;
}
};