ImmutableJS
foo={a: 1}; bar=foo; bar.a=2 你会发现此时 foo.a 也被改成了 2。什么是 IMMUTABLE DATA

// 1. Map 大小const map1 = Map({ a: 1 });
map1.size// => 1
// 2. 新增或取代 Map 元素// set(key: K, value: V)const map2 = map1.set('a', 7);
// => Map { "a": 7 }
// 3. 删除元素// delete(key: K)const map3 = map1.delete('a');
// => Map {}
// 4. 清除 Map 内容const map4 = map1.clear();
// => Map {}
// 5. 更新 Map 元素// update(updater: (value: Map<K, V>) => Map<K, V>)// update(key: K, updater: (value: V) => V)// update(key: K, notSetValue: V, updater: (value: V) => V)const map5 = map1.update('a', () => (7))
// => Map { "a": 7 }
// 6. 合并 Map const map6 = Map({ b: 3 });
map1.merge(map6);
// => Map { "a": 1, "b": 3 }
// 1. 取得 List 长度const arr1 = List([1, 2, 3]);
arr1.size// => 3
// 2. 新增或取代 List 元素内容// set(index: number, value: T)// 将 index 位置的元素替换const arr2 = arr1.set(-1, 7);
// => [1, 2, 7]const arr3 = arr1.set(4, 0);
// => [1, 2, 3, undefined, 0]
// 3. 删除 List 元素// delete(index: number)// 删除 index 位置的元素const arr4 = arr1.delete(1);
// => [1, 3]
// 4. 插入元素到 List// insert(index: number, value: T)// 在 index 位置插入 valueconst arr5 = arr1.insert(1, 2);
// => [1, 2, 2, 3]
// 5. 清空 List// clear()const arr6 = arr1.clear();
// => []
// 1. 建立 Setconst set1 = Set([1, 2, 3]);
// => Set { 1, 2, 3 }
// 2. 新增元素const set2 = set1.add(1).add(5);
// => Set { 1, 2, 3, 5 } // 由于 Set 为不能重复集合,故 1 只能出现一次
// 3. 删除元素const set3 = set1.delete(3);
// => Set { 1, 2 }
// 4. 取联集const set4 = Set([2, 3, 4, 5, 6]);
set1.union(set4);
// => Set { 1, 2, 3, 4, 5, 6 }
// 5. 取交集set1.intersect(set4);
// => Set { 2, 3 }
// 6. 取差集set1.subtract(set4);
// => Set { 1 }
const map=Immutable.map(); //........... map.getIn()
immutableData.getIn(['a', 'b']) // {a:{b:2}} 得到2。访问深层次的key
看到了吧,你还是不会的,加油学习吧
const $obj = fromJS({
a: 1
});
funcationA($obj);
console.log($obj.get('a')) // 1
- Structural Sharing 为了维持资料的不可变,又要避免像
deepCopy一样复制所有的节点资料而造成的资源损耗,在ImmutableJS使用的是 Structural Sharing 特性,亦即如果物件树中一个节点发生变化的话,只会修改这个节点和和受它影响的父节点,其他节点则共享。
count: 1,
list: [1, 2, 3, 4, 5]
}
var map1 = Immutable.fromJS(obj);
var map2 = map1.set('count', 4);
console.log(map1.list === map2.list); // true
- Support Lazy Operation
.map(n => -n)
// Error: Cannot perform this action with an infinite size.
Immutable.Range(1, Infinity)
.map(n => -n)
.take(2)
.reduce((r, n) => r + n, 0);
// -3
fromJS()、toJS() 进行 JavaScript 和 ImmutableJS 之间的转换。但由于在转换之间会非常耗费资源,所以若是你决定引入 ImmutableJS 的话请尽量维持资料处在 Immutable 的状态。Immutable 本身就是 Functional Programming(函数式程式设计)的概念,所以在 ImmutableJS 中可以使用许多 Functional Programming 的方法,例如:map、filter、groupBy、reduce、find、findIndex 等。React 效能优化
ImmutableJS 除了可以和 Flux/Redux 整合外,也可以用于基本 react 效能优化。以下是一般使用效能优化的简单方式:
传统 JavaScript 比较方式,若资料型态为 Primitive 就不会有问题:
// 在 shouldComponentUpdate 比较接下来的 props 是否一致,若相同则不重新渲染,提升效能shouldComponentUpdate (nextProps) {
return this.props.value !== nextProps.value;
}
但当比较的是物件的话就会出现问题:
// 假设 this.props.value 为 { foo: 'app' }// 假设 nextProps.value 为 { foo: 'app' },// 虽然两者值是一样,但由于 reference 位置不同,所以视为不同。但由于值一样应该要避免重复渲染this.props.value !== nextProps.value; // true
ImmutableJS:var x = new SomeRecord({ foo: 'app' });
var y = x.set('foo', 'azz');
x === y; // false
PureRenderMixin 进行比较,可以让程式码更简洁:class FooComponent extends React.Component {
constructor(props) {
super(props);
this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this);
}
render() {
return <div className={this.props.className}>foo</div>;
}
}
原生js转换为immutableData
Immutable.fromJS([1,2]) // immutable的 list
Immutable.fromJS({a: 1}) // immutable的 map
从immutableData 回到 JavaScript 对象
immutableData.toJS()
判断两个immutable数据是否一致
Immutable.is(immutableA, immutableB)
判断是不是map或List
Immutable.Map.isMap(x)
Immutable.Map.isList(x)
对象合并(注意是同个类型)
immutableMaB = immutableMapA.merge(immutableMaC)
Map的增删查改
查
immutableData.get('a') // {a:1} 得到1。
immutableData.getIn(['a', 'b']) // {a:{b:2}} 得到2。访问深层次的key
增和改(注意不会改变原来的值,返回新的值)
immutableData.set('a', 2) // {a:1} 得到1。
immutableData.setIn(['a', 'b'], 3)
immutableData.update('a',function(x){return x+1})
immutableData.updateIn(['a', 'b'],function(x){return x+1})
删
immutableData.delete('a')
immutableData.deleteIn(['a', 'b'])
List的增删查改
如同Map,不过参数变为数字索引。
比如immutableList.set(1, 2)
其它便捷函数
如同underscore的方法,都有噢。
ImmutableJS的更多相关文章
- immutableJS一些API
原生js转换为immutableData Immutable.fromJS([1,2]) // immutable的 list Immutable.fromJS({a: 1}) // immutabl ...
- redux、immutablejs和mobx性能对比(一)
一.前言 关于react的性能优化,有很多方面可以去做,而其中避免重复渲染又是比较重要的一点,那么为什么react会重复渲染,我们又该如何避免重复渲染呢,关于这方面官方其实早有说明:避免重复渲染,这里 ...
- redux、immutablejs和mobx性能对比(三)
四.我的结论 通过第三部分的数据数据分析,我觉得我们可以得到以下结论: 无论是在开发环境还是测试环下页面的首次加载速度结果都是:redux>immutablejs>mobx,但是他们之间的 ...
- redux、immutablejs和mobx性能对比(二)
三.分析数据 1.前提说明 我对测试出的10个数据摘除最大值与最小值,然后求平均值 根据平均值我绘制了一个曲线图一个柱状图 曲线图用于查看1000-100000的性能趋势 柱状图用于比较在相同条数下r ...
- immutable-js基础
Immutable.js(和原生方法不同): 用于深层次的数组和对象的比较 数据结构:Map Set Seq List Rang(和原生不同) 首先:先忘记es5 es6的数组对象方法 官 ...
- [Immutable.js] Updating nested values with ImmutableJS
The key to being productive with Immutable JS is understanding how to update values that are nested. ...
- 最新Angular2案例rebirth开源
在过去的几年时间里,Angular1.x显然是非常成功的.但由于最初的架构设计和Web标准的快速发展,逐渐的显现出它的滞后和不适应.这些问题包括性能瓶颈.滞后于极速发展的Web标准.移动化多平台应用, ...
- JavaScript资源大全中文版(Awesome最新版)
Awesome系列的JavaScript资源整理.awesome-javascript是sorrycc发起维护的 JS 资源列表,内容包括:包管理器.加载器.测试框架.运行器.QA.MVC框架和库.模 ...
- React 组件性能优化
React组件性能优化 前言 众所周知,浏览器的重绘和重排版(reflows & repaints)(DOM操作都会引起)才是导致网页性能问题的关键.而React虚拟DOM的目的就是为了减少浏 ...
随机推荐
- 使用Post方法模拟登陆爬取网页(转)
使用Post方法模拟登陆爬取网页 最近弄爬虫,遇到的一个问题就是如何使用post方法模拟登陆爬取网页.下面是极简版的代码: import java.io.BufferedReader; impor ...
- osg提前定义几何体设置颜色
注意尽管osg::shape不能够设置颜色,可是osg::shapedrawable能够.
- CNN卷积神经网络的改进(15年最新paper)
回归正题,今天要跟大家分享的是一些 Convolutional Neural Networks(CNN)的工作. 大家都知道,CNN 最早提出时,是以一定的人眼生理结构为基础,然后逐渐定下来了一些经典 ...
- Android入门级编译错误汇总
1 描写叙述: 项目常常须要引用别人的libraryproject,在选项中add进来后,点击应用或者确定.关闭页面. 回到代码中却发现无法链接,又一次打开properties查看,发现导入的pr ...
- 《软件project》——编码
编码的目的是使用选定的程序设计语言,把模块的过程描写叙述翻译为用该语言书写的源程序. 源程序应该正确可靠.简明清晰,并且具有较高的效率.在编程的步骤中,要把软件具体设计的表达式翻译成为编程语言的 ...
- CLR-基元类型以及溢出检查 (CLR-Via-C#) 类型基础
CLR-基元类型以及溢出检查 =========(CLR via C#阅读笔记)======== 基元类型(primitive type): 基元类型也不做过多的解释,举个例子即可清晰的辨别 在j ...
- 运行shell脚本报错 '\357\273\277': command not found 解决的方法
1,删除BOM,在vi以下运行以下的命令就可以 :set nobomb 2,原因: 所谓BOM,全称是Byte Order Mark.它是一个Unicode字符,通常出如今文本的开头,用来标识字节序( ...
- CGlib小记
CGlib是一个强大的代码生成包.常被用于各种AOP框架,提供"拦截"功能. JDK本身就为控制要訪问的对象提供了一 种途径,动态代理Proxy. 可是被代理的累必须实现一个或多个 ...
- LightTable的结构(二)
这节主要研究下object的一个属性,behaviors 定义一个behavior需要提供name,trigger,reaction (behavior ::on-close-destroy :tri ...
- XML解析方式汇总
XML解析方式汇总 分类: XML2011-08-23 19:19 167人阅读 评论(0) 收藏 举报 xmlstringexceptionattributesclassiterator DOM解析 ...