您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Redux 先前技术

R 是混合产物。它和一些设计模式及技术相似,但也有不同之处。让我们来探索一下这些相似与不同。

R 的灵感来源于  的几个重要特性。和 Flux 一样,R 规定,将模型的更新逻辑全部集中于特定的层(Flux 里的 store,R 里的 reducer)。Flux 和 R 都不允许程序直接数据,而是用叫作 “action” 的普通对象来对更改进行描述。

而不同于 Flux ,R 并没有 dispatcher 的概念。原因是它依赖纯来替代事件处理器。纯构建简单,也不需额外的实体来管理它们。你可以将这点看作这两个框架的差异或细节实现,取决于你怎么看 Flux。Flux 常常。从这个意义上说,R 无疑是 Flux 架构的实现,且得益于纯而更为简单。

和 Flux 的另重要区别,是 R 设想你永远不会变动你的数据。你可以很好地使用普通对象和数组来管理 state ,而不是在多个 reducer 里变动数据。正确且简便的方式是,你应该在 reducer 中返回新对象来更新 state, 同时配合  或一些库,如 。

虽然出于方面的考虑, 来变动数据在技术上是可行的,但我们并不鼓励这么做。不纯的 reducer 会使一些开发特性,如时间旅行、记录/回放或热加载不可实现。此外,在大部分实际应用中,这种数据不可变动的特性并不会带来问题,就像  所表现的,即使对象分配失败,仍可以防止昂贵的重渲染和重计算。而得益于 reducer 的纯度,应用内的变化更是一目了然。

 是一种式编程语言,由  受 Haskell 语言的启发开发。它执行一种  ,更新遵循 (state, action) => state 的规则。 Elm 的 “updater” 与 R 里的 reducer 服务于相同的目的。

不同于 R,Elm 是一门语言,因此它在执行纯度,静态类型,不可变动性,action 和模式匹配等方面更具优势。即使你不打算使用 Elm,也可以读一读 Elm 的架构,尝试一把。基于此,有有趣的 的项目。R 应该能从中获得更多的启发! 为了更接近 Elm 的静态类型, 。

 是可实现持久数据结构的 JavaScript 库。它很好,并且命名符合 JavaScript API 的语言习惯 。

Immutable 及类似的库都可以与 R 对接良好。尽可随意捆绑使用!

R 并不在意你如何存储 state,state 可以是普通对象,不可变对象,或者其它类型。 为了从 server 端写同构应用或融合它们的 state ,你可能要用到序列化或反序列化的机制。但除此以外,你可以使用任何数据存储的库,只要它数据的不可变动性。举例说明,对于 R state ,Backbone 并无意义,因为 Backbone model 是可变的。

注意,即便你使用 cursor 的不可变库,也不应在 R 的应用中使用。整个 state tree 应被视为只读,并需通过 R 来更新 state 和更新。因此,通过 cursor 来改写,对 R 来说没有意义。而如果只是想用 cursor 把 state tree 从 UI tree 解耦并逐步细化 cursor,应使用 selector 来替代。 Selector 是可组合的 getter 组。具体可参考 ,这是优秀、简洁的可组合 selector 的实现。

 是另流行的库,实现了数据不可变特性的 API,用以更新纯 JavaScript 对象。你当然可以在 R 中使用它,但两者一起使用并没有什么优势。

Baobab 所提供的大部分都与使用 cursors 更新数据相关,而 R 更新数据的唯一是分发 action 。可见,两者用不同,的却是同样的问题,相互并无增益。

不同于 Immutable ,Baobab 在引擎下还不能实现任何特别有效的数据结构,同时使用 Baobab 和 R 并无裨益。这种情形下,使用普通对象会更简便。

无论如何,Flux 的创造者们了。

 是管理复杂异步应用非常优秀的方案。。

同时使用它和 R 有意义么?当然!它们配合得很好。将 R store 视作可观察变量非常简便,例如:

function toObservable(store) {
  return {
    subscribe({ next }) {
      const unsubscribe = store.subscribe(() => next(store.getState()))
      next(store.getState())
      return { unsubscribe }
    }
  }
}

使用类似,你可以组合不同的异步流,将其转化为 action ,再提交到 store.dispatch() 。

问题在于: 在已经使用了 Rx 的情况下,你真的需要 R 吗? 

不一定。 并不难。有人说仅需使用一两句的 .scan() 即可。这种做法说不定不错!

如果你仍有疑虑,可以去查看 R 的源 (并不多) 以及生态系统 (例如)。如果你无意于此,仍坚持使用交互数据流,可以去探索一下  这样的库,或把它合并到 R 中。记得告诉我们它运作得如何!


联系我
置顶