在Angular 9中,可以使用状态管理库(如ngrx/store)来管理页面刷新或添加到购物车功能的状态。
首先,确保已安装最新版本的ngrx/store库。使用以下命令进行安装:
npm install @ngrx/store
接下来,创建一个名为cart.reducer.ts
的新文件,用于定义购物车状态的reducer函数。在该文件中,可以定义初始状态,并根据不同的操作类型来更新状态。
// cart.reducer.ts
import { createReducer, on } from '@ngrx/store';
import { addToCart, removeFromCart } from './cart.actions';
export interface CartItem {
id: number;
name: string;
price: number;
}
export interface CartState {
items: CartItem[];
}
export const initialState: CartState = {
items: []
};
export const cartReducer = createReducer(
initialState,
on(addToCart, (state, { item }) => {
return {
...state,
items: [...state.items, item]
};
}),
on(removeFromCart, (state, { itemId }) => {
return {
...state,
items: state.items.filter(item => item.id !== itemId)
};
})
);
然后,在应用的根模块中导入StoreModule
,并将cartReducer
添加到StoreModule.forRoot()
方法的reducer
配置中。
// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { StoreModule } from '@ngrx/store';
import { cartReducer } from './cart.reducer';
@NgModule({
imports: [
BrowserModule,
StoreModule.forRoot({ cart: cartReducer })
],
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule { }
现在,可以在组件中使用Store
服务来分派操作并获取购物车状态。首先,导入所需的操作和选择器。
// cart.actions.ts
import { createAction, props } from '@ngrx/store';
import { CartItem } from './cart.reducer';
export const addToCart = createAction(
'[Cart] Add to cart',
props<{ item: CartItem }>()
);
export const removeFromCart = createAction(
'[Cart] Remove from cart',
props<{ itemId: number }>()
);
// cart.selectors.ts
import { createSelector } from '@ngrx/store';
import { CartState } from './cart.reducer';
export const selectCartItems = createSelector(
(state: { cart: CartState }) => state.cart,
(cart) => cart.items
);
接下来,在组件中使用Store
服务来分派操作和选择器。
// cart.component.ts
import { Component } from '@angular/core';
import { Store } from '@ngrx/store';
import { addToCart, removeFromCart } from './cart.actions';
import { selectCartItems } from './cart.selectors';
@Component({
selector: 'app-cart',
template: `
-
{{ item.name }} - {{ item.price }}
`
})
export class CartComponent {
cartItems$ = this.store.select(selectCartItems);
itemName: string;
itemPrice: number;
constructor(private store: Store) {}
addToCart() {
const item = {
id: Date.now(),
name: this.itemName,
price: this.itemPrice
};
this.store.dispatch(addToCart({ item }));
}
removeFromCart(itemId: number) {
this.store.dispatch(removeFromCart({ itemId }));
}
}
最后,将CartComponent
添加到需要展示购物车的页面中。
这样,当用户添加或删除购物车中的项目时,状态将得到更新,并且在购物车组件中使用的cartItems$
观察者将自动更新。