不难懂------react---Immutable的基本使用

摘要:
对不可变对象的任何修改、添加或删除都将返回一个新的不可变对象。不可变实现的原则是PersistentDataStructure,即当使用旧数据创建新数据时,必须确保旧数据可用且同时保持不变。为了解决这个问题,出现了不可变对象。每次修改不可变对象时,都会创建一个新的不可变对象,而旧对象不会更改。

一、Immutable简介

  Immutable Data 就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗。

  

  在js中,引用类型的数据,优点在于频繁的操作数据都是在原对象的基础上修改,不会创建新对象,从而可以有效的利用内存,不会浪费内存,这种特性称为mutable(可变),但恰恰它的优点也是它的缺点,太过于灵活多变在复杂数据的场景下也造成了它的不可控性,假设一个对象在多处用到,在某一处不小心修改了数据,其他地方很难预见到数据是如何改变的,针对这种问题的解决方法,一般就像刚才的例子,会想复制一个新对象,再在新对象上做修改,这无疑会造成更多的性能问题以及内存浪费。

  为了解决这种问题,出现了immutable对象,每次修改immutable对象都会创建一个新的不可变对象,而老的对象不会改变。

二、Immutable注意的地方

  1、约定变量命名规则:如所有 Immutable 类型对象以 $$ 开头。

  2、fromJS和toJS会深度转换数据,随之带来的开销较大,尽可能避免使用,单层数据转换使用Map()和List()

  3、js是弱类型,但Map类型的key必须是string

  4、所有针对immutable变量的增删改必须左边有赋值,因为所有操作都不会改变原来的值,只是生成一个新的变量

  5、immutable对象直接可以转JSON.stringify(),不需要显式手动调用toJS()转原生

  6、判断对象是否是空可以直接用size

三、Immutable常用API 

复制代码
//Map()  原生object转Map对象 (只会转换第一层,注意和fromJS区别)
immutable.Map({name:'danny', age:18})
 
//List()  原生array转List对象 (只会转换第一层,注意和fromJS区别)
immutable.List([1,2,3,4,5])
 
//fromJS()   原生js转immutable对象  (深度转换,会将内部嵌套的对象和数组全部转成immutable)
immutable.fromJS([1,2,3,4,5])    //将原生array  --> List
immutable.fromJS({name:'danny', age:18})   //将原生object  --> Map
 
//toJS()  immutable对象转原生js  (深度转换,会将内部嵌套的Map和List全部转换成原生js)
immutableData.toJS();
 
//查看List或者map大小  
immutableData.size  或者 immutableData.count()
 
// is()   判断两个immutable对象是否相等
immutable.is(imA, imB);
 
//merge()  对象合并
var imA = immutable.fromJS({a:1,b:2});
var imA = immutable.fromJS({c:3});
var imC = imA.merge(imB);
console.log(imC.toJS())  //{a:1,b:2,c:3}
 
//增删改查(所有操作都会返回新的值,不会修改原来值)
var immutableData = immutable.fromJS({
    a:1,
    b:2,
    c:{
        d:3
    }
});
var data1 = immutableData.get('a') //  data1 = 1  
var data2 = immutableData.getIn(['c', 'd']) // data2 = 3   getIn用于深层结构访问
var data3 = immutableData.set('a' , 2);   // data3中的 a = 2
var data4 = immutableData.setIn(['c', 'd'], 4);   //data4中的 d = 4
var data5 = immutableData.update('a',function(x){return x+4})   //data5中的 a = 5
var data6 = immutableData.updateIn(['c', 'd'],function(x){return x+4})   //data6中的 d = 7
var data7 = immutableData.delete('a')   //data7中的 a 不存在
var data8 = immutableData.deleteIn(['c', 'd'])   //data8中的 d 不存在
复制代码

3-1、set 设置

不难懂------react---Immutable的基本使用第3张

3-2、equals、is:比较值是否相等

 不难懂------react---Immutable的基本使用第4张

3-3、push、unshift、concat

不难懂------react---Immutable的基本使用第5张

3-4、map遍历

不难懂------react---Immutable的基本使用第6张

3-5、merge

不难懂------react---Immutable的基本使用第7张

3-6、fromJs:把js对象转换成map,把数组转换成List

 不难懂------react---Immutable的基本使用第8张

3-7、toObject | toArray | toJS

   toObject:只转一层

   toArray:转成数组类型,同样只转一层

     toJs:都转

不难懂------react---Immutable的基本使用第9张

3-8、getIn | get

不难懂------react---Immutable的基本使用第10张

免责声明:文章转载自《不难懂------react---Immutable的基本使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mac上使用imagealpha命令对图片进行压缩批处理[转载]代码编辑器Sublime Text 3 免费使用方法与简体中文汉化包下载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java List与树的互转

  平时工作中都会遇到包含层级关系的List数据转换成树形结构,或者数据已是树形结构了,需要我们处理成普通的单层list结构。以下代码均为本人实际开发所写代码,可能不是最优解、复杂度也比较高,在此和大家一起分享学习!   注:该工具类支持将list转换成树/森林。可自行测试,有疑问或更优方案,可私聊我。     TreeNode@Data @JsonInc...

java 线程池的用法

1.java自带的类ExecutorService用于提供线程池服务,可以一下方法初始化线程池: ExecutorService pool = Executors.newFixedThreadPool(5);//固定线程的线程池 ExecutorService pool = Executors.newCachedThreadPool();//具有伸缩...

微信小程序循环中点击一个元素,其他的元素不发生变化,类似点击一个循环中的语音,其他的不发生点击事件

类似语音,因为都在一个数据内,所以点击第一个,所有的语音都变化,解决方法就是 把整个数据都获取下来,然后更改其中一个需要更改的值,然后再把整个数据都setdata回去,如果需要动画的话,wxml里面放两个组件,一个默认,点击时候隐藏,把另一个显示出来。   例如点击第一个语音,想要播放http://voluntarybanktestapi.wxstar.c...

Mybatis的插件 PageHelper 分页查询使用方法

Mybatis的一个插件,PageHelper,非常方便mybatis分页查询。国内牛人的一个开源项目,有兴趣的可以去看源码,都有中文注释(ps:某些源码一大堆英文,痛哭流涕!) 在github上仓库地址为:Mybatis-PageHelper 它支持基本主流与常用的数据库,这可以在它的文档上看到。这里记录一下使用的基本方法 0.查看文档与使用准备...

python的二维数组的切片避坑小结

今天想在项目中使用二维数组遇到一些坑,做一个小结为以后避坑,主要是二维数组的生成和切片部分。 (1)二维数组的切片 二维数组有list和np.array 两种数据格式,但是它们的切片方式是完全不同的。 import pandas as pd import numpy as np list = [[1,2,3],[4,5,6],[7,8,9]] list_n...

php中处理换一换的简单实例

微博中,有很多标签供用户选择,点击换一换的时候,都会不断切换。 php程序的简单实现如下: //查询所有标签 $labels = Labels::find()->setColumns('id,w_name,w_uid')->order('w_time desc')->group('w_name')->getAll(); $label...