angular的状态管理

Angular 真的需要状态管理么?

前端在过去很多年压根就没有听说过状态管理这东西,即使在 Angular.js 火热的那几年也很少有人谈前端的状态管理,直到 React 的出现,各种状态管理框架 Flux,Redux,Mobx, … 层出不穷,让人眼花缭乱。如果你是一个 Angular 的开发者,貌似没有状态管理框架也可以正常的组件化开发,并没有发现缺什么东西。那么在 Angular 中如何优雅的管理前端状态呢?

首先前端组件化开发已经变成了标准,对于他的好处和概念网上有很多文章介绍,目前三大框架都是遵循组件化开发的思想,而且组件之间的通信基本都是单向数据流,就是说父组件通过属性绑定把数据传递给子组件,子组件想要修改传入的数据必须通过事件回调和父组件通信,React 中如果组件的层级比较深,同时父组件与很远的一个子组件之间需要共享数据,那就意味着数据会从父组件一层层往下传递,如果底层的组件需要修改数据,必须通过事件层层返回,这对于开发来说基本是灾难,代码变得难以维护,记得听说过一句很有哲学的话:任何解决不了的问题都可以引入一个第三方去解决,没错, 引入一个第三方存放维护这些状态,组件直接读取第三方把需要的状态展示在视图上,那么怎么样合理的设计这个第三方呢,那么 Flux,Redux,Mobx 这些状态管理类库基本都是所谓的第三方。

Angular 中为啥不是必须要状态管理框架呢?

首先在 Angular 中有个 Service的概念,虽然 Angular 对于 Service 基本上什么都没有做,连一个基类 BaseService 都没有提供,但是以下2个特性决定了在 Angular 中会很轻松的通过 Service 实现一个上述的第三方。

首先在 Angular 中有个 Service的概念,虽然 Angular 对于 Service 基本上什么都没有做,连一个基类 BaseService 都没有提供,但是以下2个特性决定了在 Angular 中会很轻松的通过 Service 实现一个上述的第三方。
1.Angular 中定义了一个 Service 后可以通过依赖注入很轻松的把这个服务注入到组件中,这样组件就可以调用 Service 提供的各种方法;
2.我们可以把组件需要的状态数据存储在 Service 中,然后把注入的 Service 设成 public,这样在模版中可以直接通过表达式绑定 Service 中的数据 。

angular使用service,依赖注入实现全局数据管理

user.service.ts
在这里插入图片描述

user.model.ts
在这里插入图片描述
调用
login.component.ts

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { LoginService } from './login.service';
import { UserInfo } from '../shared/model/user.model';
import { UserService } from '../shared/service/user.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {
  constructor(
    private router: Router,
    private service: LoginService,
    private userService: UserService,
  ) { }

  ngOnInit() {
  }

  fakeLogin(){
    // 赋值
    const userInfo = new UserInfo();
    userInfo.roles = ['派'];
    userInfo.username = '张';
    this.userService.userInfo = userInfo;
    switch (userInfo.roles[0]) {
      case '':

        break;
      case '':

        break;
      case '':
      
        break;
      default:
        break;
    }
  }

  test(){
    // 取值
    this.userid = this.userService.userInfo.userid;
  }
}

下面这个博客里的方法类似。
自己封装的全局数据管理 model.ts
https://github.com/mcx2020/accounting/commit/749197694afbdade29be024d3fb9366f9dde1bf7

结尾

我是圆圆,如果我的文章对你的学习成长有所帮助,欢迎 点 赞 👍 支持,您的 点 赞 👍 支持是我进行创作和分享的动力!

如果有问题可以留言评论或者私信我,我都会一一解答~笔芯🤞

前文内容引用知乎徐海峰
Angular 真的需要状态管理么? - 知乎 https://zhuanlan.zhihu.com/p/45121775

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Angular 中,你可以使用服务(Service)来实现类似 React状态管理。下面是一种常见的方式: 1. 创建一个状态管理服务: - 创建一个新的服务类,用来存储和管理应用的状态数据。 - 在该服务类中,可以定义状态属性和方法,用于更新和获取状态数据。 下面是一个示例: ```typescript import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class StateService { private state: any = {}; getState(): any { return this.state; } setState(newState: any): void { this.state = { ...this.state, ...newState }; } } ``` 在上面的示例中,我们创建了一个名为 `StateService` 的服务类,其中包含了一个私有属性 `state`,以及用于获取和更新状态的方法 `getState()` 和 `setState()`。 2. 在组件中使用状态管理服务: - 在需要使用状态的组件中导入状态管理服务。 - 在组件的构造函数中注入状态管理服务。 - 使用状态管理服务提供的方法来获取和更新状态数据。 下面是一个示例: ```typescript import { Component } from '@angular/core'; import { StateService } from './state.service'; @Component({ selector: 'app-my-component', template: ` <p>Current State: {{ currentState }}</p> <button (click)="updateState()">Update State</button> ` }) export class MyComponent { currentState: any; constructor(private stateService: StateService) { this.currentState = stateService.getState(); } updateState(): void { const newState = { message: 'New state from component!' }; this.stateService.setState(newState); this.currentState = this.stateService.getState(); } } ``` 在上面的示例中,我们在组件类 `MyComponent` 中注入了 `StateService` 服务,并使用服务的方法获取和更新状态数据。当按钮被点击时,我们调用 `updateState()` 方法来更新状态,并重新获取最新的状态数据。 通过使用服务来存储和管理状态数据,可以实现类似 React状态管理机制。不同组件之间可以通过注入同一个服务来共享和更新状态,从而实现状态在整个应用中的一致性和可管理性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值