Как установить несколько полей одновременно в записи 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');
});
Есть другой способ, или я неправильно использую запись?
Ответы
Ответ 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});