Redux reducer中array.filter参数仅包裹{}才生效的问题咨询
问题解析:Redux Reducer中Filter回调的参数问题
嘿,我刚看完你的代码,一下子就明白你遇到的困惑了!其实问题的核心很简单——你搞混了filter回调里的参数类型。
为什么直接用id参数不生效?
你的state(也就是defaultState.articles)是一个文章对象数组,不是单纯的id数组。当你写:
return state.filter(id => id !== action.id);
这里的id变量其实代表数组里的每一个完整的文章对象,而不是文章的id属性。你拿一个对象和action.id(数字/字符串类型)做比较,结果永远是false,所以过滤根本起不到作用,数组里的元素一个都不会被移除。
为什么用({id})就能正常工作?
这里用到了对象解构赋值的语法:
return state.filter(({id}) => id !== action.id);
它的作用是把每个文章对象里的id属性单独解构出来,作为回调函数的参数使用。这时候你拿的是文章的id属性(和action.id同类型)和action.id比较,逻辑就正确了,所以能顺利过滤掉对应id的文章。
另一种更直观的写法
如果你觉得解构有点抽象,也可以不用解构,直接访问对象的属性,效果是完全一样的:
return state.filter(article => article.id !== action.id);
这种写法把参数名改成article,明确表示它是一个文章对象,然后通过article.id获取id,新手更容易理解。
再结合你的代码验证一下
看你ADD case里的逻辑:return [...state, action.article];,你是把完整的文章对象添加到数组里的,所以数组里的每一项都是包含id属性的对象,这也进一步验证了上面的结论。
内容的提问来源于stack exchange,提问作者finepax007
相关产品推荐
相关产品推荐

