[译]图解Flux[A cartoon guide to Flux]

最近看Flux, Reflux 和 Redux的区别时,看到一篇不错的文章A cartoon guide to Flux,就觉得有点意思,可以翻译一下加深自己的理解(后来发现好像已经有人翻译过了,不过这不重要),虽然感觉很多翻译过后感觉怪怪的。

不废话了-----------

A cartoon guide to flux

图解Flux

Flux 不仅是目前前端开发中最流行的也是最不易懂的话题之一。这篇文章想用最简单的方式让大家懂得什么是Flux。

Flux解决的问题

首先,我要解释一下Flux解决的问题。 Flux是一种在app中处理数据的模式。 Flux 和 React在Facebook一起长大。 许多人都将他们一起使用,其实它们可以相互独立的使用。它们是为了解决Facebook看见的一系列问题而被开发出来的。

notification bug.png

这一系列问题中的一个知名例子🌰是消息通知的bug。当你登录Facebook,你可以看到消息图标上有数字表示有新消息。当你点击消息图标,消息通知数字会消失,表示没有有新消息了。或许几分钟之后,与网站进行了几次交互后,通知就会回来。 你会再次点击消息图标,直到没有新消息。这将继续在这来回循环♻️...

bug cycle

这不只是在网站上用户遇到的循环问题。Facebook team也遇到了这样的问题。他们修复了一个bug,一段时间内都能正常工作,过一段时间bug又回来了。他们会在问题被修复和问题重现之间来回循环♻️.

所以Facebook寻找了一种方法来解决这个循环问题。他们不想只是修复问题,而是让系统有可预测性,这样他们就可以保证问题不会再继续出现。

根本问题

他们定义的根本问题是数据在app中传递的方式。
Note: 这是我在他们在演讲中分享的最简单的版本。我不确定真实的版本是否有所不同。

Models pass data to the view layer

这些持有数据的model会将数据传递给view层让view层来渲染这些数据。

因为用户通过view来进行交互,所以有时view需要根据用户输入来更新model。有时一些model需要去更新其他model。

除此之外,有时这些行为会触发一连串的变化。我将这想象为乒乓球游戏,很难知道球最终会落在哪里。

Views update models. Models update other models. This starts to look like a really edge-of-your-seat game of Pong.

请注意这些变化可能是异步发生的。一个变化可能触发多个变化。我觉得这就像将整袋乒乓球扔出去一样,它们到处乱飞。

总的来说,很难去debug数据流。

解决方法:单向数据流

所以Facebook决定尝试一种不同的架构,在这种架构中数据单向传递-单向数据流-当你需要插入新的数据,这个流完全从头开始。他们称这种架构为Flux.

The diagram you’ll find in Facebook’s Flux docs. It is way cooler than it looks.

这是很棒的… 但是也许你没办法从上图中看出来它到底是什么。

一旦你理解了Flux,这个图就相当清晰。问题是如果你对Flux的理解完全是新的,我认为这个图并不能帮助你理解它。这是图应该做的,它应该在你真正开始着手去了解它怎么做具体事情之前能让你对系统有一个全面的了解。

能帮助你更好的理解Flux的不是这样的图,而是通过思考构成这个系统的不同特征,它们是怎么一起工作来完成这个目标的。接下来我会向你介绍我脑中的一系列特征。

详解特征

在我开始解释它们是怎么相互作用之前,简单介绍一下这些特征。

Action creator

第一特征是action creator。它负责创建action,这是所有变化和交互都应该通过的路径。不论是你想改变app的状态,还是让view渲染不同的东西,你都得发送一个action。

把action creator看作一个电报员。当你去到action creator时,你已经基本知道你要发送的信息是什么了,然后action creator把信息按整个系统都能理解的方式格式化。

The action creator likes a telegraph operator. It formats your message for you.

action creator 创建一个有type和payload的action。Type是你在系统里已经定义好的某一种action(通常是产量列表)。一个action的例子🌰可以像MESSAGE_CREATE 或者 MESSAGE_READ

这有一个好的副作用,系统的一个部分会知道所有可能的action。一个新加入项目的开发者,打开action creator的文件,查看所有的API — 系统提供的所有状态的改变。

一旦创建好一个action,action creator会将这个action 传递给dispatcher。

Dispatcher
The dispatcher likes a switchboard operator. It knows all the callbacks for the different stores.

Dispatcher 是一个callback的注册表。它像一个电话总机的电话接线员。 它持有需要发送action的所有store的列表。当一个action从action creator来,它会将action 传递到不同的store去。

它异步的进行,能帮助解决前面我说的多个乒乓球问题。如果你还需要建立store间更新顺序的依赖,你可以让dispatcher通过waitFor()帮你管理。

Flux dispatch和其他架构的dispatcher不同。不论action 的type是什么类型,每个action都会发送到所有注册过的store中。这意味着store不是订阅了一些action,而是监听所有的action,然后过滤出它们关心的action。

Store

接下来是store。store持有app中所有的状态,并且所有的状态改变的逻辑都在store中。


The store is an over-controlling bureaucrat. All changes must go through it.

我觉得store就像一个过度控制的官僚。所有的state都得通过它来改变。并且你不能直接请求让它改变state。store没有setter方法,想要改变某个state,你必须遵循适当的程序。你必须通过action creator或者dispatcher pipeline提交一个action。

如我前面提到的,如果store在dispatcher中注册了,所有的action都会发送给它。store中,通常会通过switch查找action type来决定这个action是不是这个store关心的。如果是,它会根据这个action来计算state需要做哪些改变,并更新state。

一旦store改变了state,它会发射一个改变事件。这个会通知controller view 这个state改变了。

The controller view and the view

View主要负责取状态,并将状态渲染为可视化的图形界面给用户看,同时也接收用户输入。


The controller view likes a middle manager who gets notifications from the store and passes the data onto the views under it. The view presents that data to the user.

View是一个演播员。它不清楚app中的任何事情,只知道交给它的数据,然后怎样将这些数据格式化为用户可以理解的输出(通过HTML)。

Controller view 是store 和 view中间的管理者。当状态改变时,Store会告诉它。 它则收集新的state,并将所有更新过的state传递给它下面的所有子view。

它们是怎么一起工作的

让我们来看看这些特征是怎么一起工作的。

准备

首先setup,app 初始化,只会发生一次。

  1. Store让dispatcher知道当action来了,它们想被通知到。


  2. 然后controller view会向store询问最新的状态。
  3. 当store把最新的state给controller view时,它们会将state向下传递给它们的子view去渲染。


  4. Controller view也要求store,只要state有变化就持续通知它们。


数据流

一旦准备完成,app就已经准备好接收用户输入。那让我们通过让用户做出改变来触发一个action。
我们将用用户交互启动数据流。


  1. View 告诉action creator 准备一个action.


  2. Action creator 格式化action,然后将它发送给dispatcher。


  3. Dispatcher将action按顺序发送给store们。每个store得到所有action的通知。然后store决定是否需要处理这个action,相应的去改变state。


  4. 一旦改变state完成,store让订阅了自己的view controller们知道state改变了。
  5. 这些view controller们会询问store给它们更新后的state。


  6. 在store给了它state,view controller将会告诉它的子view根据新的state重新渲染。



    这就是我对Flux的理解,希望对你有用:)

Resource:
A cartoon guide to Flux

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Redux是受Flux启发的一种模式,导致大家对Flux感觉非常迷惑的一件事是Flux和Redux的区别。这篇文章...
    JellyL阅读 1,661评论 0 2
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,809评论 1 18
  • 去年翻译的flux官方文档对flux架构的描述,觉得最近很多朋友开始react编程了,所以我觉得有必要拿出来这篇水...
    余歌_非鱼阅读 2,509评论 0 9
  • 相信很多人在很长的一段时光都是倾向于做更好的自己,为了这个目标不懈努力,只为遇见更好的自己。但是经过一段岁月,经历...
    频频止止阅读 1,890评论 8 9
  • 最近家里很热闹,先是把婆婆公公接过来一起过年,昨天又去徐州接儿子,今天小侄子也过来了,周末还要带着孩子们训练,一向...
    方素衣阅读 958评论 0 51