Dva中model的reducers为什么无法更新state? 皇甫春莉 提问于 2026-02-18 11:56:22 阅读 18 框架 在Dva项目里写了model的reducers,按照文档应该能更新state,但实际修改后页面完全没反应。 比如这样写:updateName(state, { payload: { name }}) { state.name = name },但是控制台打印state.name还是原来的值。 已经确认action被正确触发了,也检查过connect的绑定没问题,但就是不更新,这是什么情况啊? 我来解答 赞 4 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 宇文诗谣 Lv1 我之前踩过这个坑,问题出在你对state的修改方式上。Dva的state是不可变的(immutable),你直接写 state.name = name 这种方式其实是直接修改了原来的state对象,这违背了不可变数据的原则,所以不会触发页面更新。 正确的方式是返回一个新的state对象,而不是直接修改原来的state。你可以用对象展开运算符来实现,比如这样: updateName(state, { payload: { name } }) { return { ...state, name }; } 这种方式会创建一个新的对象,把原来的state展开,然后覆盖需要修改的字段。页面就能正常响应state的变化了。 我记得刚用Dva的时候也犯过类似的错误,总想着直接改state省事,结果调试了半天才发现问题。另外提醒一下,如果你用的是比较老的JavaScript环境,可能不支持对象展开运算符,可以换成Object.assign来写: updateName(state, { payload: { name } }) { return Object.assign({}, state, { name }); } 效果是一样的,看你项目环境选择合适的方式就行。总之记住,永远不要直接修改state,而是返回一个新的对象。 回复 点赞 1 2026-02-18 12:00 加载更多 相关推荐
state.name = name这种方式其实是直接修改了原来的state对象,这违背了不可变数据的原则,所以不会触发页面更新。正确的方式是返回一个新的state对象,而不是直接修改原来的state。你可以用对象展开运算符来实现,比如这样:
这种方式会创建一个新的对象,把原来的state展开,然后覆盖需要修改的字段。页面就能正常响应state的变化了。
我记得刚用Dva的时候也犯过类似的错误,总想着直接改state省事,结果调试了半天才发现问题。另外提醒一下,如果你用的是比较老的JavaScript环境,可能不支持对象展开运算符,可以换成Object.assign来写:
效果是一样的,看你项目环境选择合适的方式就行。总之记住,永远不要直接修改state,而是返回一个新的对象。