如何使用Immutable.js

时间:2019-04-14 13:56:05

标签: javascript reactjs react-redux immutable.js

我想将新的键/值对添加到嵌套在另一个Map中的Map中。如果密钥已经存在,则应将其替换。

我认为mergeDeepIn()应该可以解决问题,但是出现“无效的keyPath”错误。

状态如下:

{
   "requests":{
      "1":{
         "title":"I have a question",
         "customerId":2,
         "messages":{
            "222":{
               "text":"Hello!",
               "senderId":1,
            },
         },
        ...
      },
      ...
   },
}

“请求”和“消息”是不可变的地图。

我尝试过:

const message = fromJS({
  "5": {
    text: "test",
  },
})
state.mergeDeepIn(['requests', 1, 'messages'], message)

该消息应添加到“消息”地图中。

1 个答案:

答案 0 :(得分:1)

不可移植性是数据结构的属性,它意味着:创建该数据结构后,它将永远不会再更改。在Map中添加值或替换Map意味着更改Map,这正是immutable-js试图防止的。

您可以做的是从已经存在的const {Map} = require('immutable'); m = Map({a:1}); Map({...m.toJSON(), b:2}) // Map { "a": 1, "b": 2 } Map({...m.toJSON(), a:2}) // Map { "a": 2 } m.set('a', 2) // Map { "a": 2 } , creates a new map same as line above 中创建一个新的

private let colorPickerKey = "ColorPickerKey"

var selectedColor: UIColor? {
    get {
        guard let colorData = UserDefaults.standard.object(forKey: colorPickerKey) as? Data,
            let color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor else { return nil }
        return color
    } set {
        guard let newValue = newValue else {
            UserDefaults.standard.removeObject(forKey: colorPickerKey)
            return
        }
        let colorData = NSKeyedArchiver.archivedData(withRootObject: newValue)
        UserDefaults.standard.set(colorData, forKey: colorPickerKey)
    }
}