Dva中更新了state,为什么组件没重新渲染? Air-可歆 提问于 2026-02-05 14:01:27 阅读 30 框架 在Dva项目中,我通过model的effects异步请求更新了state里的user数据,但页面没重新渲染。控制台打印发现state确实更新了,但组件没有变化,这是为什么? 尝试过检查connect是否正确引入,组件用的是connect(({ user }) => ({ user }))(UserPage)的形式,也确认过model的namespace是user。但问题依旧。 难道是effects返回的方式有问题?或者需要手动触发更新?完全没头绪了,求大佬指点! 我来解答 赞 5 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 红凤 Lv1 state更新后组件没重新渲染,大概率是返回新state的方式不对。effects里记得用yield put({ type: 'save', payload: { user: newUser } })触发reducer更新,而不是直接返回。如果直接返回数据但没走reducer,connect拿不到变化自然不刷新。检查下model里reducers有没有正确处理save方法,搞定。 回复 点赞 4 2026-02-06 17:51 Mc.利君 Lv1 问题在于你可能没有正确返回新的state。在Dva中,更新state必须返回新的对象,不能直接修改原对象。 你的effects里应该是这样写的: updateUser({ payload }, { put, call }) { const newUser = yield call(fetchUser, payload); yield put({ type: 'save', payload: { user: newUser, }, }); } 而不是直接修改原来的user对象: updateUser({ payload }, { put, call }) { yield call(updateUser, payload); yield put({ type: 'save', payload: { user: { ...this.state.user, ...payload }, // 错误写法 }, }); } 回复 点赞 11 2026-02-05 14:02 加载更多 相关推荐
yield put({ type: 'save', payload: { user: newUser } })触发reducer更新,而不是直接返回。如果直接返回数据但没走reducer,connect拿不到变化自然不刷新。检查下model里reducers有没有正确处理save方法,搞定。你的effects里应该是这样写的:
而不是直接修改原来的user对象: