Immutable.js deleteIn 不起作用

IT技术 javascript reactjs redux immutable.js
2021-05-12 15:34:35

我一直在尝试解决这个问题,但可能有一些 Immutable.js 的东西我没有发现。我希望有人能帮助我理解。

我有一个这样的测试:

import {List, Map} from 'immutable';
import {expect} from 'chai';

import {setInitial,
        addAtListOfMembers,
        removeAtListOfMembers
        } from '../src/core';


      describe('removeAtListOfMembers', () => {

        it('remove a member to the list of members', () => {
          const state = Map({
            removing: 3,
            infos : Map(),
            members: Map({
                1:Map({
                    userName:'René',
                    date:'12/02/2016'
                }),
                2:Map({
                    userName:'Jean',
                    date:'10/03/2016'
                }),
                3:Map({
                    userName:'Elene',
                    date:'05/01/2016'
                })
              })
          });
          const nextState = removeAtListOfMembers(state);

          expect(nextState).to.equal(Map({
            infos : Map(),
            members: Map({
                1:Map({
                    userName:'René',
                    date:'12/02/2016'
                }),
                2:Map({
                    userName:'Jean',
                    date:'10/03/2016'
                })
              })
          }));
        });
      });
});

...witch 测试此功能:

export function removeAtListOfMembers(state) {
  const members = state.get('members');

  const removing = state.get('removing');

  return state
        .deleteIn(['members'], removing)
        .remove('removing');
}

但它不起作用。我已经尝试了一切......更改行以使其工作,但我没有删除第 3 项。

怎么了?有人来帮助我吗?

1个回答

这应该有效:

export function removeAtListOfMembers(state) {
  const members = state.get('members');

  const removing = state.get('removing');

  return state
        .deleteIn(['members', String(removing) ])
        .remove('removing');
}

您的代码有两个问题:

  • deleteIn接受一个keyPath参数,在您的情况下是[ 'members' ]. 第二个参数 ( removing) 被忽略,所以结果是整个members地图都被删除了;相反,removing应该成为关键路径的一部分。
  • removing是 a Number,但是因为您是Map从 JS 对象创建 a ,所以它的键将是String's (文档中也提到了一点):

    请记住,当使用 JS 对象构建 Immutable Maps 时,JavaScript 对象属性始终是字符串

因此,您需要在将removingString传递给deleteIn.