🖌️
ngxs
  • 介绍
  • 入门
    • 为什么使用ngxs
    • 安装
  • 概念
    • 介绍
    • 存储(Store)
    • 动作(Actions)
    • 状态(State)
    • 选择(Select)
  • 高级
    • 动作处理程序
    • 动作的生命周期
    • 取消
    • 组合
    • 错误处理
    • Ivy迁移指南
    • 延迟加载
    • 生命周期
    • 映射子状态
    • 元归约器
    • 优化选择器
    • 选项
    • 共享状态
    • 状态令牌
    • 状态操作
    • 子状态
  • 菜单
    • 认证
    • 缓存
    • NGXS的组件事件
    • 防抖动动作
    • 动态插件
    • 不可变数据助手
    • 设计指南
    • 单元测试
  • 插件
    • 介绍
    • CLI
    • Logger
    • Devtools
    • Storage
    • Forms
    • Web Socket
    • Router
    • HMR
  • NGXS实验室
    • 介绍
  • 社区
    • FAQ
    • 资源
    • 贡献者
    • 贡献
    • 赞助商
  • 变更日志
Powered by GitBook
On this page
  • 内部动作(Internal Actions)
  • 简单动作(Simple Action)
  • 带有元数组的动作(Actions with Metadata)
  • 调度动作(Dispatching Actions)
  • 您应该如何命名自己的actions?
  • 命令(Commands)
  • 事件示例
  • 分组动作(actions)

Was this helpful?

  1. 概念

动作(Actions)

Previous存储(Store)Next状态(State)

Last updated 4 years ago

Was this helpful?

Actions 可以将操作视为应触发某些事件发生的命令,也可以将其视为已发生某事的结果事件。

每个动作都包含一个“type”字段,这是它们的唯一标识符。

内部动作(Internal Actions)

库的内部触发了两个Actions:

  1. @@INIT - store正在初始化, 在 之前.

  2. @@UPDATE_STATE - 一个新的被添加到store.

简单动作(Simple Action)

假设我们要更新一个状态,它表示某动物是否已饲养在我们的动物园。 我们将这样描述一个类:

export class FeedAnimals {
  static readonly type = '[Zoo] Feed Animals';
}

然后在我我们的state类, 我们将侦听取这个action并改变我们的state,在这种情况中就是翻转布尔值标志。

带有元数组的动作(Actions with Metadata)

通常,您需要执行一项操作才能将一些数据与之关联。 在这里,有一个action应该触发————给斑马喂干草。

export class FeedZebra {
  static readonly type = '[Zoo] Feed Zebra';
  constructor(public name: string, public hayAmount: number) {}
}

动作类的“name”字段代表我们将喂食的斑马的名字。 hayAmount告诉我们斑马应该得到多少公斤干草。

调度动作(Dispatching Actions)

您应该如何命名自己的actions?

命令(Commands)

命令是action,它告诉您的应用执行某些任务。 它们通常是由用户事件触发的,例如单击按钮或选择某些东西。 名称应包含三个部分:

  • 一个描述命令来自何处的上下文(context), [User API], [Product Page], [Dashboard Page].

  • 描述我们要对实体做什么的动词.

  • 我们所操作的实体, User, Card, Project.

示例:

  • [User API] GetUser

  • [Product Page] AddItemToCart

  • [Dashboard Page] ArchiveProject

事件示例

事件是已经发生的、我们现在需要对它们做出反应的动作(actions)。

相同的命名约定适用于命令(Commands),但它们应始终使用过去时。

在上下文动作名称部分使用API,让我们知道此事件是由一个作用于API的异步动作而触发的。

通常动作(Action)由容器组件(如路由器页面)调度。每个页面拥有明确的动作(actions),跟踪事件的来源也变得更加容易。

示例:

  • [User API] GetUserSuccess

  • [Project API] ProjectUpdateFailed

  • [User Details Page] PasswordChanged

  • [Project Stars Component] StarsUpdated

分组动作(actions)

不要用后缀命名你的动作(actions):

export class AddTodo {
  static readonly type = '[Todo] Add';
  constructor(public payload: any) {}
}

export class EditTodo {
  static readonly type = '[Todo] Edit';
  constructor(public payload: any) {}
}

export class FetchAllTodos {
  static readonly type = '[Todo] Fetch All';
}

export class DeleteTodo {
  static readonly type = '[Todo] Delete';
  constructor(public id: number) {}
}

在这里,我们将类似的动作分组到Todo命名空间中。 在这种情况下,只需导入名称空间,而不是在同一文件中导入多个动作类。

export namespace Todo {
  export class Add {
    static readonly type = '[Todo] Add';
    constructor(public payload: any) {}
  }

  export class Edit {
    static readonly type = '[Todo] Edit';
    constructor(public payload: any) {}
  }

  export class FetchAll {
    static readonly type = '[Todo] Fetch All';
  }

  export class Delete {
    static readonly type = '[Todo] Delete';
    constructor(public id: number) {}
  }
}

转到 查看有关如何调度动作的文档。

有一个关于这个主题的精彩视频 它是基于NgRx的, 但是相同的命名约定也适用于NGXS。

ngxsOnInit生命周期
延迟加载state
Store
Good Action Hygiene by Mike Ryan