forked from react-guide/redux-tutorial-cn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
00_introduction.js
90 lines (76 loc) · 5.6 KB
/
00_introduction.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// 章节 0 - introduction.js
// 首先,为什么会有这个教程呢?
// 在我尝试学习 Redux 的时候,我发现之前阅读过的一些文章加上个人的经验,
// 让我对 flux 产生了一些误解。
// 当然,我不是说那些关于 flux 的文章写得不好,只是我没能正确地领会其中的概念。
// 到头来,我只是对着各种 flux 框架(Reflux、Flummox、FB Flux)的文档照猫画虎,
// 并试着把它们和之前了解到的理论概念联系起来 (actions / actions creators、 store、 dispatcher)。
// 等我用了 Redux 之后,我才发现原来 flux 比我想象的要简单很多。
// 这些都归功于 Redux 通过优良的设计减少了样板代码,而其它框架则是为了减少样板代码却又引入了很多新的代码。
// 我现在觉得用通过 Redux 来学习 flux 比通过其他框架高效得多。
// 这就是为什么我想分享给大家这个教程,
// 通过关注 Redux 的用法来理解 flux 的概念。
// 你可能已经看过这张著名的 flux 的单向数据流图了。
/*
_________ ____________ ___________
| | | | | |
| Action |------------▶| Dispatcher |------------▶| callbacks |
|_________| |____________| |___________|
▲ |
| |
| |
_________ ____|_____ ____▼____
| |◀----| Action | | |
| Web API | | Creators | | Store |
|_________|----▶|__________| |_________|
▲ |
| |
____|________ ____________ ____▼____
| User | | React | | Change |
| interactions |◀--------| Views |◀-------------| events |
|______________| |___________| |_________|
*/
// 在这个教程里,我们会一步步地向你介绍上图里的各个概念。
// 我们会把这些概念分成单独的章节来介绍它们存在的意义和作用。
// 在最后,当我们理解了每一个概念后,我们会发现这张图真是意义深远啊!
// 在我们开始之前,我们先聊下一 flux 存在的意义以及我们为什么需要它。
// 假设我们正在构建一个网站应用,那么这个网站应用会由什么组成呢?
// 1) 模板/HTML = View
// 2) 填充视图的数据 = Model
// 3) 获取数据、将所有视图组装在一起、响应用户事件、
// 数据操作等等的逻辑 = Controller
// 这是我们熟知的非常典型的 MVC,但它和 flux 的概念其实是很像的,
// 只是在某些表述上有些小小的不同:
// - Model 看起来像 Store
// - 用户事件、数据操作以及它们的处理程序看起来像
// "action creators" -> action -> dispatcher -> callback
// - View 看起来像 React view (或者其它类似的概念)
// 所以,flux 就只是一个新名词么?不全是,但是新名词是很重要的,
// 因为通过引入这些新术语我们可以更准确地表述各种专业术语。
// 举一个例子,获取数据是一个 action,一个点击是一个 action,
// 一个 input 变化也是一个 action 等等。我们都已经习惯了从我们的应用里分发 action,
// 只是以不同的方式称呼它们。 不同于直接修改 Model 和 View,
// Flux 确保所有 action 首先通过一个 dispatcher,
// 然后再是 store,最后通知所有的 store 监听器。
// 为了弄清楚 MVC 和 flux 的不同,
// 我们举一个典型的 MVC 应用的用例:
// 一个典型的 MVC 应用的流程大致上是这样的:
// 1) 用户点击按钮 A
// 2) 点击按钮 A 的处理程序触发 Model A 的改变
// 3) Model A 的改变处理程序触发 Model B 的改变
// 4) Model B 的改变处理程序触发 View B 的改变并重新渲染自身
// 在这样的一个环境里,当应用出错的时候快速地定位 bug 来源是一件非常困难的事情。
// 这是因为每个 View 可以监视任何的 Model,
// 并且每个 Model 可以监视其它所有 Model,所以数据会从四面八方涌来,并且被许多源(view 或者 model)改变。
// 当我们用 flux 以及它的单向数据流的时候,上面的例子就会变成这样子:
// 1) 用户点击按钮 A
// 2) 点击按钮A的处理程序会触发一个被分发的 action,并改变 Store A
// 3) 因为其它的 Store 也被这个 action 通知了,所以 Store B 也会对相同的 action 做出反应
// 4) View B 因为 Store A 和 Store B 的改变而收到通知,并重新渲染
// 来看一下我们是如何避免 Store A 和 Store B 直接相关联的。
// Store 只能被 action 修改,别无他选。
// 并且当所有 Store 响应了 action 后,View 才会最终更新。由此可见,数据总是沿着一个方向进行流动:
// action -> store -> view -> action -> store -> view -> action -> ...
// 上面我们首先从 action 开始我们的用例,
// 下面让我们同样以 action 和 action creator 来开始我们的教程。
// 进入到下一个教程:01_simple-action-creator.js