Dva中更新了state,为什么组件没重新渲染?

Air-可歆 阅读 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.利君
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