新手。
我有一个动作,通过Fetch“GET”从ASP.NET Core API检索数据。它派遣到减速机。调用reducer,此时,当对象进入时,状态不会更新。所以行动确实提供了有效载荷。减速器收到了有效载荷,但他没有更新状态。为什么呢?
首先,我想知道我是否必须适应它们是对象阵列的事实。
viewModel中有两个数组对象和一个字符串值。
此viewModel的结构如下:
AddressLocationDropdownViewModel =一个int Id和四个字符串值。
StateViewModel =一个int Id和两个字符串值。
CompanyStateShortName =字符串。
一旦检索到数据,我就可以在Chrome上的F12选项中查看Redux工具。状态已更改,操作显示有效负载,但有效负载未更新状态,即使已收到状态。
以下是动作中每个列表的详细分类,并显示在redux工具的操作选项卡中。
显示动作有效负载的两个图片以及有效负载对象数组的细分。
以下是环绕三个项目的初始状态。
在它完成并完成减速器后,这就是完成状态,那些物品现在显然已经丢失了。
然而上述行动表明它收到了数据。
以下是操作的代码第二次获取仅在收到JWT后发生,因为它通过调用保存到本地存储:“saveJwt(data)”
export const requestLoginToken = (username, password) =>
(dispatch, getState) => {
dispatch({ type: REQUEST_LOGIN_TOKEN, payload: username })
const payload = {
userName: username,
password: password,
}
const task = fetch('/api/jwt', {
method: 'POST',
body: JSON.stringify(payload),
headers: {
'Content-Type': 'application/json;charset=UTF-8'
},
})
.then(handleErrors)
.then(response => response.json())
.then(data => {
dispatch({ type: RECEIVE_LOGIN_TOKEN, payload: data })
saveJwt(data)
//selectData
dispatch({ type: REQUEST_SELECT_DATA })
const token = getJwt()
const headers = new Headers({
'Authorization': `Bearer ${token}`
})
const retrieveSelectData = fetch('/api/SelectData/SelectData', {
method: 'GET',
headers: {
'Content-Type': 'application/json;charset=UTF-8'
},
})
.then(handleErrors)
.then(response => response.json())
.then(selectData => {
dispatch({ type: RECEIVE_SELECT_DATA, payload: selectData })
})
})
.catch(error => {
clearJwt()
dispatch({ type: ERROR_LOGIN_TOKEN, payload: error.message })
})
addTask(task)
return task
}
以下是reducer的代码:
// ******************* reducer
const initialState = {
isLoading: false,
isAuthorised: false,
username: null,
jwt: null,
SuburbPostcodeDropDownList: null,
StateDropDownList: null,
CompanyStateShortName: null,
error: null,
}
export default (state = initialState, action) => {
switch (action.type) {
case REQUEST_LOGIN_TOKEN:
return {
...state,
isLoading: true,
isAuthorised: false,
username: action.payload,
jwt: null,
error: null,
}
case RECEIVE_LOGIN_TOKEN:
return {
...state,
isLoading: false,
isAuthorised: true,
jwt: action.payload,
error: null,
}
case ERROR_LOGIN_TOKEN:
return {
...state,
isLoading: false,
isAuthorised: false,
username: null,
jwt: null,
error: action.payload,
}
case REQUEST_SELECT_DATA:
return {
...state,
isLoading: true,
isAuthorised: false,
SuburbPostcodeDropDownList: null,
StateDropDownList: null,
CompanyStateShortName: null,
error: null,
}
case RECEIVE_SELECT_DATA:
return {
...state,
isLoading: false,
isAuthorised: true,
SuburbPostcodeDropDownList: action.payload.SuburbPostcodeDropDownList,
StateDropDownList: action.payload.StateDropDownList,
CompanyStateShortName: action.payload.CompanyStateShortName,
error: null,
}
这是因为如果有列表数组等,状态需要更多设置。
如果是这样,你将如何构造reducer来处理数组对象?
答案 0 :(得分:2)
您的问题很简单 - 在action.payload
情况下,RECEIVE_SELECT_DATA
上的字段未在您的reducer中正确填充。它们以大写字母开头,当它们应以小写字母开头时。
这意味着它们被读作undefined
,这意味着当您使用对象扩展语法来构建新的状态对象时,它们根本不会被添加到新对象中,并且它们将被添加到新对象中。为什么他们从州里消失。
小写所有这些字段名称的第一个字母,它应该有效。