immutable里Map结构里更改List

immutable

今天学了一个好用的东西,就是immutable。但今天就踩了一个很大的坑、当我更改数据后我的mapStatetoprops里本来获取的messageList结构内容变为了直接的三个false

  • 下面是基本数据结构
import { Map, List } from "immutable"

const initialState = Map({
  loading:false,
  messageList:List([
    {id:1,context:'好久没出门了',read:true},
    {id:2,context:'是啊',read:true},
    {id:3,context:'难受香菇',read:false}
  ])
})

需求,当dispatch发动作的时候,更改messageList下List结构全部对象read属性改为false

immutable里数据发生改变时,他会自动生成一个新的结构,修改时需要用set和update来改变,但当我使用简单的set时,发现改变不成功 = = 这里就不上传自己的错误代码了。

  • 这是我的解决办法
    当Map对象里含有List时简单的set可能就改变不到深层数据中的List了,下面是我解决的方法,有不对的地方希望有大佬提出以下。。
  • 下面是reducer里的数据模块,附上我的理解

export default (state = initialState, { type }) => {
  switch (type) {
  case "ALLHANDLE":
    let newList = state.get("messageList") // 这里需要获取一下list的那个组件,List数据结构生成的数组
    // 因为我们是要修改所有的数据,这里就是用了循环。主要是使用了下标 i
    state.get("messageList").forEach((v,i)=>{
    // 这里修改获取的newList进行update 因为他是Immutable数据结构,
    // 每次改变都会生成一个新的数组,不会改变原来的数据
    // update三个参数。第一个为选择元素下标,第二个为修改的建,三是回调,修改的数据
        newList =   newList.update(i,"read",item=>{
          return {...item,read:false}
        })
    })
    // 因为state就是映射Map数据,修改时自动生成一个新的数据结构,
    // 这里就直接使用set修改该messageList .把刚更新的newList传递上去
   
    return state.set("messageList",newList)
	// 当组件里的mapStatetToProps返回数据时,本来获取的数据结构不会改变
  default:
    return state
  }
}

吐槽
= = ! 当我发挥我的问百度能力的时候,发现大佬门上传的都是在List数据结构里添加一个新对象,这个问题半天没有解决,

总结
新学习immutable的大家可能比较会懵一下,但是当了解到这个东西能直接生成一个新的对象时,在纯函数里面还是很好用的,不用每次都要浅拷贝或者深拷贝,当数据层次比较深的时候immutable可能就是一个好的优化选择

希望可以帮到大家。如果上述代码有错误或者是理解错误希望大家可以帮忙提出。感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值