更改所有嵌套对象Immutable.js的值

时间:2018-01-11 20:06:32

标签: javascript reactjs react-redux immutable.js

reducer看起来像这样

import {ADD_TASK, EDIT_TASK, CHECK_TASK, CHECK_ALL_TASK} from '../constants';
import {OrderedMap, Record} from 'immutable';

const TaskRecord = Record({
    id: null,
    text: null,
    isChecked: false
});

const ReducerState = Record({
    entities: new OrderedMap({})
});

const defaultState = new ReducerState();

export default (tasksState = defaultState, action) => {
    const {type, payload, randomId} = action;

    switch (type) {
        case ADD_TASK:
            return tasksState.setIn(['entities', randomId], new TaskRecord({...payload.task, id: randomId}));
        case CHECK_ALL_TASK:
            return tasksState.map(entities => {
                return entities.map((task) => {
                    task.set('isChecked', true);
                });
            });
    };

    return tasksState;
};

如何在实体中改变所有isChecked在TaskRecord中?我写了CHECK_ALL_TASK,但它给出了一个错误(tasksState undefined)

2 个答案:

答案 0 :(得分:1)

如果要根据属性的当前属性设置新值,则.update是您要使用的值。 如果要对集合中的每个项目进行更改,.map就是您要使用的内容。 在您的情况下,您希望通过修改集合中的每个实体来为属性entities设置新值。 这意味着您要使用updatemap

function checkAllBoxes(taskState) {
  return taskState.update('entities', entities => 
    entities.map(entity =>
      entity.set('isChecked', true)));
}

const TaskRecord = Immutable.Record({
  id: null,
  text: null,
  isChecked: false
});

const ReducerState = Immutable.Record({
  entities: new Immutable.OrderedMap({})
});

const taskState = new ReducerState({
  entities: Immutable.OrderedMap({
    a: new TaskRecord(),
    b: new TaskRecord(),
    c: new TaskRecord()
  })
});

function checkAllBoxes(taskState) {
  return taskState.update('entities', entities =>
    entities.map(entity =>
      entity.set('isChecked', true)));
}

console.log(checkAllBoxes(taskState))
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.9/immutable.js"></script>

答案 1 :(得分:0)

写了这个函数,但它可以做成更简单的东西吗?

function checkAllCheckboxes(state) {
    let newState = state;
    for (let id of state.entities) {
        newState = newState.setIn(['entities', id[0], 'isChecked'], true);
    }
    return newState;
}