iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Angular中如何使用ngrx做状态管理
  • 941
分享到

Angular中如何使用ngrx做状态管理

2023-06-06 15:06:35 941人浏览 八月长安
摘要

小编给大家分享一下angular中如何使用ngrx做状态管理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ngrx/store的灵感来源于Redux,是一款集成R

小编给大家分享一下angular中如何使用ngrx做状态管理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

ngrx/store的灵感来源于Redux,是一款集成Rxjs的Angular状态管理库,由Angular的布道者Rob WORMald开发。它和Redux的核心思想相同,但使用RxJS实现观察者模式。它遵循Redux核心原则,但专门为Angular而设计。

Angular中的状态管理大部分可以被service接管,那么在一些中大型的项目中,这样做的弊端就会显露出来,其中之一就是状态流混乱,不利于后期维护,后来便借鉴了redux的状态管理模式并配上rxjs流式编程的特点形成了@ngrx/store这么一个作用于Angular的状态管理工具.

  • StoreModule:
    StoreModule是@ngrx/store api中的一个模块,它被用来在应用模块中配置reducer。

  • Action:
    Action是状态的改变。它描述了某个事件的发生,但是没有指定应用的状态如何改变。

  • Store:
    它提供了Store.select()和Store.dispatch()来与reducer协同工作。Store.select()用于选择一个selector,
    Store.dispatch(
    {
    type:‘add’,
    payload:{name:‘111’}
    }
    )
    用于向reducer分发action的类型。

@NgRx/Store 状态管理的三个原则

首先,@NgRx/Store 同样遵守 Redux 的三个基本原则:

  • 单一数据源

这个原则是整个单页应用的状态通过object tree(对象树)的形式存储在store 里面。
这个定义十分抽象其实就是把所有需要共享的数据通过javascript 对象的形式存储下来

state ={    application:'angular app',    shoppingList:['apple', 'pear']}
  • state is read-only(状态只能是只读形式)

这个 ngrx/store 核心之一就是用户不能直接修改状态内容。 举个例子,如果我们需要保存了登录页面状态,状态信息需要记录登录用户的名字。 当登录名字改变,我们不能直接修改状态保存的用户名字

state={'username':'kat'},//用户重新登录别的账户为tomstate.username = 'tom'  //在ngrx store 这个行为是绝对不允许的
  • changes are made with pure functions(只能通过调用函数来改变状态)

由于不能直接需改状态,ngrx/store 同时引入了一个叫做reducer(聚合器)的概念。通过reducer 来修改状态。

function reducer(state = 'SHOW_ALL', action) {    switch (action.type) {      case 'SET_VISIBILITY_FILTER':        return Object.assign({}, state  ,newObj);          default:        return state          }}

ngrx/store使用实例

1.安装@ngrx/store

yarn add @ngrx/store

2. 创建 state, action, reducer

state 状态:

app\store\state.ts

//下面是使用接口的情况, 更规范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;//     // 如果要管理多个状态,在这个接口中添加即可//   }

reducer
app\store\reducer.ts

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

actions

如果需要把action 单独提取出来, 参考 后面的
5 如果想把action分离出来如何处理?

3. 注册store

根模块:
app/app.module.ts

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 {}

4. 使用store

在组件或服务中注入store进行使用

以 app\module\article\article.component.ts 组件为例:

// 组件级别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: Observable<number>;  constructor(private store: Store<AppState>) { // 注入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 });  }}

模板页面:
app\module\article\article.component.html

<div class="state-count">    <button (click)="increment()">增加Increment</button>    <div>Current Count: {{ count | async }}</div>    <button (click)="decrement()">减少Decrement</button>    <button (click)="reset()">Reset Counter</button></div>

这里使用了 管道符 async, 在子模块里直接使用快报错 , 如果在子模块要实现 数据的双向绑定也会报错,具体原因参照 课件说明的 问题: The pipe ‘async’ could not be found?

如何做到在模板页面中不使用管道 来渲染页面 ?

修改如下:

count: Observable<number>;constructor(private store: Store<AppState>) { // 注入store    var stream = store.pipe(select('count'));     // 从app.module.ts中获取count状态流    stream.subscribe((res)=>{          this.count = res;      })  }

为了管理方便, 一般会把 type , state, actions,reducers 分开来管理

5 如果想把action分离出来如何处理?

  1. 新建 \app\store\actions.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 }// }
  1. 在根模块 app.module.ts 注册

import {CounterAction} from './store/actions';... providers: [CounterAction],
  1. 在组件中使用 – article.component.ts

import {CounterAction} from '../../store/actions';export class ArticleComponent implements OnInit {  constructor(    private action: CounterAction  //注入CounterAction    ) { }    increment() {    // this.store.dispatch({ type: INCREMENT });     //把 actions分离出去    this.store.dispatch(this.action.Add());       }}

以上是“Angular中如何使用ngrx做状态管理”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Angular中如何使用ngrx做状态管理

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

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

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

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

下载Word文档
猜你喜欢
  • Angular中如何使用ngrx做状态管理
    小编给大家分享一下Angular中如何使用ngrx做状态管理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ngrx/store的灵感来源于Redux,是一款集成R...
    99+
    2023-06-06
  • angular状态管理器NgRx怎么用
    本篇内容主要讲解“angular状态管理器NgRx怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“angular状态管理器NgRx怎么用”吧!NgRx 是 ...
    99+
    2022-10-19
  • Angular X中如何使用ngrx
    这篇文章主要介绍Angular X中如何使用ngrx,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.首先创建一个可路由访问的模块 这里命名为:DemopetModule。包括文件:...
    99+
    2022-10-19
  • 集中式状态管理Vuex如何使用
    这篇文章主要讲解了“集中式状态管理Vuex如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“集中式状态管理Vuex如何使用”吧!1.vuex是什么一个专门在Vue中实现集中式状态管理的一...
    99+
    2023-07-05
  • Pinia.js状态管理器如何使用
    这篇文章主要讲解了“Pinia.js状态管理器如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Pinia.js状态管理器如何使用”吧!前言Pinia.js 是新一代的状态管理器,由 V...
    99+
    2023-07-02
  • ReactNative状态管理rematch如何使用
    这篇文章主要介绍“ReactNative状态管理rematch如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ReactNative状态管理rematch如何使用”文章能帮助大家解决问题。Re...
    99+
    2023-07-05
  • Vue状态管理库Vuex如何使用
    本篇内容介绍了“Vue状态管理库Vuex如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Vue.js 是一个流行的 JavaScrip...
    99+
    2023-07-05
  • Vue3状态管理库Pinia如何使用
    这篇文章主要介绍“Vue3状态管理库Pinia如何使用”,在日常操作中,相信很多人在Vue3状态管理库Pinia如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3状态管理库Pinia如何使用”的疑...
    99+
    2023-07-04
  • ReactNative状态管理redux-toolkit如何使用
    今天小编给大家分享一下ReactNative状态管理redux-toolkit如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-05
  • Vuex中状态管理器怎么使用
    本文小编为大家详细介绍“Vuex中状态管理器怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vuex中状态管理器怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、Vuex是什么?Vuex在Vue项...
    99+
    2023-07-02
  • Vuex中状态管理器的使用详解
    目录一、Vuex是什么?二、什么时候使用Vuex三、Vuex的核心概念和API四、应用举例五、vuex中各种辅助函数的用法,可以使我们更加方便的运用vuex一、Vuex是什么? Vu...
    99+
    2022-11-13
  • vue3如何使用provide实现状态管理详解
    目录前言如何通过 provide/inject 实现 Vuex的功能在应用中注册此插件插件的入口文件创建 store ,把对应的数据挂载到根组件上实现 mapState、mapMut...
    99+
    2022-11-12
  • 如何使用Redis实现用户登录状态管理
    《如何使用Redis实现用户登录状态管理,需要具体代码示例》  Redis是一种开源的内存数据库,它被广泛应用于缓存、会话管理和消息队列等领域。在Web开发中,用户登录状态管理是一个非常重要的功能,而Redis正是一个很好的选择来实现这一功...
    99+
    2023-11-09
    redis 用户 登录状态
  • Vue项目中如何用Pinia状态管理工具
    这篇文章主要介绍“Vue项目中如何用Pinia状态管理工具”,在日常操作中,相信很多人在Vue项目中如何用Pinia状态管理工具问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue项目中如何用Pinia状态管...
    99+
    2023-07-04
  • 数据管理方案Portworx是如何帮助有状态应用做容灾的?
    对于企业用户来说,在容器上跑有状态应用(Stateful Application)的生产系统,容灾备份是不可或缺的。下面的视频简要介绍了全球领先的容器数据管理解决方案Portworx是如何在Kubernetes上做容灾的。视频链接:http...
    99+
    2023-06-04
  • vue中使用pinia全局状态管理的实现
    目录与vuex的区别安装引入pinia创建状态目录pinia模块组成创建pinia模块在组件中使用该状态机pinia模块实例中的api讲解状态持久化与vuex的区别 去除了 muta...
    99+
    2022-11-13
  • RocketMQ中broker server之如何实现状态管理
    这篇文章主要介绍RocketMQ中broker server之如何实现状态管理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!broker server在存储层之上,管理一个broker的状态,通过调用存储层Defau...
    99+
    2023-06-19
  • Angular中如何使用FormArray和模态框
    本篇内容介绍了“Angular中如何使用FormArray和模态框”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!业务场景使用FormArra...
    99+
    2023-07-04
  • Android源码如何使用16进制进行状态管理
    这篇文章主要为大家展示了“Android源码如何使用16进制进行状态管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android源码如何使用16进制进行状态管理”这篇文章吧。前言在Andro...
    99+
    2023-06-20
  • 如何用React-query解决状态管理问题
    这篇文章主要讲解了“如何用React-query解决状态管理问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用React-query解决状态管理问题”...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作