【问题标题】:Immutable.js deleteIn not workingImmutable.js deleteIn 不起作用
【发布时间】:2016-10-04 07:59:53
【问题描述】:

我一直在尝试解决这个问题,但我可能没有掌握 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'
                })
              })
          }));
        });
      });
});

...女巫测试这个功能:

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

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

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

但它不起作用。我已经尝试了所有方法......更改线路以使其正常工作,但我没有删除第 3 项。

怎么了?有人帮我吗?

【问题讨论】:

    标签: javascript reactjs redux immutable.js


    【解决方案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 应该成为关键路径的一部分。
    • removingNumber,但是因为您是从 JS 对象创建 Map,所以它的键将是 String 的(the documentation 中也提到了这一点):

      请记住,在使用 JS 对象构造不可变映射时,JavaScript 对象属性始终是字符串

    因此,在将removing 传递给deleteIn 时,您需要将String 转换为String

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 1970-01-01
      • 2015-12-08
      • 2019-09-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      相关资源
      最近更新 更多