Heim >Web-Frontend >js-Tutorial >Eine kurze Diskussion zur Verwendung von ngrx für die Zustandsverwaltung in Angular
Verwandte Empfehlungen: „angular Tutorial“
ngrx/store ist von Redux inspiriert. Es handelt sich um eine Angular-Statusverwaltungsbibliothek, die RxJS integriert und vom Angular-Evangelisten Rob Wormald entwickelt wurde. Es hat die gleiche Kernidee wie Redux, verwendet jedoch RxJS, um das Beobachtermuster zu implementieren. Es folgt den Kernprinzipien von Redux, wurde jedoch speziell für Angular entwickelt.
Der größte Teil der Zustandsverwaltung in Angular kann durch den Dienst übernommen werden. Einer davon ist, dass der Zustandsfluss chaotisch ist, was der späteren Wartung nicht förderlich ist. Später wurde Redux als Referenz verwendet. Das Zustandsverwaltungsmodell in Verbindung mit den Merkmalen der rxjs-Streaming-Programmierung bildet @ngrx/store, ein Zustandsverwaltungstool für Angular
StoreModule:
StoreModule ist ein Modul in der @ngrx/store-API , die zum Konfigurieren des Reduzierers im Anwendungsmodul verwendet wird.
Aktion:
Aktion ist eine Zustandsänderung. Es beschreibt das Eintreten eines Ereignisses, gibt jedoch nicht an, wie sich der Status der Anwendung ändert.
Store:
Es stellt Store.select() und Store.dispatch() für die Arbeit mit dem Reduzierer bereit. Store.select() wird verwendet, um einen Selektor auszuwählen,
Store.dispatch(
{
type: 'add',
payload: {name: '111'}
}
)
wird verwendet, um den Aktionstyp zu verteilen zum Reduzierer.
Zuallererst hält sich @NgRx/Store auch an die drei Grundprinzipien von Redux:
Dieses Prinzip gilt für das Ganze Single-Page-Anwendung Der Status wird im Speicher in Form eines Objektbaums gespeichert.
Diese Definition ist sehr abstrakt. Sie dient dazu, alle Daten, die gemeinsam genutzt werden müssen, in Form von Javascript-Objekten zu speichern. Der Statusinhalt kann nicht direkt geändert werden. Wenn wir beispielsweise den Status der Anmeldeseite speichern müssen, müssen die Statusinformationen den Namen des angemeldeten Benutzers aufzeichnen. Wenn sich der Anmeldename ändert, können wir den im Status gespeicherten Benutzernamen nicht direkt ändern.
state = { application:'angular app', shoppingList:['apple', 'pear'] }
state={'username':'kat'}, //用户重新登录别的账户为tom state.username = 'tom' //在ngrx store 这个行为是绝对不允许的
ngrx/store-Nutzungsbeispiel
function reducer(state = 'SHOW_ALL', action) { switch (action.type) { case 'SET_VISIBILITY_FILTER': return Object.assign({}, state ,newObj); default: return state } }
yarn add @ngrx/storeReducer
//下面是使用接口的情况, 更规范 export interface TaskList { id: number; text: string; complete: boolean; } export const TASKSAll: TaskList[] = [ {id: 1, text: 'Java Article 1', complete: false}, {id: 2, text: 'Java Article 2', complete: false} ] export interface AppState { count: number; todos: TaskList; // 如果要管理多个状态,在这个接口中添加即可 } //这个是不用接口的情况 // export interface AppState { // count: number; // todos: any; // // 如果要管理多个状态,在这个接口中添加即可 // }
Wenn Sie die Aktion separat extrahieren müssen, beachten Sie bitte Folgendes
5. Was tun, wenn Sie die Aktion trennen möchten?3. Store
Root-Modul registrieren:
// reducer.ts,一般需要将state,action,reducer进行文件拆分 import { Action } from '@ngrx/store'; export const INCREMENT = 'INCREMENT'; export const DECREMENT = 'DECREMENT'; export const RESET = 'RESET'; const initialState = 0; // reducer定义了action被派发时state的具体改变方式 export function counterReducer(state: number = initialState, action: Action) { switch (action.type) { case INCREMENT: return state + 1; case DECREMENT: return state - 1; case RESET: return 0; default: return state; } }4. Store
verwenden, um Store in eine Komponente oder einen Dienst zur Verwendung einzuspeisen
import { NgModule } from '@angular/core'; import { StoreModule } from '@ngrx/store'; // StoreModule: StoreModule是@ngrx/storeAPI中的一个模块, // 它被用来在应用模块中配置reducer。 import {counterReducer} from './store/reducer'; @NgModule({ imports: [ StoreModule.forRoot({ count: counterReducer }), // 注册store ], }) export class AppModule {}Vorlagenseite:
// 组件级别 import { Component } from '@angular/core'; import { Store, select } from '@ngrx/store'; import { Observable } from 'rxjs'; import { INCREMENT, DECREMENT, RESET} from '../../store/reducer'; interface AppState { count: number; } @Component({ selector: 'app-article', templateUrl: './article.component.html', styleUrls: ['./article.component.css'] }) export class ArticleComponent { count: Observabled80b5def5ed1be6e26d91c2709f14170; constructor(private store: Store6076dd82de29ad27bc912ad957f38fdd) { // 注入store this.count = store.pipe(select('count')); // 从app.module.ts中获取count状态流 } increment() { this.store.dispatch({ type: INCREMENT }); } decrement() { this.store.dispatch({ type: DECREMENT }); } reset() { this.store.dispatch({ type: RESET }); } }
a29455b745944c9a0d8e3afc470893ae 6cfdf2a3cab4a4f728db77c1a4b50ad0增加Increment65281c5ac262bf6d81768915a4a77ac0 dc6dce4a544fdca2df29d5ac0ea9906bCurrent Count: {{ count | async }}16b28748ea4df4d9c2150843fecfba68 6a5a5a8f92e6df93009eca891f03f025减少Decrement65281c5ac262bf6d81768915a4a77ac0 dd9bc48600714170fea322b8a3484257Reset Counter65281c5ac262bf6d81768915a4a77ac0 16b28748ea4df4d9c2150843fecfba68Zur Vereinfachung der Verwaltung werden Typ, Status, Aktionen und Reduzierungen im Allgemeinen separat verwaltet.
5 Was tun, wenn Sie Aktionen trennen möchten?
Erstellen Sie eine neue appstoreactions.ts-Datei
count: Observabled80b5def5ed1be6e26d91c2709f14170; constructor(private store: Store6076dd82de29ad27bc912ad957f38fdd) { // 注入store var stream = store.pipe(select('count')); // 从app.module.ts中获取count状态流 stream.subscribe((res)=>{ this.count = res; }) }
Registrieren Sie sich im Stammmodul app.module.ts
import { Injectable } from '@angular/core'; import { INCREMENT, DECREMENT, RESET } from './types'; @Injectable() export class CounterAction{ // Add=function(){} Add(){ return { type: INCREMENT } } } // 就只这样导出是不行的 // export function Add1(){ // return { type: INCREMENT } // }
import {CounterAction} from './store/actions'; ... providers: [CounterAction],
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion zur Verwendung von ngrx für die Zustandsverwaltung in Angular. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!