浅谈Angular中使用ngrx做状态管理的方法

浅谈Angular中使用ngrx做状态管理的方法

相关推荐:《angular教程》

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 状态:

appstorestate.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
appstoreeducer.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进行使用

以 appmodulerticlerticle.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;  constructor(private store: Store) { // 注入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 });  }}

登录后复制

模板页面:
appmodulerticlerticle.component.html

Current Count: {{ count | async }}

登录后复制

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

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

修改如下:

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

登录后复制

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

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

新建 ppstorections.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 }// }

登录后复制在根模块 app.module.ts 注册

import {CounterAction} from './store/actions';... providers: [CounterAction],

登录后复制在组件中使用 – 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做状态管理的方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2717492.html

(0)
上一篇 2025年3月7日 22:04:53
下一篇 2025年2月23日 15:46:43

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 深入了解Angular中的模块和懒加载

    本篇文章给大家介绍一下angular 模块的使用和懒加载。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《angular教程》 一、Angular 内置模块 二、Angular 自定义模块 当我们项目比较小的时…

    2025年3月7日 编程技术
    200
  • 详解Angular中的路由及其用法

    本篇文章带大家了解一下angular中的路由,以及angular路由的使用。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《angular教程》 一、 Angular 创建一个默认带路由的项目 1、命令创建项目…

    2025年3月7日
    200
  • 浅谈Angular中http请求模块的用法

    本篇文章给大家介绍一下angular中http请求模块的使用。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《angular教程》 首先模块引入 import { BrowserModule } from ‘@…

    2025年3月7日
    200
  • 浅谈Angular如何借助第三方组件和懒加载技术进行性能优化

    相关推荐:《angular教程》 应该有很多人都抱怨过 Angular 应用的性能问题。其实,在搭建Angular项目时,通过使用打包、懒加载、变化检测策略和缓存技术,再辅助第三方组件,便可有效提升项目性能。 为了帮助开发者深入理解和使用A…

    2025年3月7日 编程技术
    200
  • 浅谈Angular中父子组件相互传参的方法

    本篇文章给大家介绍一下angular中父子组件相互传参的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《angular教程》 一 :父组件获取子组件的数据和方法 也就是说 子组件给父组件传数据和方法 通过…

    2025年3月7日 编程技术
    200
  • 浅谈Angular中的DOM操作

    本篇文章给大家介绍一下angular中的dom操作。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《angular教程》 一、 Angular 中的 Dom 操作以及@ViewChild、 Angular 执行…

    2025年3月7日
    200
  • 详解Angular中的material安装与使用

    本篇文章给大家介绍一下angular中material安装与使用的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《angular教程》 一、 Angular介绍 Angular是谷歌开发的一款开源的web…

    2025年3月7日 编程技术
    200
  • angular8如何封装http服务

    本篇文章给大家介绍一下angular8封装http服务的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《angular教程》 HttpClientModule 要在angular里使用http服务必须先在…

    2025年3月7日
    200
  • 浅谈angular8兼容ie10+版本的方法

    本篇文章给大家介绍一下angular8兼容ie10及其以上版本的方法(win10的话兼容自带的浏览器)。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《angular教程》 1.pollyfills.ts添加下…

    2025年3月7日 编程技术
    200
  • 浅谈Angular10配置@路径别名的方法

    本篇文章给大家介绍一下angular10配置@路径别名的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《angular教程》 Angular10中配置@路径别名 Angular10中的项目文件结构 中文网…

    2025年3月7日 编程技术
    200

发表回复

登录后才能评论