更新ImmutableJS Record的多个字段的推荐方法是什么?

时间:2016-05-25 07:49:09

标签: typescript immutability record immutable.js

我有ImmutableJS Record,我想更新多个字段,推荐的方式是什么?

我试过withMutations但由于某种原因,我得到的副本是空的,我不能改变它:

const UserRecord = Record({
  firstName: null,
  lastName: null, 
  address: {
    city: null, 
    zipCode: null
  }
});

export function createUserRecord(data) {
  return new UserRecord(fromJS(data));
}

let u = createUserRecord({
  firstName: 'John',
  lastName: 'Don', 
  address: {
    city: 'New York', 
    zipCode: 1111
  }
});

let newU = u.withMutations((uCopy) => {
  // uCopy is empty (with default values)
  uCopy.set('firstName', 'New FirstName');
  uCopy.set('lastName', 'New LastName');
  // uCopy is still empty (not mutated)
});

console.log(u.toJS()); // {firstName: "John", lastName: "Don", address: {city: null, zipCode: null}}
console.log(newU.toJS()); // {firstName: null, lastName: null, address: {city: null, zipCode: null}}

谢谢!

1 个答案:

答案 0 :(得分:1)

方法withMutations不会更改对象u。它改为返回一个变异的对象,所以你需要像这样调用它

let newU = u.withMutations((uCopy) => {
  // uCopy is empty (with default values)
  uCopy.set('firstName', 'New FirstName');
  uCopy.set('lastName', 'New LastName');
  // uCopy is still empty (not mutated)
});

https://facebook.github.io/immutable-js/

的文档中查看此示例
var list1 = Immutable.List.of(1,2,3);
var list2 = list1.withMutations(function (list) {
  list.push(4).push(5).push(6);
});
assert(list1.size === 3);
assert(list2.size === 6);