首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
PowerPC
» Redux 简介-1
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
Redux 简介-1
发短消息
加为好友
look_w
当前离线
UID
1066743
帖子
8283
精华
0
积分
4142
阅读权限
90
在线时间
233 小时
注册时间
2017-6-23
最后登录
2019-5-18
论坛元老
UID
1066743
1
#
打印
字体大小:
t
T
look_w
发表于 2018-1-20 21:28
|
只看该作者
Redux 简介-1
状态管理是软件开发的最困难方面之一,这使得状态管理错误成为了几乎所有 bug 的源头。本系列将探索 ,这是一个针对 JavaScript 应用程序的
可预测的状态容器
。Redux 不仅有助于状态管理,还使得实现一些高级特性变得很简单,比如无限撤销/重做和实时编辑时间旅行 (live-editing time travel)。
尽管 Redux 来自 社区,但它并不依赖于 React。无论有没有 JavaScript 框架,比如 React、Angular、Backbone 或 Cycle.js,都可以使用 Redux。在第一期文章中,首先将了解 Redux 基础知识,学习如何使用它作为独立的状态容器;然后继续探索如何结合使用 Redux 和 React。后续几期文章将介绍更高级的 Redux 场景,在最后一期文章中,将学习如何结合使用 Redux 和 Angular。
Redux 的工作原理
安装 Redux
可通过克隆 GitHub 或通过 npm 来安装 Redux:npm install redux
Redux 是 Facebook 的 架构的一种简化实现。(
Redux
既是一个表示 “已返回” 的英文单词,也是
reducer
+
flux
的混合词。)Flux 在本质上采用了模型-视图-控制器 (MVC) 的结构,但引入了很高的复杂性。Redux 从 借用了
缩减程序 (reducer)
的概念来降低了这一复杂性,Elm 是一个基于不可变数据结构和纯函数的强大的反应式函数编程语言。纯函数是没有副作用的函数,Redux 缩减程序是计算应用程序状态的纯函数。
Redux 有 3 条原则:
应用程序状态存储在单个对象中。
应用程序状态不可变,只能通过描述状态更改的
操作
彻底替换。
缩减程序根据当前状态和某个操作来创建下一个状态。
应用程序状态存储在单个对象中Redux 通过一个 JavaScript 对象管理状态,该对象称为
数据存储
,包含应用程序的所有状态。将状态集中保存在一个对象中,这使得在阅读代码时推断应用程序数据变得更容易。另外,当所有数据都在一个位置时,应用程序更容易调试和测试。将应用程序状态存储在一个对象中,还使持久保存应用程序的整体状态变得更容易。
应用程序状态不可变对于 Redux,您不能修改应用程序状态。而需要使用新状态替换现有状态。新状态由操作指定,操作也是不可变的 JavaScript 对象,用于描述状态更改。
将状态更改封装在不可变的对象中有许多优点。尽管封装状态更改时使用了模式,但封装状态更改远不止使用模式那么简单,所以最好连同引用一起删除。您在本系列文章中将会看到,其中一个优点是能够实现无限撤销和重做 — 实际上类似于时光机。操作也按严格的顺序执行,所以不会发生竞争条件。
缩减程序创建一种新状态缩减程序是纯 JavaScript 函数,它们:
根据当前状态和某个操作来创建一个新状态
集中化数据变化
可处理所有或部分状态
可组合和重用
因为它们是纯函数,缩减程序没有副作用 — 所以它们很容易读取、测试和调试。您可以构造缩减程序,轻松实现仅关注整体应用程序状态的一部分的简单缩减程序。
因为应用程序状态不可变,而且因为缩减程序是没有副作用的纯函数,所以 Redux 是一个
可预测的
状态容器:给定任何状态和任何操作,您就可以非常肯定地预测应用程序的下一个状态。Redux 的这种可预测元素是一个非常好的特性,使实现无限撤销/重做和实时编辑时间旅行成为可能。
我们接下来将通过两个示例演示一下 Redux 的基础原理。
操作、缩减程序和存储在图 1 中,一个简单的 Redux 示例(一个交通信号灯模拟器)的代码在 TextMate 文本编辑器中运行。图中 TextMate 生成的工具提示显示了应用程序的输出,其中显示了应用程序的状态(STOP、CAUTION 或 GO)。
图 1. 使用 Redux 的交通信号灯状态
图 1 中的代码首先要求使用 Redux 并创建 Redux 存储:
1
2
3
const Redux = require('redux');
const createStore = Redux.createStore;
const store = createStore(reducer);
使用 Redux.createStore() 函数创建应用程序的存储。每个 Redux 应用程序仅有一个存储,每个存储仅有一个缩减程序。将该缩减程序传递给 Redux.createStore() 函数。
应用程序的状态(在本例中为一个具有值 GO、STOP 或 CAUTION 的字符串)由 reducer() 函数创建。reducer() 函数根据当前状态和某个描述状态更改的操作来返回一个新状态。清单 1 给出了交通信号灯应用程序的缩减程序。请注意,在状态未定义时(也就是初始状态),reducer() 函数将返回 GO。
清单 1. 交通信号灯应用程序的缩减程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const reducer = (state = 'GO', action) => {
switch(action.type) {
case 'GO':
state = 'GO'
break;
case 'STOP':
state = 'STOP'
break;
case 'CAUTION':
state = 'CAUTION';
break;
}
return state;
}
接下来,该代码定义了 3 个操作对象,每个对应于一个状态,如清单 2 所示。
清单 2. 交通信号灯操作
1
2
3
4
5
6
7
8
9
10
11
const cautionAction = {
type: 'CAUTION'
};
const goAction = {
type: 'GO'
};
const stopAction = {
type: 'STOP'
}
最后,如清单 3 所示,应用程序分派操作,通过 Redux 存储的 getState() 方法获取当前状态的引用,并将该状态的值打印到控制台。
清单 3. 分配交通信号灯操作
1
2
3
4
5
6
7
8
9
10
// Dispatch actions....................................................
store.dispatch(stopAction);
console.log('State: ' + store.getState());
store.dispatch(cautionAction);
console.log('State: ' + store.getState());
store.dispatch(goAction);
console.log('State: ' + store.getState());
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
FPGA/CPLD可编程逻辑
测试测量
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议