【问题标题】:Immutable.js insert an element through cursor manipulationImmutable.js 通过光标操作插入元素
【发布时间】:2015-07-25 21:06:39
【问题描述】:

我正在尝试通过向列表中添加和插入条目来操作不可变 (3.6.4) 游标:

var data = Immutable.fromJS({a: {b: [0, 1, 2]}});
var cursor = Cursor.from(data, ['a', 'b'], function(newData){
    data = newData;
});

cursor = cursor.push(3);
var newList = cursor.splice(1,0,11);
cursor.update(function(x){return newList;});

console.log(data.toJS().a.b); //Result [0, 11, 1, 2, 3]

为什么 cursor.splice 没有更新“数据”?

现在,使用 withMutation,splice 似乎不起作用。我已经在日志语句旁边添加了结果。

var data = Immutable.fromJS({a: {b: [0, 1, 2]}});
var cursor = Cursor.from(data, ['a', 'b'], function(newData){
    console.log("Setting Data");
    data = newData;
});

cursor.withMutations(function(c){
    console.log(c.toJS()); //[0, 1, 2]
    c.push(3).toJS();
    console.log(c.toJS()); //[0, 1, 2, 3]
    var newList =  c.splice(1,0,11);
    console.log(newList.toJS()); //[11]
    console.log(c.toJS());//[]
    c.update(function(x){return newList;});     
});

实现这一目标的正确方法是什么?

【问题讨论】:

标签: cursor immutable.js


【解决方案1】:

来自李拜伦github issue的回复:

splice() 的操作类似于map()filter() - 它不能在withMutations 中使用,也不能用于更新游标。

使用游标时在数组中插入的正确方法是引用引用元素:

// instead of 
parentCursor.get('mylist').splice(...);
// do:
parentCursor.update('mylist', list => list.splice(...));

同样的模式也适用于其他类型的地图/过滤器操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多