(精)组件与数据流

参考自这个文章:

https://zhuanlan.zhihu.com/p/26426054

该文章利用公式的方式解释程序设计,很独特。

这个文章值得我反复阅读思考。

名词概念

Reactive理念

reduce & reducer

单向数据流

数据管道

天然支持数据单向流动。

RxJS或者xstream,这些库,因为拥有下面这些特性,很适合做数据流控制:

  • 对事件的高度抽象
  • 同步和异步的统一化处理
  • 数据变更的持续订阅(订阅模式)
  • 数据的连续变更(管道拼接)
  • 数据变更的的组合运算(管道组合)
  • 懒执行(无订阅者,则不执行)
  • 缓存的中间结果
  • 可重放的历史记录
    ……等等

MDV(MOdel-Driven-View)架构

1
state := actions.reduce(reducer, initState)

这个表达式的含义是:在初始状态上,依次叠加后续的变更,所得的就是当前状态。这就是当前最流行的数据流方案Redux的核心理念。

从整体来说,使用Redux,相当于把整个应用都实现为命令模式,一切变动都由命令驱动。

MVI(Model View Intent)架构

1
Component := View(Model(Intent({ DOM, Http, WebSocket })))
  • Intent,负责从外部的输入中,提取出所需信息(翻译为意图?)
  • Model,负责从Intent生成视图展示所需的数据
  • View,负责根据视图数据渲染视图

一个组件其实是:数据模型、动作、视图三者的集合,这么一个MVI组件相当于React-Redux体系中,connect了store之后的高阶组件。

  • 视图隔离,纯化为展示组件
  • 内部状态的定义清晰化
  • 描述出内部状态的来源关系:state := actions.reduce(reducer, initState)
  • 将内部的动作以action的方式输出到上面那个表达式关系中

与Redux相比,这套机制的特点是:

  • 不需要显式定义整个应用的state结构
  • 全局状态和本地状态可以良好地统一起来
  • 可以存在非显式的action,并且action可以不集中解析,而是分散执行
  • 可以存在非显式的reducer,它附着在数据管道的运算中
  • 异步操作先映射为数据,然后通过单向联动关系组合计算出视图状态

connect高阶函数

分形

https://en.wikipedia.org/wiki/Fractal

一种设计,如果支持分形似乎天然就意味着无限的可扩展性 - 因为分形的API天然就是可扩展的。

前端数据库

高阶处理

component local state

组件的数据和逻辑管理

刀锋女王带领的虫群部队 人类军
纯展示 带逻辑
贫血组件 充血组件
一切状态外置,组件不管理自己状态 部分内置,由组件自己管理,另外一些由全局Store管理
单个蚂蚁的智能程度很低,但它可以接受蚁王的指令去做某些事情,所有的麻烦事情都集中在上层,决策层的事务非常繁琐。 每个人都有自己的思考和执行能力,一个管理有序的体系中,管理者只需决定他和自己直接下属所需要做的事情就可以了。

结论

  • 从原始数据到视图数据的处理过程不应当放在reducer或mutation中,那很显然就应当放在视图组件的内部去做。
  • store里面存放的是扁平化的原始数据(可以借助normalizr库做扁平化)

资料

Vue和React的设计参考-Cycle.js:

https://frikki.medium.com/plug-and-play-all-your-observable-streams-with-cycle-js-e543fc287872#.by4c219c8

https://github.com/cyclejs/cyclejs

ReactiveX:

https://reactivex.io/

RxJS:

https://github.com/reactivex/rxjs

Vue+Rx的集成方式:

https://github.com/vuejs/vue-rx/

概念扫盲:

https://ithelp.ithome.com.tw/users/20103367/ironman/1199