React Redux中reducer的CREATE分支[...posts, action.payload]含义
结合Java开发背景拆解CREATE分支逻辑
针对你提出的几个疑问,逐点说明:
- 三个点的语法本质
这是JS的数组展开运算符(Spread Operator),作用是把数组中存储的所有元素,逐个拆解为独立的平铺项。
你可以用Java的逻辑类比理解:如果posts是一个存储了所有帖子的List<Post>,展开运算符就相当于把这个List里从第一个元素到最后一个元素全部拆开逐个取出,而不是把整个List的引用直接传入新的结构中。
举个具象的例子:如果posts的值是[{_id:1, title:"aaa"}, {_id:2, title:"bbb"}],执行...posts后就会拆解成两个独立的对象值:{_id:1, title:"aaa"}、{_id:2, title:"bbb"}。 - 方括号的作用
方括号是JS的数组字面量创建语法,相当于Java中new ArrayList<>()的作用:声明创建一个全新的空数组,把前面拆解出来的旧帖子元素、以及后面的新帖子action.payload,全部装入这个新数组中。 - reducer返回值的作用
Redux会全局缓存每次reducer返回的结果,它判断状态有没有变化的逻辑非常简单:只对比新旧状态的内存引用是不是同一个,不会深度遍历对比对象内部的属性值。只要检测到返回值和上一次缓存的状态内存引用不同,就会把这个返回值作为该状态的最新值,同时通知所有订阅了这个状态的React组件触发重新渲染。
这里要明确Redux的核心约束:状态必须是不可变的——绝对不能直接修改原来的旧状态(比如直接对posts数组执行push、splice这类原地修改的方法)。因为原地修改不会改变数组的内存引用,Redux会认为状态没有更新,不会触发界面刷新,这也是新手写Redux最常踩的坑。 - 这段CREATE分支的实际执行逻辑
基于原有的旧帖子数组,生成一个内容和旧数组完全一致、但内存引用全新的数组,再把新建完成的帖子对象(即action.payload)追加到新数组的末尾,最后把这个新数组返回给Redux作为最新的帖子列表状态。
对应的等价Java代码逻辑是:// 不直接修改原有的旧posts列表 List<Post> newPosts = new ArrayList<>(oldPosts); // 把旧列表所有元素拷贝到新列表 newPosts.add(newPost); // 把新建的帖子追加到新列表末尾 return newPosts; // 返回新列表作为最新状态
内容的提问来源于stack exchange,提问作者Tips and Tricks Of Chess
相关产品推荐
相关产品推荐

