Inhaltsverzeichnis
状态管理
ngrx/store中的基本原则
Actions(行为)
Reducers(归约器)
Store(存储)
简单示例
创建Form表单
Zustandsverwaltung
Grundprinzipien in ngrx/store
Actions
Store
Einfaches Beispiel
Formular erstellen
NGRX Store
Heim Web-Frontend js-Tutorial Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular

Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular

Jun 30, 2021 am 11:24 AM
angular 框架

Was ist das NgRx/Store-Framework in

Angular? Was ist der Nutzen? In diesem Artikel lernen Sie das NgRx/Store-Framework für die Datenstatusverwaltung und die Grundprinzipien in ngrx/store kennen und lernen anhand von Beispielen die einfache Verwendung des Frameworks kennen.

Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular

【Verwandte Tutorial-Empfehlung: „Angular Tutorial“】

ngrx/store ist eine Zustandsverwaltungsbibliothek basierend auf RxJS, die von inspiriert ist Redux. In NgRx besteht der Zustand aus einer Zuordnung von Funktionen, die action und reducer enthalten. Die Reducer-Funktion wird über den Versand von action und dem aktuellen oder anfänglichen Zustand aufgerufen, und schließlich wird durch reducer ein unveränderlicher Zustand zurückgegeben. ngrx/store 是基于RxJS的状态管理库,其灵感来源于Redux。在NgRx中,状态是由一个包含actionreducer的函数的映射组成的。Reducer函数经由action的分发以及当前或初始的状态而被调用,最后由reducer返回一个不可变的状态。

Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular

状态管理

在前端大型复杂Angular/AngularJS项目的状态管理一直是个让人头疼的问题。在AngularJS(1.x版本)中,状态管理通常由服务,事件,$rootScope混合处理。在Angular中(2+版本),组件通信让状态管理变得清晰一些,但还是有点复杂,根据数据流向不同会用到很多方法。

ngrx/store中的基本原则

视图层通过dispatch发起一个行为(action)、Reducer接收action,根据action.type类型来判断执行、改变状态、返回一个新的状态给store、由store更新state

Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular

  • State(状态) 是状态(state)存储器
  • Action(行为) 描述状态的变化
  • Reducer(归约器/归约函数) 根据先前状态以及当前行为来计算出新的状态,里面的方法为纯函数
  • 状态用State的可观察对象,Action的观察者——Store来访问

Actions(行为)

Actions是信息的载体,它发送数据到reducer,然后reducer更新storeActionsstore能接受数据的唯一方式。

ngrx/store里,Action的接口是这样的:

// actions包括行为类型和对应的数据载体
export interface Action {
  type: string;
  payload?: any;
}
Nach dem Login kopieren

type描述期待的状态变化类型。比如,添加待办 ADD_TODO,增加 DECREMENT 等。payload是发送到待更新store中的数据。store派发action 的代码类似如下:

// 派发action,从而更新store
store.dispatch({
  type: 'ADD_TODO',
  payload: 'Buy milk'
});
Nach dem Login kopieren

Reducers(归约器)

Reducers规定了行为对应的具体状态变化。是纯函数,通过接收前一个状态和派发行为返回新对象作为下一个状态的方式来改变状态,新对象通常用Object.assign和扩展语法来实现。

// reducer定义了action被派发时state的具体改变方式
export const todoReducer = (state = [], action) => {
  switch(action.type) {
    case 'ADD_TODO':
      return [...state, action.payload];
    default:
      return state;
  }
}
Nach dem Login kopieren

开发时特别要注意函数的纯性。因为纯函数:

  • 不会改变它作用域外的状态
  • 输出只决定于输入
  • 相同输入,总是得到相同输出

Store(存储)

store中储存了应用中所有的不可变状态。ngrx/store中的storeRxJS状态的可观察对象,以及行为的观察者。

可以利用Store来派发行为。也可以用Store的select()方法获取可观察对象,然后订阅观察,在状态变化之后做出反应。

上面我们描述的是基本流程。在实际开发过程中,会涉及API请求、浏览器存储等异步操作,就需要effectsserviceseffectsaction触发,进行一些列逻辑后发出一个或者多个需要添加到队列的action,再由reducers处理。

Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular

使用ngrx/store框架开发应用,始终只维护一个状态,并减少对API的调用。

简单示例

简单介绍一个管理系统的登录模块。

创建Form表单

1、增加组件:LoginComponent,主要就是布局,代码为组件逻辑

2、定义用户:User Model

Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular🎜

Zustandsverwaltung

🎜Die Zustandsverwaltung großer und komplexer Front-End-Angular/AngularJS-Projekte bereitete schon immer Kopfschmerzen. In AngularJS (Version 1.x) wird die Statusverwaltung normalerweise durch eine Mischung aus Diensten, Ereignissen und $rootScope übernommen. In Angular (Version 2+) macht die Komponentenkommunikation die Zustandsverwaltung klarer, ist aber immer noch etwas kompliziert und je nach Datenflussrichtung werden viele Methoden verwendet. 🎜

Grundprinzipien in ngrx/store

🎜Die Ansichtsschicht initiiert eine Aktion (Aktion) durch dispatch, Reducer empfängt action, bestimmt die Ausführung entsprechend dem Typ action.type, ändert den Status und gibt einen neuen Status an store< zurück /code> >, <code>state wird durch store aktualisiert. 🎜🎜Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular🎜
  • State (state) ist der Zustand (state) Memory
  • Action (behavior) beschreibt die Änderung of state
  • Reducer (Reduzierer/Reduktionsfunktion) berechnet den neuen Zustand basierend auf dem vorherigen Zustand und dem aktuellen Verhalten. Die darin enthaltenen Methoden sind reine Funktionen
  • Der Zugriff auf den Zustand erfolgt über das beobachtbare Objekt von State und den Beobachter von Action - Store

Actions

🎜Actions ist der Informationsträger, der Daten an reducer sendet, dann an reducer aktualisiert store. Aktionen sind die einzige Möglichkeit, wie store Daten akzeptieren kann. 🎜🎜In ngrx/store ist die Schnittstelle von Action wie folgt: 🎜
export class User {
    id: number;
    username: string;
    password: string;
    email: string;
    avatar: string;

    clear(): void {
        this.id = undefined;
        this.username = "";
        this.password = "";
        this.email = "";
        this.avatar = "./assets/default.jpg";
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
🎜type beschreibt den erwarteten Zustandsänderungstyp. Fügen Sie beispielsweise die Aufgaben ADD_TODO, DECREMENT usw. hinzu. Payload sind die Daten, die zur Aktualisierung an den Store gesendet werden. Der Code für store zum Versenden von action ähnelt dem folgenden: 🎜
export interface AuthState {
    isAuthenticated: boolean;
    user: User | null;
    errorMessage: string | null;
}

export const initialAuthState: AuthState = {
    isAuthenticated: false,
    user: null,
    errorMessage: null
};
Nach dem Login kopieren
Nach dem Login kopieren

Reducers< /h4>🎜Reducers gibt die spezifischen Zustandsänderungen an, die dem Verhalten entsprechen. Es handelt sich um eine reine Funktion, die den Status ändert, indem sie den vorherigen Status empfängt und ein neues Objekt als nächsten Status zurückgibt. Neue Objekte werden normalerweise mithilfe von Object.assign und erweiterter Syntax implementiert. 🎜
export enum AuthActionTypes {
    Login = "[Auth] Login",
    LoginSuccess = "[Auth] Login Success",
    LoginFailure = "[Auth] Login Failure"
}

export class Login implements Action {
    readonly type = AuthActionTypes.Login;
    constructor(public payload: any) {}
}
Nach dem Login kopieren
Nach dem Login kopieren
🎜Achten Sie bei der Entwicklung besonders auf die Reinheit der Funktionen. Weil reine Funktionen: 🎜
  • Ändert den Zustand außerhalb ihres Gültigkeitsbereichs nicht
  • Die Ausgabe hängt nur von der Eingabe ab
  • Die gleiche Eingabe erhält immer die gleiche Ausgabe

Store

🎜store speichert den gesamten unveränderlichen Status in der Anwendung. Der store in ngrx/store ist ein beobachtbares Objekt des RxJS-Status und ein Beobachter des Verhaltens. 🎜🎜Sie können Store verwenden, um Aktionen zu versenden. Sie können auch die Methode select() des Stores verwenden, um beobachtbare Objekte abzurufen und sich dann für die Beobachtung und Reaktion nach Statusänderungen anmelden. 🎜🎜Was wir oben beschreiben, ist der grundlegende Prozess. Im eigentlichen Entwicklungsprozess sind asynchrone Vorgänge wie API-Anfragen und Browserspeicher beteiligt, die aus effects und services bestehen code>action löst aus, führt eine Reihe von Logiken aus und gibt dann eine oder mehrere action aus, die zur Warteschlange hinzugefügt und dann von reducers verarbeitet werden müssen. 🎜🎜Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular🎜
🎜Verwenden Sie das ngrx/store-Framework, um Anwendungen zu entwickeln, immer nur einen Status beizubehalten und Aufrufe an APIs zu reduzieren. 🎜

Einfaches Beispiel

🎜Eine kurze Einführung in das Login-Modul eines Managementsystems. 🎜

Formular erstellen

🎜1. Komponente hinzufügen: LoginComponent, hauptsächlich Layout, der Code ist Komponentenlogik 🎜 🎜2. Benutzer definieren: Benutzermodell🎜
export class User {
    id: number;
    username: string;
    password: string;
    email: string;
    avatar: string;

    clear(): void {
        this.id = undefined;
        this.username = "";
        this.password = "";
        this.email = "";
        this.avatar = "./assets/default.jpg";
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

3、添加表单:在组件LoginComponent增加Form表单

NGRX Store

按照上述的4个原则定义相应的Actions

Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular

  • reducers定义状态

    在文件auth.reducers.ts中创建状态,并初始化

    export interface AuthState {
        isAuthenticated: boolean;
        user: User | null;
        errorMessage: string | null;
    }
    
    export const initialAuthState: AuthState = {
        isAuthenticated: false,
        user: null,
        errorMessage: null
    };
    Nach dem Login kopieren
    Nach dem Login kopieren
  • actions定义行为

    export enum AuthActionTypes {
        Login = "[Auth] Login",
        LoginSuccess = "[Auth] Login Success",
        LoginFailure = "[Auth] Login Failure"
    }
    
    export class Login implements Action {
        readonly type = AuthActionTypes.Login;
        constructor(public payload: any) {}
    }
    Nach dem Login kopieren
    Nach dem Login kopieren
  • service实现数据交互(服务器)

    @Injectable()
    export class AuthService {
        private BASE_URL = "api/user";
    
        constructor(private http: HttpClient) {}
    
        getToken(): string {
            return localStorage.getItem("token");
        }
    
        login(email: string, pwd: string): Observable<any> {
            const url = `${this.BASE_URL}/login`;
            return this.http.post<User>(url, { email, pwd });
        }
    }
    Nach dem Login kopieren
  • effects侦听从Store调度的动作,执行某些逻辑,然后分派新动作

    • 一般情况下只在这里调用API

    • 通过返回一个action给reducer进行操作来改变store的状态

    • effects总是返回一个或多个action(除非@Effect with {dispatch: false})

Verstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular

  • @Effect()
    Login: Observable<any> = this.actions.pipe(
        ofType(AuthActionTypes.Login),   //执行Login响应
        map((action: Login) => action.payload),
        switchMap(payload => {
            return this.authService.login(payload.email, payload.password).pipe(
                map(user => {
                    return new LoginSuccess({ uid: user.id, email: payload.email });
                }),
                catchError(error => {
                    return of(new LoginFailure(error));
                })
            );
        })
    );
    
    //失败的效果
    @Effect({ dispatch: false })
    LoginFailure: Observable<any> = this.actions.pipe(ofType(AuthActionTypes.LoginFailure));
    
    //成功的效果
    @Effect({ dispatch: false })
    LoginSuccess: Observable<any> = this.actions.pipe(
        ofType(AuthActionTypes.LoginSuccess),
        tap(user => {
            localStorage.setItem("uid", user.payload.id);
            this.router.navigateByUrl("/sample");
        })
    );
    Nach dem Login kopieren

    更多编程相关知识,请访问:编程视频!!

    Das obige ist der detaillierte Inhalt vonVerstehen Sie in einem Artikel schnell das NgRx/Store-Framework in Angular. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So bewerten Sie die Kosteneffizienz der kommerziellen Unterstützung für Java-Frameworks So bewerten Sie die Kosteneffizienz der kommerziellen Unterstützung für Java-Frameworks Jun 05, 2024 pm 05:25 PM

Die Bewertung des Kosten-/Leistungsverhältnisses des kommerziellen Supports für ein Java-Framework umfasst die folgenden Schritte: Bestimmen Sie das erforderliche Maß an Sicherheit und Service-Level-Agreement-Garantien (SLA). Die Erfahrung und das Fachwissen des Forschungsunterstützungsteams. Erwägen Sie zusätzliche Services wie Upgrades, Fehlerbehebung und Leistungsoptimierung. Wägen Sie die Kosten für die Geschäftsunterstützung gegen Risikominderung und Effizienzsteigerung ab.

Wie wirken sich die Lightweight-Optionen von PHP-Frameworks auf die Anwendungsleistung aus? Wie wirken sich die Lightweight-Optionen von PHP-Frameworks auf die Anwendungsleistung aus? Jun 06, 2024 am 10:53 AM

Das leichte PHP-Framework verbessert die Anwendungsleistung durch geringe Größe und geringen Ressourcenverbrauch. Zu seinen Merkmalen gehören: geringe Größe, schneller Start, geringer Speicherverbrauch, verbesserte Reaktionsgeschwindigkeit und Durchsatz sowie reduzierter Ressourcenverbrauch. Praktischer Fall: SlimFramework erstellt eine REST-API, nur 500 KB, hohe Reaktionsfähigkeit und hoher Durchsatz

Wie ist die Lernkurve von PHP-Frameworks im Vergleich zu anderen Sprach-Frameworks? Wie ist die Lernkurve von PHP-Frameworks im Vergleich zu anderen Sprach-Frameworks? Jun 06, 2024 pm 12:41 PM

Die Lernkurve eines PHP-Frameworks hängt von Sprachkenntnissen, Framework-Komplexität, Dokumentationsqualität und Community-Unterstützung ab. Die Lernkurve von PHP-Frameworks ist im Vergleich zu Python-Frameworks höher und im Vergleich zu Ruby-Frameworks niedriger. Im Vergleich zu Java-Frameworks haben PHP-Frameworks eine moderate Lernkurve, aber eine kürzere Einstiegszeit.

Leistungsvergleich von Java-Frameworks Leistungsvergleich von Java-Frameworks Jun 04, 2024 pm 03:56 PM

Laut Benchmarks sind Quarkus (schneller Start, geringer Speicher) oder Micronaut (TechEmpower ausgezeichnet) für kleine, leistungsstarke Anwendungen die ideale Wahl. SpringBoot eignet sich für große Full-Stack-Anwendungen, weist jedoch etwas langsamere Startzeiten und Speichernutzung auf.

Best Practices für die Dokumentation des Golang-Frameworks Best Practices für die Dokumentation des Golang-Frameworks Jun 04, 2024 pm 05:00 PM

Das Verfassen einer klaren und umfassenden Dokumentation ist für das Golang-Framework von entscheidender Bedeutung. Zu den Best Practices gehört die Befolgung eines etablierten Dokumentationsstils, beispielsweise des Go Coding Style Guide von Google. Verwenden Sie eine klare Organisationsstruktur, einschließlich Überschriften, Unterüberschriften und Listen, und sorgen Sie für eine Navigation. Bietet umfassende und genaue Informationen, einschließlich Leitfäden für den Einstieg, API-Referenzen und Konzepte. Verwenden Sie Codebeispiele, um Konzepte und Verwendung zu veranschaulichen. Halten Sie die Dokumentation auf dem neuesten Stand, verfolgen Sie Änderungen und dokumentieren Sie neue Funktionen. Stellen Sie Support und Community-Ressourcen wie GitHub-Probleme und Foren bereit. Erstellen Sie praktische Beispiele, beispielsweise eine API-Dokumentation.

So wählen Sie das beste Golang-Framework für verschiedene Anwendungsszenarien aus So wählen Sie das beste Golang-Framework für verschiedene Anwendungsszenarien aus Jun 05, 2024 pm 04:05 PM

Wählen Sie das beste Go-Framework basierend auf Anwendungsszenarien aus: Berücksichtigen Sie Anwendungstyp, Sprachfunktionen, Leistungsanforderungen und Ökosystem. Gängige Go-Frameworks: Gin (Webanwendung), Echo (Webdienst), Fiber (hoher Durchsatz), gorm (ORM), fasthttp (Geschwindigkeit). Praktischer Fall: Erstellen einer REST-API (Fiber) und Interaktion mit der Datenbank (gorm). Wählen Sie ein Framework: Wählen Sie fasthttp für die Schlüsselleistung, Gin/Echo für flexible Webanwendungen und gorm für die Datenbankinteraktion.

Was sind die häufigsten Missverständnisse im Lernprozess des Golang-Frameworks? Was sind die häufigsten Missverständnisse im Lernprozess des Golang-Frameworks? Jun 05, 2024 pm 09:59 PM

Beim Go-Framework-Lernen gibt es fünf Missverständnisse: übermäßiges Vertrauen in das Framework und eingeschränkte Flexibilität. Wenn Sie die Framework-Konventionen nicht befolgen, wird es schwierig, den Code zu warten. Die Verwendung veralteter Bibliotheken kann zu Sicherheits- und Kompatibilitätsproblemen führen. Die übermäßige Verwendung von Paketen verschleiert die Codestruktur. Das Ignorieren der Fehlerbehandlung führt zu unerwartetem Verhalten und Abstürzen.

Roadmap zum Java Framework-Lernen: Best Practices in verschiedenen Bereichen Roadmap zum Java Framework-Lernen: Best Practices in verschiedenen Bereichen Jun 05, 2024 pm 08:53 PM

Roadmap zum Java-Framework-Lernen für verschiedene Bereiche: Webentwicklung: SpringBoot und PlayFramework. Persistenzschicht: Ruhezustand und JPA. Serverseitige reaktive Programmierung: ReactorCore und SpringWebFlux. Echtzeit-Computing: ApacheStorm und ApacheSpark. Cloud Computing: AWS SDK für Java und Google Cloud Java.

See all articles