0.0.15 • Published 5 years ago

mutated v0.0.15

Weekly downloads
1
License
MIT
Repository
github
Last release
5 years ago

mutated

一个十分简单的用于数据汇总,以及作为React状态的库。并且需要注意,它是明目张胆anti-pattern的。

以下是写这个库的动机

Model和View分离的粒度

按照React目前流行的开发方式,所有的状态都被汇总到一个redux-store里。对数据的更新是通过一级级的reducer函数逐步从最子层的调用传递到最高层去。 这种方法本质上是构造了一个高阶函数,有些curry function的意味。如果不使用redux,我们还可以使用其他的数据结构的库, 例如immutable.js/cortex.js,它们内部通过一些机制,使得状态被更新总保证是创建了一个新的对象。但是无论是多复杂的数据结构, 你都需要在单独维护数据结构的那个component中调用处理数据的方法。

从代码写作的角度,这点很像关注点分离的思路,例如CSS/JS/HTML的分离,M和V的分离。然而这样做却使得组件的复用性很差。不同层级的组件不得不去传递和它们 自己不相关的数据处理方法。

想象我们在开发一个表格应用。位于最上层的Provider提供了对表格数据处理的方法,那么Provider要把行、列、单元格的方法先传递给工作表组件,工作表传递给行组件之后, 行组件再把列、单元格的处理方法传递给列组件。也就是说这些组件要传递大量与自己的逻辑无关的操作,这极大降低了复用性。

那么一个更好的思路是,每个层次的组件只关心对应层次的数据处理方法。本层次的数据作为状态来更新,而这些数据的子一级数据则被作为属性传递给子一级的组件。 当然,表面上看这很不错,但其实这是React非常不鼓励的方式。这意味着数据的双向绑定,违背了React的设计初衷。(不过事情也在起着变化,稍后会说明)

没有一个既能作为组件状态,又方便进行数据处理的库

从数据库抓来的JSON是由Array和Object构成,我想进行数据处理要先装个lodash。但是lodash很多时候不满足immutable的条件, 所以我需要再装一个immutable.js。那么能否存在一个库,既能灵活地处理数据,又能满足作为React状态的条件呢?

我们如何实现数据的双向更新?

所谓的双向更新,指的是一个组件在两种情况下会重新渲染。第一种是state,也就是内部状态发生改变,这是最常用的。 第二种是props,也就是上一级所传递的属性发生改变,这是不鼓励的。

可以影响到React的rendering的机制,目前有三个。第一个是最熟悉的setState。setState是react渲染生命周期的开始。 它向队列里提交了一个重新渲染的请求。React的reconcilation机制会判断如何最小代价修改相应的DOM并进行重绘,来满足状态被改变的效果。 第三个是forceUpdate,它会破坏渲染周期并无条件地刷新组件,我们的底线是不是用forceUpdate。

所以问题归结到了第二个方法,也就是在React 16之后出现的,getDerivedStateFromProps(props, state), gDSFP。

0.0.15

5 years ago

0.0.14

5 years ago

0.0.13

5 years ago

0.0.12

5 years ago

0.0.11

5 years ago

0.0.10

5 years ago

0.0.9

5 years ago

0.0.8

5 years ago

0.0.7

5 years ago

0.0.6

5 years ago

0.0.5

5 years ago

0.0.4

5 years ago

0.0.3

5 years ago

0.0.2

5 years ago

0.0.1

5 years ago