2016-01-20 5 views
2

Это является примером того, что мое состояние выглядит следующим образом:Добавить элемент в список, который находится внутри карты (ImmutableJS)

state = { 
    messages: [ 
     {name: 'Bruce', content: 'Hello'}, 
     {name: 'Clark', content: 'World'} 
    ] 
    } 

Я пишу редуктор, который будет принимать меры ADD_MESSAGE и добавить сообщение в список сообщений. Я хотел бы принять во внимание тот случай, когда ключ «сообщения» не определен. Я только начинаю использовать ImmutableJS.

Это, как я написал свою функцию:

// This is really bad 
const addMessage = (state, message) => { 
    let mutableState = state.toJS(); 
    if(mutableState.messages){ 
     mutableState.messages.push(message); 
    }else{ 
     mutableState = {messages: [message]} 
    } 

    return fromJS(mutableState); 
} 

Я уверен, что есть лучший способ сделать это. Он должен работать независимо от того, является ли мой аргумент состояния неизменным или нет. Есть идеи? Спасибо!

ответ

4

Это возможная реализация:

const addMessage = (state, message) => 
    state.update('messages', Immutable.List(), 
     msgs => msgs.push(Immutable.Map(message))); 

2-й аргумент передается update значение по умолчанию, если ключ не существует, а третий аргумент укупорочное принять текущее значение ключа (или значение по умолчанию) и выполнить требуемое обновление. Код также преобразует сообщение в Immutable.Map, но вы можете использовать тип Immutable.Record.

Для получения дополнительной информации о update. updateIn также очень полезен для обновления состояния магазина, а также set, merge, setIn и mergeIn.

+0

Большое вам спасибо! Immutable.Record - это именно то, что я искал, используя карту, казалось неправильной! – Statyx

 Смежные вопросы

  • Нет связанных вопросов^_^