immutable使用

1. 使用groupBy之后,获取数据

const allDatasGroupBy = allDataValues.toList().groupBy(x => x.get('floor'))

使用groupByList转为以某个元素分组的“Map”之后,其实得到的是OrderedMap,而并不是Map,所以获取其某一项值,就需要注意了,如果分组的keynumber的话(只要能转成number,它分组之后就是number,请看第二张图片,即使是-1),就不能按Map那样的获取用get(string)来取值,需要get(number)来获取;如果分组的keystring的话,就按get(string)来获取即可

WX20190905-152443@2x.png
WX20190905-154506@2x.png

2.Map可以使用merge,或者mergeDeep

更新Map的数据,可以使用merge来做,如果Map内层只是简单类型,就直接使用merge即可;但是如果Map内层复杂类型,就需要使用mergeDeep,否则,merge之后获取内层数据就变成了object而非Map/List,这样就会出现初始值和新merge进去的数据内部获取方式不一样。

重现了半天这个问题,也没有重现出来,似乎直接merge也并未出现这个问题。不过当时遇到的问题就是这样的,通过mergeDeep解决了,再不过后面没有采取这个方式来进行处理,所以当时项目中的代码也删掉。后面有时间再仔细研究一下————到底什么时候需要mergeDeep

还要注意一点,merge的时候,会改变原Map里面内容的顺序——遇坑。

3.更新update

对List或者Map列表中的每一项进行更新或者设置都可以使用update。

const type = 'add'
// allData 是一个Map
console.log(state.get('allData').toJS())
const newState = state.update('allData', list => list.map(item => item.set('floor', 111111)))
const newStates = state.update('allData', list => list.map((item) => {
    if (type === 'add'){
        return item.set('floor', 11).set('status', 1)
    }
    return item.set('floor', 22).set('status', 2)
}))
console.log(newState.get('allData').toJS())
console.log(newStates.get('allData').toJS())
//======================================================

// allDataArr 是一个List
console.log(state.get('allDataArr').toJS())
const newArrState = state.update('allDataArr', list => list.map(item => item.set('floor', 111111)))

const newArrStates = state.update('allDataArr', list => list.map((item) => {
    if (type === 'add'){
        return item.set('floor', 11).set('status', 1)
    }
    return item.set('floor', 22).set('status', 2)
}))
console.log(newArrState.get('allDataArr').toJS())
console.log(newArrStates.get('allDataArr').toJS())

WX20190905-170438@2x.png

同时数组中更新还可以直接具体到某一项,比如要更新第一个元素:

const newState0 = state.update('allDataArr', list => list.update(0, li => li.set('value', newName))) 
//[{floor: 1, uuid: "entity", value: "aaaaa"},{floor: 2, uuid: "event"}]

对其中满足某个条件的某一条进行更新:(通过findIndex找到它的索引)

// 原数据:
const allDatasArrInit = [
    { floor: 1, uuid: 'entity', roles: [1,222] },
    { floor: 2, uuid: 'event', roles: [22] },
]
.....
console.log(state.get('allDataArr').toJS()) // 上面的allDatasArrInit
const newArrState0 = state.update('allDataArr', arr => arr.update( 
    arr.findIndex(item => item.get('floor') === 1), 
    item => item.update('roles', roles => roles.unshift('22'))
))
   
console.log(newArrState0.get('allDataArr').toJS()) 
// [
    { floor: 1, uuid: 'entity', roles: [1,222,'22'] },
    { floor: 2, uuid: 'event', roles: [22] },
]

还可以做某一项某个元素的过滤:


const newArrState1 = state.update('allDataArr', arr => arr.update( 
    arr.findIndex(item => item.get('floor') === 1), 
    item => item.update('roles', roles => roles.filter(roleId => roleId !== 1))
))

console.log(newArrState1.get('allDataArr').toJS()) 
// [
    { floor: 1, uuid: 'entity', roles: [222] },
    { floor: 2, uuid: 'event', roles: [22] },
]

上述也可以称为做删除:

// 原数据:
const allDatasArrInit = [
    { floor: 1, uuid: 'entity', roles: [1,222] },
    { floor: 2, uuid: 'event', roles: [22] },
]
// 方法一:使用update和delete
const newArrState1 = state.update('allDataArr', arrs => arrs.delete(arrs.findIndex(item => item.get('floor') === 1)))
// 方法二: 使用update和filter
const newArrState2 = state.update('allDataArr', arr => arr.filter(item => item.get('floor') !== 1))
console.log(newArrState1.get('allDataArr').toJS()) // [{ floor: 2, uuid: 'event', roles: [22] }]
console.log(newArrState2.get('allDataArr').toJS()) // [{ floor: 2, uuid: 'event', roles: [22] }]

更新中还需要注意一点:update最后一个参数处是一个函数

// 原数据:
const allData = {1:{active:false},2:{active:true}}
// 正确的--------
const activeUuid = 1
const newState = state.updateIn(['allData', activeUuid], val => val.set('active', true))
// 或者
const newState = state.updateIn(['allData', activeUuid, 'active'], () => true)
// 错误的--------
const newState = state.updateIn(['allData', activeUuid,'active'],true)

4.对List进行添加和删除值

// 原数据
const countParam = [
    levels: [{...}],
    selected: [13,12,14]
]
// 将新值newId = 22加入到selected中,去除
// 方法一:
// 【tlm】笨方法,先判断有无,有删除,再push进去,当然是为了 展示delete和push
const newState = state.updateIn(['countParam', 'selected'], (list) => { 
    const ind = list.findIndex(li => li === newId) 
    if (ind !== -1) { 
        return list.delete(ind) 
    } 
    return list.push(newId)
})

// 方法二:
// 【tlm】当然可能这个方法也不是最优,但说明使用技巧即可
const newState = state.updateIn(['countParam', 'selected'], (list) => {
    const newList = list.push(newId)
    // 如果是newIds = [22,12],则可以使用const newList = [...list,...newIds]
    return [...new Set(newList)]
}

观察方法二中的代码,注意一点:
虽然数组很多的方法和List的相同,但是我们需要注意push方法:

在数组中:

const arr = [111,222,333]
const arrNewlen = arr.push(444)// 4
arr // [111,222,333, 444]

在List中:

const arr = List([111,222,333])
const arrNew = arr.push(444)// List([111,222,333,444])
arr.size // 3
arrNew.size // 4

5. valueSeq

valueSeq对于Map相当于Object.values相对于object一样的效果,取值组成一个Seq.Indexed of the values/数组。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容