一个基于ngrx的计数器例子
(1) 定义action
从@ngrx/store导入Action,新建一个Action的子类:
(2) 实现reducer,根据不同的action type,返回不同的store
store要存储的业务数据也定义在reducer里,当然也可以在单独的State.ts文件里实现:
reducer函数就是一个有限状态机,根据当前的状态和传入的action类型,返回新的状态:
有了action和reducer,应用程序还无法直接消费,需要通过Selector暴露。
import {createFeatureSelector, createSelector} from '@ngrx/store';
首先创建一个MemoizedSelector, 使用API createFeatureSelector:
export const getExampleState = createFeatureSelector<State>('example');
传入的类型参数为实际的业务数据类型,传入一个字符串作为selector的名称。
如果想通过state拿到具体的业务数据,调用createSelector,传入之前的FeatureSelector,以及一个map函数,该函数输入是一个state,输出是state包含的具体业务数据字段。
// 参数1:所有页面数据的一个抽象
// 参数2:如何通过state拿到包裹的业务数据
// 这算是Counter State的一个抽象,可以近似理解成页面数据State的一个子集
// 注意,这里的state.counter还不是具体的number,而是fromCounter.State,即: counter: fromCounter.State; 而fromCounter.State的定义:
/*
export interface State {
counter: number;
}
*/
export const getCounterState = createSelector(getExampleState, (state: State) => state.counter);
还可以像搭积木一样,将createSelector返回的MemoizedSelector传给新的createSelector,像拼乐高一样构造出新的selector:
// 这个函数最后要传给store.select, 作为一个map function
/*
输入1:某个具体的State,比如CounterState
输入2:如何根据State拿到具体的值
// select<K>(mapFn: (state: T) => K): Observable<K>;
this.counter$ = store.select(fromExample.getCounterCounter);
*/
export const getCounterCounter = createSelector(getCounterState, fromCounter.getCounter);
(3) 应用程序的定义:
这个counter的赋值逻辑:
(1) 使用构造函数注入一个Store对象,类型参数为具体的业务数据结构
(2) 使用之前调用createSelector得到的selector,作为输入参数,传入到store对象的select方法里。
最后在页面里直接用$counter | async就可以显示当前的counter值了。
当然对counter的修改不能直接使用selector,实际上selector提供的只有读取方法;而是用store的dispatch方法,传入新的action来间接实现store里的数据修改动作。
最后一个步骤,在app module里从@ngrx/store导入StoreModule:
然后使用StoreModule.forFeature方法返回一个ModuleWithProviders:
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
- centos7查看系统版本,查看机器位数x86-64
- 在centos7中添加一个新用户,并授权
- 如何优化coding
- 在PowerShell中使用curl(Invoke-WebRequest)
- linux centos中添加删除修改环境变量,设置java环境变量
- CentOS7下安装mysql5.6修改字符集为utf8并开放端口允许远程访问
- CentOS7下mysql5.6修改默认编码
- 在idea中maven项目jdk编译version总是跳到1.5
- 命令行打印文件树列表: tree
- JavaScript 获取鼠标及元素在页面上的位置
- Spring cache简单使用guava cache
- SpringMVC参数校验(针对`@RequestBody`返回`400`)
- Java8学习(3)- Lambda 表达式
- Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言用于线性回归的稳健方差估计
- 用SAS进行泊松,零膨胀泊松和有限混合Poisson模型分析
- 东芝开发板驱动OLED模块显示LOGO图片
- sas文本挖掘案例:如何使用SAS计算Word Mover的距离
- R语言ggplot2 对Facebook用户数据可视化分析
- 如何实现一个圆弧倒计时进度条
- R语言Kaggle泰坦尼克号性别阶级模型数据分析案例
- 以图搜图系统概述
- GitHub Pages 配置 letsencrypt 开启HTTPS
- R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据
- 以图搜图系统工程实践
- R语言线性判别分析(LDA),二次判别分析(QDA)和正则判别分析(RDA)
- 用R语言实现神经网络预测股票实例
- R语言社区主题检测算法应用案例
- C++ vector学习笔记