Redux reducer更新state时属性依赖同次变更参数的解决方法
问题根因
你踩的是JS对象字面量的作用域坑:对象字面量里逐个定义属性的时候,刚写的新属性不会自动加到当前作用域里。你算finishDate时拿的startDate,从头到尾都是reducer传入的旧state里的值,和你同一行写的新startDate属性没有关联,当然永远拿到旧值。
最优解法
别在返回的对象字面量里套娃算依赖值,提前把新值算好存成变量,再拼返回对象就行,写法简单还没歧义,完全符合reducer纯函数要求:
// 先把新的startDate算出来存好 const updatedStart = new Date(newStartDate); // 基于刚算好的新startDate算finishDate,记得new新实例,别修改原对象 const updatedFinish = new Date(updatedStart).setHours(/* 你的小时配置逻辑 */); return { ...state, startDate: updatedStart, finishDate: updatedFinish };
几个别踩的坑
- 别想着在对象里用
this.startDate拿新值,普通对象字面量的this指的是外层作用域,严格模式下直接是undefined,根本拿不到当前对象的属性。 - 别拆成两次dispatch/两次返回新state分别更新startDate和finishDate,这么写会生成中间无效状态,平白多触发组件重渲染,还破坏了状态更新的原子性。
- 别直接改旧state上的Date对象:Date是引用类型,你要是直接拿旧state里的startDate调
setHours改值,等于直接篡改旧状态,违反纯函数规则,后续出现渲染bug很难排查。
内容的提问来源于stack exchange,提问作者Vadim Fisher
相关产品推荐
相关产品推荐

