本文介绍了 immutability-helper 插件的基本使用,详细介绍了相关 API 的用法及注意事项。
概念
先理解一下 Immutable 的概念,Immutable数据就是一旦创建,就不能更改的数据。每当对Immutable对象进行修改的时候,就会返回一个新的Immutable对象,以此来保证数据的不可变。但是由于 Immutable 的 API 和用法学习起来比较困难,所以可以使用 immutability-helper 这个工具来对原生JS对象进行操作。本文主要是对 immutability-helper 的用法做一个讲解。
源码
欢迎 Star!欢迎 Watch!
注意事项总结
immutability-helper 不会对原有对象进行修改,只是会返回一个新的对象
$push、$unshift、$splice 的使用目标必须是数组,否则会报错
$add、$remove 的使用目标必须是 Set 或 Map
其余 API 的使用目标可以是任意数据
$splice 的参数是一个操作数组,可以对目标数组一次进行多次操作,但是参数 arrays 中的项是按顺序执行的,所以使用时需要注意顺序
任意 API 均可在多层结构内使用。可查看扩展用法示例
可以同时执行多个 API 操作,但是请注意:多个 API 在一个语句中执行时,只会执行最后一个!!!。可查看注意用法示例
常用 API
{$push: array} 同数组的 push 方法,将参数 array 中的所有项 push 到目标数组中
{$unshift: array} 同数组的 unshift 方法,将参数 array 中的所有项 unshift 到目标数组中
{$splice: array of arrays} 同数组的 splice 方法,对于参数 arrays 中的每一项,使用该项提供的参数对目标数组调用 splice()
PS: 参数 arrays 中的项是按顺序应用的,所以顺序很重要。在操作过程中,目标的指针可能会发生变化
{$set: any} 使用 any 值替换目标
{$toggle: array of strings} 将参数 array 中提供的下标或者属性的值切换成相反的布尔值
{$unset: array of strings} 从目标对象中移除参数 array 中的键列表
{$merge: object} 将参数 object 的键与目标合并
{$apply: function} 将当前值传递给函数并用新的返回值更新它
{$add: array of objects} 向 Set 或 Map 中添加值。添加到 Set 时,参数 array 为要添加的对象数组,添加到 Map 时,参数 array 为 [key, value] 数组
{$remove: array of strings} 从 Set 或 Map 中移除参数 array 中的键列表
API 用法及示例
初始化四个变量,之后的各种 API 操作都是基于这四个变量
1 | const initialObject = { |
{$push: array}
1 | /** |
{$unshift: array}
1 | /** |
{$splice: array of arrays}
1 | /** |
{$set: any}
1 | /** |
{$toggle: array of strings}
1 | /** |
{$unset: array of strings}
1 | /** |
{$merge: object}
1 | /** |
{$apply: function}
1 | /** |
{$add: array of objects}
1 | /** |
{$remove: array of strings}
1 | /** |
扩展用法
- 可多层结构内使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/**
* 扩展用法:可多层结构内使用
*/
const initialConfig = {
width: 100,
height: 100,
options: [
{ color: 'red', shape: 'Square' },
{ color: 'blue', shape: 'Circular' }
]
}
// 多层结构内使用
const multiConfig1 = update(initialConfig, { options: { color: { $set: 'pink' } } });
console.log('multiConfig1:', multiConfig1);
/* =>
{ width: 100,
height: 100,
options:
[ { color: 'red', shape: 'Square' },
{ color: 'blue', shape: 'Circular' },
color: 'pink' ] }
*/
注意用法
- 多种操作不要一起使用,否则只会执行最后的一个操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24/**
* 注意用法:多种操作不要一起使用,否则只会执行最后的一个操作
*/
const initialConfig = {
width: 100,
height: 100,
options: [
{ color: 'red', shape: 'Square' },
{ color: 'blue', shape: 'Circular' }
]
}
// 例子:只会执行最后的设置 color 属性的操作
const multiConfig2 = update(initialConfig, { options: { $push: [ { color: 'deepPink', shape: 'Triangle' } ] }, options: { color: { $set: 'pink' } } });
console.log('multiConfig2:', multiConfig2);
/* =>
{ width: 100,
height: 100,
options:
[ { color: 'red', shape: 'Square' },
{ color: 'blue', shape: 'Circular' },
color: 'pink' ] }
*/