从Redux
文档,我知道,我们永远不应该改变状态,这就是为什么我们应该使用concat
和slice
方法,所以我最终使用了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;
}
答案 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函数,因此很容易为它编写测试。您只需给它stateBefore
和action
,然后检查它是否返回预期的stateAfter
。您可以在stateBefore
上调用类似deep-freeze的内容,如果您不小心改变了状态,那么您的测试将会失败。 Getting Started with Redux视频系列展示了这种技术。