Flux架构实践

  • 从最开始学习React就接触到Flux架构,接着前端组件化框架都涉及到Flux概念,例如Vue.js中的Vuex。一直以来Flux都不是很好理解,但俗话说实践出真知,只有在真正的项目场景上使用过了,才知道一个架构概念为什么要如此设计,可以带来什么样的好处。

Flux定义

  • Flux是一种架构思想,用来解决软件结构问题。
  • Flux将一个应用分成四个部分:

View: 视图层
Action(动作):视图层发出的消息(比如mouseClick)
Dispatcher(派发器):用来接收Actions、执行回调函数
Store(数据层):用来存放应用的状态,一旦发生变动,就提醒Views要更新页面

用一张流程图来表示:


Flux流程图
  • Flux中,数据是单向流动的:
  1. 用户访问 View
  2. View 发出用户的 Action
  3. Dispatcher 收到 Action,要求 Store 进行相应的更新
  4. Store 更新后,发出一个"change"事件
  5. View 收到"change"事件后,更新页面

一个实践和理解

  • 上面的定义在网上一搜就有。但相信很多人一开始和我一样,定义看的懂,但并不理解为什么要这么做,这样做可以带来什么好处?接下来试着用一个在实际项目中的场景来说明一下。

业务场景

公司管理功能界面
  • 界面有两个大区域组成:
  1. 顶部Header:显示当前操作的公司名称
  2. 下部Workplace:主要功能工作区,包含一个Tab组件。
  • Workplace中第一个Tab是公司选择功能:填写公司名称,点击确定之后输入的公司名称成为全局变量,并且显示在Header中。
  • 在其他Tab页面中可以获取到当前设定的公司名称值。

结构设计

  • 使用现在也非常流行的Vue.js+Vuex来解决这个问题。
  • 有一些前端模块化框架经验的同学应该很容易想到:
  1. 把两个主区域(Header, Workplace)分成两个模块(两个.vue文件)。
  2. Tab中的N个功能页面也对应着N个模块(N个.vue文件)。
  3. 使用route实现点击Tab页在Workplace中切换不同的功能模块。
  • 实现的结构大致如下:


  • 那么现在的问题就是如何将在CompanySelect.vue中设置的公司名称,传给Header.vue来展示。
  • 按前端模块化的思路,每个模块(.vue.jsx)都有自己独立的stateprops来处理数据与界面渲染的绑定。
  • 在这个功能场景下,可以通过App.vue在创建Header.vueCompanySelect.vue模块的时候,设定回调函数,在 CompanySelect.vue输入公司名称后,由回调函数把值最终传给Header.vue来显示:

Flux化

  • Flux的思路来重构:
  1. 一个项目(或者大模块)将会确定一个
  2. 在这个根上拥有state和改变state的事件方法。
  3. 根之下的功能模块“舍弃”自己的state,数据的来源与变化改为根的state。
  4. 功能模块中的操作事件只会触发根上的事件方法,不实现具体的业务逻辑。
Flux化的结构
  • 在这个例子中,CompanySelect.vue本身将不会保存公司名称的变量,“确定”按钮只把输入的值通过事件传给根(App.vue),由根进行保存和传递给其他组件。
  • 失去state和业务逻辑的功能模块,将会弱化成单纯的显示组件,所有的数据供给和业务逻辑由来组装提供。
  • 这种改变,有利于复杂项目的前端模块化,实现显示组件的复用化。

参考资料

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,702评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,290评论 25 707
  • 我想就在此刻和看到这篇文章的你分享一个沉重的话题:关于死亡和丧失,关于现实生活间隙中真实感受到尖砺和疼痛,关于我们...
    耐阅阅读 423评论 3 4
  • 题记: 胆小如我,不敢直接面对所有的过往。能做的只是远去他乡,找个地方,深藏······ ~01~ 在重庆的五年时...
    burn_up阅读 271评论 0 0
  • 又进了你的空间 重复地滑动着屏幕里你的动态 对着里面烂熟的照片 傻笑 呵呵呵呵呵 空气里还在回响着 您所拨打的电话...
    泥泞不染阅读 187评论 0 0