NGRX Signal Store의 창시자인 Marko Stanimirovic이 NgRx SignalStore: Angular의 신호 기반 상태 관리에 대해 자세히 설명합니다
코드 예시를 통해 스토어의 API를 살펴보겠습니다. 제품 및 필터링 기능 목록이 포함된 프로젝트를 사용하겠습니다.
import { signalStore } from "@ngrx/signals"; export const ProductStore = signalStore( … );
지금까지 모든 NGRX 저장소와 마찬가지로 객체 리터럴, 레코드 또는 팩토리 함수(동적 초기 상태 생성용)를 입력으로 받아들이는 withState 함수를 사용하여 제공할 수 있는 초기 상태가 있습니다.
import { signalStore, withState } from "@ngrx/signals"; const initialProductState: ProductState = { products: [] }; export const ProductStore = signalStore( withState(initialProductState); );
import { signalStore, withComputed, withState } from "@ngrx/signals"; export const ProductStore = signalStore( withState(initialProductState), withComputed(({products}) => ({ averagePrice: computed(() => { const total = products().reduce((acc, p) => acc + p.price, 0); return total / products().length; }) })),
import { signalStore, withComputed, withState, withMethods } from "@ngrx/signals"; export const ProductStore = signalStore( withState(initialProductState), withComputed(({products}) => ({ averagePrice: computed(() => { const total = products().reduce((acc, p) => acc + p.price, 0); return total / products().length; }) })), // CRUD operations withMethods((store, productService = inject(ProductService), ) => ({ loadProducts: () => { const products = toSignal(productService.loadProducts()) patchState(store, { products: products() }) }, addProduct: (product: Product) => { patchState(store, { products: [...store.products(), product] }); }, // ... })),
withMethods & withCompulated 팩토리 함수에 들어가서 다음을 사용하여 액세스할 수 있는 메서드 및 계산된 신호 사전을 반환합니다. 가게. 또한 주입 컨텍스트에서 실행되므로 종속성을 주입할 수 있습니다.
import { withHooks } from "@ngrx/signals"; export const ProductStore = signalStore( withHooks((store) => ({ onInit() { // Load products when the store is initialized store.loadProducts(); }, })), );
export const ProductStoreWithEntities = signalStore( withEntities<Product>(), // CRUD operations withMethods((store, productService = inject(ProductService), ) => ({ loadProducts: () => { const products = toSignal(productService.loadProducts())(); patchState(store, setAllEntities(products || [])); }, updateProduct: (product: Product) => { productService.updateProduct(product); patchState(store, setEntity(product)); }, })),
"with"로 시작하는 여러 기능을 추가할 수 있지만 이전에 정의된 기능에만 액세스할 수 있습니다.
signalStoreFeature - 스토어 기능을 확장하는 데 사용됩니다.
대기업 애플리케이션에 비해 매장은 복잡해지고 관리하기 어려울 수 있습니다. 프로젝트의 기능과 구성 요소를 작성할 때 분할이 더 좋고 세부적일수록 코드 관리 및 유지 관리 및 테스트 작성이 더 쉬워집니다.
그러나 SignalStore가 스토어에 제공하는 API를 고려하면 그에 따라 코드를 분할하지 않으면 관리하기 어려울 수 있습니다. signalStoreFeature는 기능(또는 구성 요소)의 특정 기능을 다른 저장소에서 잠재적으로(그리고 이상적으로) 재사용할 수 있는 독립 실행형 테스트 가능한 함수로 추출하는 데 적합합니다.
export const ProductStore = signalStore( // previous defined state and methods // Externalizing filtering options withFilteringOptions(), ); export function withFilteringOptions() { return signalStoreFeature( // Filtering operations withMethods(() => ({ getProductsBetweenPriceRange: (lowPrice: number, highPrice: number, products: Array<Product>, ) => { return products.filter(p => p.price >= lowPrice && p.price <= highPrice); }, getProductsByCategory: (category: string, products: Array<Product>) => { return products.filter(p => p.category === category); }, })), ); }
이제 여러 매장에서 signalStoreFeature를 재사용할 수 있는 가능성을 보여주는 signalStoreFeature의 예입니다.
"@ngrx/signals"에서 { patchState, signalStoreFeature, withMethods } 가져오기;
export function withCrudOperations() { return signalStoreFeature( withMethods((store) => ({ load: (crudService: CrudOperations) => crudService.load(), update: (crudableObject: CRUD, crudService: CrudOperations) => { crudService.update(crudableObject); patchState(store, setEntity(crudableObject)); }, }), )); } export interface CrudOperations { load(): void; update(crudableObject: CRUD): void; } // Product & Customer services must extend the same interface. export class ProductService implements CrudOperations { load(): void { console.log('load products'); } update(): void { console.log('update products'); } } export class CustomerService implements CrudOperations { load(): void { console.log('load customers'); } update(): void { console.log('update customers'); } } // and now let’s add this feature in our stores export const ProductStore = signalStore( withCrudOperations(), ); export const CustomerStore = signalStore( withCrudOperations(), );
확장하기가 쉽기 때문에 Signal Stores에 유용한 도구를 추가하기 위한 ngrx-toolkit이라는 유틸리티 패키지가 이미 있습니다.
{ 제공된In: 'root' } 또는 구성 요소, 서비스, 지시문 등의 공급자 배열
대규모 애플리케이션, 특히 글로벌 매장으로 적용할 때 얼마나 안정적인지는 아직 입증되지 않았습니다.
현재로서는 기본 Signal API에 대한 훌륭한 추가 기능으로 다음 관리에 좋은 옵션이라고 생각합니다.
https://www.stefanos-lignos.dev/posts/ngrx-signals-store
https://www.angulararchitects.io/blog/the-new-ngrx-signal-store-for-angular-2-1-flavors/(주제에 대한 4개의 기사 그룹)
https://ngrx.io/guide/signals
위 내용은 NGRX의 신호 저장소 - 주요 개념 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!