【发布时间】:2019-11-09 02:43:59
【问题描述】:
我正在开发一个使用 react-redux 作为前端的项目。 我已经解决了一个问题,但我不知道为什么。 谁能给我个主意?
问题是, 我在下面初始化我的“guidelineManagement”状态(它在 guidelineManagement.js 中):
const init = {
page: 'GuidelineTableComponent',
status: null,
msg: [],
error: null,
guidelineData: [],
data: []
}
我还有另一个 reducer 处理登录状态,
它在'login.js'中。
我使用combineReducers 来组合两个reducer。
现在,在每个页面加载时,我都会执行一个操作“fetchLoginStatus”,
它从服务器加载登录状态,并在login.js 中加载reducer 句柄,
所以,在guidelineManagement reducer 中,它将执行默认情况。
我的表演是这样的
default:
console.log({...state})
return {...state}
但是当我在“fetchLoginStatus”完成后检查记录器时, 状态变为以下:
fetchLoginStatus之前:
guidelineManagement:
data: Array []
error: null
guidelineData: Array []
msg: Array []
page: "GuidelineTableComponent"
status: null
<prototype>: Object { … }
但是在fetchLoginStatus完成之后:
guidelineManagement:
data: Array []
error: null
guidelineData: Array(3) [ {…}, {…}, {…} ]
msg: undefined
page: "GuidelineTableComponent"
status: "success"
<prototype>: Object { … }
guidelineManagement.msg 变得未定义。
如果我将默认大小写更改为以下,它会正常工作
default:
console.log({...state})
return state
fetchLoginStatus 动作后的结果变成:
guidelineManagement:
data: Array []
error: null
guidelineData: Array(3) [ {…}, {…}, {…} ]
msg: Array []
page: "GuidelineInsertComponent"
status: "success"
<prototype>: Object { … }
结果是对的,msg 保持为空数组。
顺便说一句,console.log 在默认情况下表示在用例块中,
msg为空数组,表示返回前msg正确。
顺便说一句,在登录状态下,也有一个 msg 数组, 在我的设计中,state.msg 用于接收服务器响应。
我注意到只有味精会导致这个问题。 state.guidelineManagement.data 和 state.guidelineManagement.guidelineData 两者也是数组,并且在动作完成之前它们保持相同的状态。
知道是什么导致了这个问题吗?
【问题讨论】:
-
顺便说一下,
checkLoginStatus动作之前和之后的guidelineData 更新是因为我调用了其他动作来进行ajax 调用。并且在 ajax 完成后,reducer 处理 AJAX_COMPLETE 操作不会影响 msg -
我使用thunkmiddleware来包装ajax调用
-
您不应该在默认情况下使用
return {...state},即使没有更改,这也会不必要地使许多组件重新渲染。返回未修改的状态对象。请在相关的 reducer 操作中发布您正在执行的操作,并从您的代码 sn-ps 中删除多余的行以使其更易于阅读。 -
@Dominic 好的,谢谢,当我尝试解决这个错误时,我只是注意到这一点不同......
标签: javascript node.js reactjs react-redux