世间自有公道,付出总有回报,说到不如做到,要做就做好,步步高!

【译】用实例讲解 ImmutableJS 1

Immutable.js是一个非常棒的库,用于创建不可变的数据集合,非常受React / Redux开发者的欢迎,但是没有出色的文档。在这一系列深入的教程中,我们通过现场编码实例来详细深入的了解Immutable.js.

What is Immutable.js ?

Immutable.js是一个用于创建数据集合的库,一旦创建,就不能更改。这些集合以JavaScript的数组、Map和Set对象为模型,但由于所有方法都可以在集合中添加、删除或更新数据,所以这些集合都不会发生变化。

(从现在起你使用Immutable 所做的一切操作都将返回新的集合或对象,原集合或对象不会被修改)

例如,Immutable的push()方法将一个数据项添加到不可变List中,实际上将该项添加到List的新副本,而原始List集合完全不变。

为了看到这一点,下面显示了一个标准的JavaScript Array的push()方法,它作用于数组本身:

// Standard mutating JavaScript Array push
const collection = ['ironMan'];
collection.push('captainAmerica');
​
// Output:
collection;
-----------------------------------------------------------
Array [
  "ironMan",
  "captainAmerica",
]

对比一下,使用immutable操作原始列表,原列表的数据完全不变:

// Immutable.js non-mutating List.push
const collection = Immutable.List.of('ironMan');
collection.push('captainAmerica');
​
// Output:
collection;

------------------------------------------------

["ironMan"]


在这个例子中,collection's push()制造一个collection的复本,并压入一个新值到此复本中,collection本身完全不受其影响(关我鸟事)

要查看push()方法后的结果,我们需要为其指定一个新变量

// Immutable.js non-mutating List.push
const collection = Immutable.List.of('ironMan');
const newCollection = collection.push('captainAmerica');

// Output:
console.log(newCollection);

// ---------------------------------------------------------

["ironMan", "captainAmerica"]


Getting your head around Immutable collections

不可变的让我们创建复杂的对象,包括JavaScript对象、数组,甚至是数组的嵌套数组,每个复杂对象都充当不变的值。然而,这很难想象,因为我们非常习惯于JavaScript对象,它包含具有不断变化的值的属性。例如,考虑一个用户对象,它包含用户名、emailAddress、age等属性,这些值可以随时更改。

然而,使用不可变集合,这些属性的值永远不会改变。你如何把它想象出来,更别说行动了?

有两种方法可能有助于更具体理解这个概念。

把不可变数据看作一个值(Think of Immutable data as a value)

不可变集合应该被看作是一个值,例如一个数字。永远不会改变。例如,数字7总是7。如果你加1到7,你就得到了一个新的值(即8 -你知道,对吧?),但这并没有改变7本身——它仍然是7。

回到上面的集合示例,不可变集合与数字没有什么不同。我们可以将一个项添加到集合中,但这不会改变原始集合本身。实际上,我们可以考虑集合的push()方法,它将一个项添加到一个现有集合中,就像在一个数字上添加一个额外的操作一样,它为一个现有的数字添加了一个新的值。在这两种情况下,原始值——集合和数字——完全保持不变,并返回一个新值。

这就是不可变数据的本质。

把不可变的数据看作代表数据的状态

另一种思考Immutable集合的方法是将其视为创建集合的特定时间点的数据状态。每当我们查询这个集合时,我们总是得到它创建时存在的数据的状态。我们可能会及时移动,但收集本身从来没有。

所以,当我们查询一个集合来检索它的数据时,我们并不是说这个集合“现在就给我你的数据”,我们实际上是在说:“给我你的数据,就像你第一次创建数据集时“。

因此,对Immutable集合中的数据执行的任何操作(例如,添加或移除项目)将在稍后的时间点更改该数据的状态,但操作之前数据的状态保持不变。操作之后剩下的是两个集合 - 第一个表示操作之前的数据状态,第二个表示操作之后的数据状态。

下面的例子可能有助于澄清这一点:

// state1 = the original state of the data at the time of 
// its creation: time 0
const state1_time0 = Immutable.List.of('ironMan');

// state2 = the new state of the data at a later time (time 1)
// i.e. after a push operation has been performed
const state2_time1 = state1_time0.push('captainAmerica');

// state1_time0 never changes, as it always reflects the state 
// of the data at time 0
state1_time0;

-------------------------------------------------------

['ironMan']


如何操作不可变集合

我们已经看到了如何考虑不可变数据;现在我们需要知道如何操作它。 Immutable是一个强大的库,以一种安全,不可变的方式处理我们的数据集合。不是一两句话就能整明白的,今天就到这儿先!

posted @ 2017-12-07 14:05  疯狂秀才  阅读(654)  评论(0编辑  收藏  举报