angular状态管理方案(ngrx)

news2024/11/18 13:45:47

完全基于redux的ngrx方案,我们看看在angular中如何实现。通过一个简单的计数器例子梳理下整个流程

一 安装 :npm i  ngrx/store

这里特别要注意一点:安装 @ngrx/store的时候会出现和angular版本不一致的问题

所以检查一下@angular/core的版本和ngrx/store的版本是否一致,如果不一致升级angular,

 ng update @angular/core@17.0.0 --force。最好是删除node_modules目录重新下载。保证安装正常,版本一致

二 创建store目录,并且创建如下几个文件:

(1)actions.ts

   (2) reducers.ts

   (3)  state.ts

//state.ts

export interface AppState{
    count:number;
}   


//actions.ts
export const INSCRES="INSCRES"
export const DESCRES="DESCRES"
export const RESET="RESET"


//reduces:

import {Action} from "@ngrx/store"
import {INSCRES,DESCRES,RESET} from "./actions"

const initalState=0;
export function counterReducer(state:number=initalState,action:Action){

    switch(action.type){
            case INSCRES:
                return state+1;
            case DESCRES:
                return state-1
            case RESET:
                return 0
            default:
                return state
    }

}


(4) 页面中注入:注意angular中使用store和react稍有不同。没有createStore(reducer)然后根组件注入的过程,而是在具体页面里直接注入到constructor中,我们以news页面为例,


import { Component, ElementRef, ViewChild } from '@angular/core';
import {INSCRES,DESCRES,RESET} from "../../store/reducer"
import {Store,select} from "@ngrx/store"
import { Observable } from 'rxjs';


interface AppState{
  count:number
}

@Component({
  selector: 'app-news',
  templateUrl: './news.component.html',
  styleUrls: ['./news.component.less']
})

export class NewsComponent {
 
  count:Observable<number>

  constructor(public http:HttpClient,private store:Store<AppState>){
      let stream=store.pipe(select('count'))
      stream.subscribe(res=>{
        console.log("res:",res)
      })
      this.count=store.pipe(select('count'))
  }

  increasement(){
    this.store.dispatch({type:INSCRES})
  }
  
  decreasement(){
    this.store.dispatch({type:DESCRES})
  }
  reset(){
    this.store.dispatch({type:RESET})

  }


}

然后在具体的页面中使用count:

 <button (click)="increasement()">增加increase</button>
    <div>counter :{{count | async }}</div>
    <button (click)="decreasement()">减少increase</button>
    <button (click)="reset()">reset counter</button>

整体来看和react中使用redux并没有太大的差异。唯一的差异就是在react中需要定义store(let store=createStore(state,)),angular中直接通过在页面中注入的方式完成。

二:actions也可以是函数,我们可以改造下actions

//actions :注意这里需要用Injectable
import {Injectable} from "@angular/core"

export const INSCRES="INSCRES"
export const DESCRES="DESCRES"
export const RESET="RESET"


@Injectable()
export  class CountAction{

    add(){
        return {
            type:INSCRES
        }
    }


}

此时我们需要向app.moudule.ts中作相应修改:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import {CountAction} from "./store/actions"


import { AppComponent } from './app.component';
import { NZ_I18N } from 'ng-zorro-antd/i18n';
import { zh_CN } from 'ng-zorro-antd/i18n';



import { HomeComponent } from './pages/home/home.component';
import { AppRouteModule } from './app-route.module';

import { StoreModule } from '@ngrx/store';

registerLocaleData(zh);

@NgModule({
    declarations: [
        AppComponent,
        LayoutComponent,
        HomeComponent,
        
    ],
    providers: [
        {provide:CountAction},
        { provide: [NZ_I18N, UrlSerializer], useValue: zh_CN },
        { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptorInterceptor, multi: true },
    ],
    bootstrap: [AppComponent],
    imports: [
        BrowserModule,
        FormsModule,
        AppRouteModule,
        StoreModule.forRoot({count:counterReducer}, {}),
    ]
})
export class AppModule { }

注意这里我们给providers添加了counterAction,以便在所有页面都可以注入countActions

回到页面本身:

import { Component, OnInit } from '@angular/core';
import { Observable, Observer } from 'rxjs';
import{CountAction} from "../../store/actions"
import {Store,select} from "@ngrx/store"

interface AppState{
  count:number
}

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.less']
})
export class HomeComponent {
  
  count:Observable<number>

  constructor(private store:Store<AppState>,private action:CountAction){
    this.count=this.store.pipe(select('count'))


  increasement(){
    
    this.store.dispatch(this.action.add())
  }


}

这里逻辑的实现和之前一致,唯一的区别就是我们countAction直接注到了counstor里,然后在具体的执行函数中直接actiions的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1294888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

东北地理所最新Nature通讯文章

作为城市的重要组织部分&#xff0c;城市湿地在水源供给、增湿降温、雨洪调蓄等多个方面发挥着极其重要的作用&#xff0c;2024年国际湿地日主题定为“湿地与人类福祉”。在此背景下&#xff0c;中国科学院东北地理与农业生态研究所毛德华研究员等在12月5日出版的Nature发表题为…

CentOS系统装机流程

目录 1、进入装机页面 2、配置分区 3、设置语言 4、软件安装&#xff08;我这里选的是最小化安装&#xff0c;一般情况下应该选Server&#xff09; 5、时区配置 ​编辑 6、Root登录密码 7、开始装机&#xff0c;重启后装机完成 1、进入装机页面 2、配置分区 3、设置语言…

Java编程中通用的正则表达式(一)

正则表达式&#xff08;Regular Expression&#xff0c;简称RegEx&#xff09;&#xff0c;又称常规表示法、正则表示、正规表示式、规则表达式、常式、表达式等&#xff0c;是计算机科学中的一个概念。正则表达式是用于描述某种特定模式的字符序列&#xff0c;特别是用来匹配、…

【技巧】RAR压缩文件如何解压?

RAR是一种文件压缩与归档的专利文件格式&#xff0c;很多时候在工作中都会使用到。既然是压缩格式&#xff0c;我们就需要解压才能得到里面的文件&#xff0c;对于电脑小白来说&#xff0c;可能不知道如何解压RAR文件&#xff0c;下面小编来分享一下。 解压压缩文件&#xff0…

57、postgresql 查询流程

在这里&#xff0c;我们简要概述了查询必须经过的阶段才能获得结果。 必须建立从应用程序到 PostgreSQL 服务器的连接。应用程序将查询传输到服务器&#xff0c;并等待接收服务器发回的结果。 解析器阶段检查应用程序传输的查询语法是否正确&#xff0c;并创建查询树。 重写系…

数字化和数智化一字之差,究竟有何异同点?

在2023杭州云栖大会的一展台内&#xff0c;桌子上放着一颗番茄和一个蛋糕&#xff0c;一旁的机器人手臂融入“通义千问”大模型技术后&#xff0c;变得会“思考”&#xff1a;不仅能描述“看”到了什么&#xff0c;还能确认抓取的是番茄而不是蛋糕。 “传统的机械臂通常都只能基…

Python-滑雪大冒险【附源码】

滑雪大冒险 《滑雪大冒险》是一款充满趣味性和挑战性的休闲竞技游戏&#xff0c;在游戏中&#xff0c;玩家将扮演一位勇敢的滑雪者&#xff0c;在雪山上展示他们的滑雪技巧&#xff0c;游戏采用2D图形界面&#xff0c;以第三人称视角呈现 运行效果&#xff1a;用方向键及方向键…

自定义按钮组/buttonGroup

样式结果 定义html <view class"button-group"><button :class"{ active: selectedButton index }"v-for"(button, index) in buttons" :key"index" click"handleButtonClick(index)">{{ button }}</button…

5G基站行业节能降耗 解决方案

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…

[Linux] LAMP架构

一、LAMP架构架构的概述 LAMP 架构是一种流行的 Web 应用程序架构&#xff0c;它的名称是由四个主要组件的首字母组成的&#xff1a; Linux&#xff08;操作系统&#xff09;&#xff1a; 作为操作系统&#xff0c;Linux 提供了服务器的基础。它负责处理硬件资源、文件系统管理…

【JNPF】好用、高性价比的低代码开发平台

目录 1.JNPF介绍 突出优势 2.JNPF的开放性与扩展性 平台的开放性&#xff1a; 平台高拓展性 在快速发展的软件开发领域&#xff0c;低代码平台已经成为了一种重要的开发方法&#xff0c;它使非专业开发人员也能够参与到软件开发中去&#xff0c;大大加速了软件开发的效率。…

积德无需人见,行善自有天知

人的一生中&#xff0c;多多少少都会做一些善事。有人是出于善心&#xff0c;有人是出于怜悯&#xff1b;有人是满足自己的虚荣心&#xff0c;有人是做给旁人看&#xff1b;有人是一时兴起&#xff0c;有人能坚持一辈子&#xff1b;有人捐助周围需要帮助的人&#xff0c;有人建…

python3(超详细-保姆级教程)

第一章&#xff1a; Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&#xff0c;相比其他语言经常使用英文关键字&#xff0c;其他语言的一些标点符号&#xff0c;它具有比其他语言更有特色语法结构。 Python 是一…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(1)- map、flatmap和filter

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

阿里云通义千问720亿参数模型开源,适配企业级、科研级高性能应用

12月1日&#xff0c;阿里云举办通义千问发布会&#xff0c;开源通义千问720亿参数模型Qwen-72B。Qwen-72B在10个权威基准测评创下开源模型最优成绩&#xff0c;成为业界最强开源大模型&#xff0c;性能超越开源标杆Llama 2-70B和大部分商用闭源模型。未来&#xff0c;企业级、科…

基于Tasmota NodeMCU和安信可AI-Thinker RD-03毫米波雷达人体检测

1&#xff1a;下载VSCODE&#xff0c;安装PlatformIO插件 2&#xff1a;编译固件&#xff0c;选择Tasmota CN 3&#xff1a;下载Tasmotizer选择对应串口烧录附件 4&#xff1a;选择Tasmota 设置 5&#xff1a;Tasmota设置MQTT服务器相关参数&#xff0c;在console口中输入命…

快速在VMware虚拟机上运行Kali Linux(保姆级教程)

本期将演示如何在VMware虚拟机上快速、轻松地安装Kali Linux。Kali Linux是一款专为渗透测试和网络安全而设计的操作系统&#xff0c;拥有很多强大的工具和功能。 在运行任何虚拟机之前&#xff0c;一定要先确保已经打开主板BIOS上的虚拟化支持。 下载VMware 接着来到vmware的…

如何提升软文推广效果?这三招大部分人都不知道

内容为王的时代下不少企业都把软文推广作为宣传的主要手段&#xff0c;但不是每一次软文推广的效果都会如意。今天媒介盒子就来和大家分享提升软文推广效果的小诀窍&#xff0c;让企业宣传事半功倍。 一、以质取胜 虽然软文营销是一个长期积累的过程&#xff0c;但不代表数量决…

无人机高空巡查+智能视频监控技术,打造森林防火智慧方案

随着冬季的到来&#xff0c;森林防火的警钟再次敲响&#xff0c;由于森林面积广袤&#xff0c;地形复杂&#xff0c;且人员稀少&#xff0c;一旦发生火灾&#xff0c;人员无法及时发现&#xff0c;稍有疏忽就会酿成不可挽救的大祸。无人机高空巡查智能视频监控是一种非常有效的…

干货:软文推广中的关键词类别有哪些?

软文推广如果想要增加文案曝光率&#xff0c;seo是其主要的传播方式之一&#xff0c;因而好的关键词十分重要&#xff0c;这里的关键词指得是针对搜索引擎而言&#xff0c;由用户输入搜索引擎框中的提示性文字&#xff0c;只要关键词设置得好&#xff0c;软文就能通过搜索引擎精…