在redux删除操作中切片与过滤器

时间:2016-07-09 13:05:24

标签: javascript reactjs redux

Redux文档,我知道,我们永远不应该改变状态,这就是为什么我们应该使用concatslice方法,所以我最终使用了reducer(大多数操作)为简化而删除:

export default function blocks(state = [], action) {  
    switch (action.type) {
        case DELETE_BLOCK:
          var index = state.findIndex(e => e.id === action.blockId);
          return [...state.slice(0, index), ...state.slice(index + 1)];
        default:
          return state;
}

在我的情况下,我没有要删除的元素的索引,所以我可以使用filter吗?像这样:

export default function blocks(state = [], action) {  
    switch (action.type) {
        case DELETE_BLOCK:
          return state.filter(e => e.id !== action.blockId);
        default:
          return state;
}

2 个答案:

答案 0 :(得分:7)

if (event.type === 'deleted') { var filePathFromSrc = path.relative(path.resolve('src/img'), event.path); var destFilePath = path.resolve(imgDst, filePathFromSrc); del.sync(destFilePath); } 不会改变状态,它会返回一个新的filter,所以这里没有任何错误。

我们在处理Array数据时会尽量避免filter,因为它总是会返回一个新的引用,从而打破了引用相等性检查immutable。但是如果你没有使用这种参考,如果你认为状态没有改变就试图返回先前的状态引用(我认为你没有这样做,没关系),你不需要担心关于使用===

答案 1 :(得分:0)

由于reducer是一个普通的JavaScript函数,因此很容易为它编写测试。您只需给它stateBeforeaction,然后检查它是否返回预期的stateAfter。您可以在stateBefore上调用类似deep-freeze的内容,如果您不小心改变了状态,那么您的测试将会失败。 Getting Started with Redux视频系列展示了这种技术。