Подтвердить что ты не робот

Как установить несколько полей одновременно в записи Immutable.js?

Глядя на этот, я думаю, что Immutable. Запись - это структура данных для представления "неизменяемых объектов javascript", но я хочу обновить сразу несколько полей, не создавая при этом каждый раз каждый набор вызовов.

Я хочу сделать что-то вроде этого

class LoginContext extends Immutable.Record(
{ logged : false, loading: false, error: false, user: null}){
}

var loginContext = new LoginContext()

var anotherContext = loginContext.set({'logged':'true', 'error':'false'})

I читать, что вы не можете передать объект в Record.set() для API согласованность:

Согласованность с другими применениями набора как в этой библиотеке и в ES6. Map и Set set не могут принять объект, потому что их ключи могут быть любыми, а не только строками. Записи должны иметь строки, но поддерживая совместимость API, важно.

И я знаю, что могу использовать:

var anotherContext = loginContext.withMutations(function (record) {  
  record.set('logged','true').set('error','true'); 
});

Есть другой способ, или я неправильно использую запись?

4b9b3361

Ответ 1

Лично я предпочитаю синтаксис слияния, он чувствует себя более естественным:

const newContent = oldContext.merge({
    "logged": true, 
    "error": false
});

Если вы делаете что-то очень сложное, возможно, переходная версия будет лучше, но я просто не могу себе представить, где.

Это также означает, что вы можете использовать mergeDeep при необходимости.

Ответ 2

Чтобы ответить на ваш оригинальный вопрос, мы будем использовать .withMutations()

Здесь выдержка из документов:

Применение мутации для создания нового неизменяемого объекта приводит к некоторым накладным расходам, что может привести к незначительному штрафу за производительность. Если вам нужно применить серию мутаций локально перед возвратом, Immutable дает вам возможность создать временную изменяемую (временную) копию коллекции и применять партию мутаций с помощью withMutations. Фактически, это именно то, как Immutable применяет сложные мутации.

Итак, вы можете написать что-то по строкам:

loginContext.withMutations((ctx) => {
    ctx.set('logged', true).set('error', false)
});

Кроме того, я думал, что Records также можно использовать с обычной нотной меткой js.

Удачи!

Ответ 3

Почему бы вам просто не сгруппировать несколько наборов? Например:

ImmutableObj.set('key', 'value')
.set('key2', 'value2')
.set('key3', 'value3'); 

Ответ 4

Вы должны сделать несколько вещей по-другому. Во-первых, не распространяйте Immutable.Record, но используйте конструктор:

var LoginContext = Immutable.Record({
  logged:false,
  loading:false,
  user: null  
}, 'LoginContext');

Возвращает класс, который вы можете создать с помощью объекта:

var anotherContext = new LoginContext({logged:true, error:false});