iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Angular中NgRx/Store框架怎么用
  • 118
分享到

Angular中NgRx/Store框架怎么用

2024-04-02 19:04:59 118人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关angular中NgRx/Store框架怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ngrx/store 是基于Rxjs的状态管理库,

这篇文章将为大家详细讲解有关angular中NgRx/Store框架怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

ngrx/store 是基于Rxjs的状态管理库,其灵感来源于Redux。在NgRx中,状态是由一个包含actionreducer的函数的映射组成的。Reducer函数经由action的分发以及当前或初始的状态而被调用,最后由reducer返回一个不可变的状态。

Angular中NgRx/Store框架怎么用

状态管理

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

ngrx/store中的基本原则

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

Angular中NgRx/Store框架怎么用

  • State(状态) 是状态(state)存储器

  • Action(行为) 描述状态的变化

  • Reducer(归约器/归约函数) 根据先前状态以及当前行为来计算出新的状态,里面的方法为纯函数

  • 状态用State的可观察对象,Action的观察者——Store来访问

Actions(行为)

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

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

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

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

// 派发action,从而更新store
store.dispatch({
  type: 'ADD_TODO',
  payload: 'Buy milk'
});
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;
  }
}

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

  • 不会改变它作用域外的状态

  • 输出只决定于输入

  • 相同输入,总是得到相同输出

Store(存储)

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

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

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

Angular中NgRx/Store框架怎么用

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

简单示例

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

创建Form表单

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

2、定义用户:User Model

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";
    }
}

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

NGRX Store

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

Angular中NgRx/Store框架怎么用

  • 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
    };
  • 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) {}
    }
  • 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 });
        }
    }
  • effects侦听从Store调度的动作,执行某些逻辑,然后分派新动作

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

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

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

Angular中NgRx/Store框架怎么用

  • @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");
        })
    );

关于“Angular中NgRx/Store框架怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Angular中NgRx/Store框架怎么用

本文链接: https://www.lsjlt.com/news/69332.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Angular中NgRx/Store框架怎么用
    这篇文章将为大家详细讲解有关Angular中NgRx/Store框架怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ngrx/store 是基于RxJS的状态管理库,...
    99+
    2022-10-19
  • angular状态管理器NgRx怎么用
    本篇内容主要讲解“angular状态管理器NgRx怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“angular状态管理器NgRx怎么用”吧!NgRx 是 ...
    99+
    2022-10-19
  • vue中的store怎么使用
    本篇内容主要讲解“vue中的store怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue中的store怎么使用”吧!在vue中,store用于管理状态、共享数据以及在各个组件之间管理外...
    99+
    2023-06-29
  • HTML中框架iframe怎么用
    这篇文章主要介绍了HTML中框架iframe怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 HTML - 框架iframe 通过使...
    99+
    2022-10-19
  • Node.js中Koa框架怎么用
    这篇文章主要介绍“Node.js中Koa框架怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js中Koa框架怎么用”文章能帮助大家解决问题。KoaKoa 是为了解决 ...
    99+
    2023-06-17
  • Node.js中Express框架怎么用
    本篇内容主要讲解“Node.js中Express框架怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中Express框架怎么用”吧!很多语言都有一些框架,这些框架可以帮助我们更...
    99+
    2023-06-17
  • Angular中Renderer怎么用
    这篇文章主要介绍了Angular中Renderer怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Angular 其中的一个设计目标是使...
    99+
    2022-10-19
  • Angular中Directive怎么用
    这篇文章主要介绍了Angular中Directive怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Angular Directive 学习学习目的:为了更好的了解 ng...
    99+
    2023-06-14
  • 浅析Angular中怎么结合使用FormArray和模态框
    怎么结合使用FormArray和模态框?下面本篇文章给大家介绍一下Angular的FormArray和模态框结合使用的方法,希望对大家有所帮助!业务场景使用FormArray制作动态表单。每创建一个表单,页面就新增一个input显示表单填写...
    99+
    2023-05-14
    Angular.js
  • Bootstrap框架怎么用
    这篇文章主要为大家展示了“Bootstrap框架怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Bootstrap框架怎么用”这篇文章吧。什么是 Bootstrap?Bootstrap 是一...
    99+
    2023-06-27
  • styluscss框架怎么用
    这篇文章将为大家详细讲解有关styluscss框架怎么用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Stylus是一款需要编译的css语言,所以其本身文件...
    99+
    2022-10-19
  • Koa框架中间件怎么用
    这篇文章主要介绍了Koa框架中间件怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Node 主要用在开发 Web 应用,koa 是目前 ...
    99+
    2022-10-19
  • node中的Nest.js框架怎么用
    本文小编为大家详细介绍“node中的Nest.js框架怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“node中的Nest.js框架怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2022-10-19
  • gin框架中怎么使用JWT
    这篇文章主要讲解了“gin框架中怎么使用JWT”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“gin框架中怎么使用JWT”吧!什么是JWT?JWT全称JSON Web Token是一种跨域认证...
    99+
    2023-06-30
  • Java中怎么使用Sinatra框架
    这篇文章主要讲解了“Java中怎么使用Sinatra框架”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中怎么使用Sinatra框架”吧!Sinatra 是一个微型的 Ruby 语言的...
    99+
    2023-06-17
  • Golang中tinyrpc框架怎么使用
    本篇内容介绍了“Golang中tinyrpc框架怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!tinyrpc功能tinyrpc基于T...
    99+
    2023-07-05
  • Gin框架中bind怎么使用
    本篇内容主要讲解“Gin框架中bind怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Gin框架中bind怎么使用”吧!概述Gin框架中,有bind函数可以非常方便的将url的查询参数qu...
    99+
    2023-06-22
  • php tp框架中m怎么用
    这篇文章主要介绍了php tp框架中m怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php tp框架中的m方法用于实例化一个基础模型类,其用法有:1、实例化基础模型(M...
    99+
    2023-06-21
  • Java中怎么使用Nutz框架
    使用Nutz框架在Java中进行开发可以按照以下步骤进行:1. 导入Nutz框架的相关依赖:在项目的构建文件(如Maven的pom....
    99+
    2023-08-24
    Java Nutz
  • angular中ui calendar怎么用
    这篇文章将为大家详细讲解有关angular中ui calendar怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。官方地址:http://angular-ui.git...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作