Dva中model的reducers为什么无法更新state?

皇甫春莉 阅读 18

在Dva项目里写了model的reducers,按照文档应该能更新state,但实际修改后页面完全没反应。

比如这样写:updateName(state, { payload: { name }}) { state.name = name },但是控制台打印state.name还是原来的值。

已经确认action被正确触发了,也检查过connect的绑定没问题,但就是不更新,这是什么情况啊?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
宇文诗谣
我之前踩过这个坑,问题出在你对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