【发布时间】:2020-05-07 10:25:50
【问题描述】:
我正在开发一个应用程序来自学 React 和 Redux,但在尝试访问已添加到商店的变量时遇到了问题。
我可以将数据添加到存储对象并使用 console.log 验证数据是否存在,但是当我尝试深入了解我想要访问的实际变量时,我收到一个错误:“TypeError: Cannot读取未定义的属性“状态”。
查看状态时,我可以看到状态存在: {"customerInfo":[],"loginInfo":[],"storeStatus":[{"status":false}]}
但随后尝试访问 state.storeStatus[0] 中的任何内容(例如:state.storeStatus[0].status)返回未定义的错误。
如果我想将它分配给一个新变量以在某些条件渲染中使用,我应该尝试以不同的方式访问该变量吗?
storeStatusReducers.js
import deepFreeze from 'deep-freeze'
const state = [];
const storeStatusReducer = (state = true, action) => {
switch(action.type) {
case 'STORE_STATUS_UPDATE':
state = [];
return [...state, action.data]
default:
return state
}
}
export const updateStoreStatusAction = (status) => {
return {
type: 'STORE_STATUS_UPDATE',
data: {
status
}
}
}
deepFreeze(state)
export default storeStatusReducer;
home.js
import React, { useState, useEffect } from "react";
import axios from "axios";
import { updateStoreStatusAction } from '../reducers/storeStatusReducers'
import { useSelector, useDispatch } from 'react-redux'
const storeInfo = {
storeId : "1337",
storeStatus: true
}
const HomePage = (props) => {
const dispatch = useDispatch()
const storeStatusData = useSelector(state => state.storeStatus);
let payload = {
storeId: storeInfo.storeId,
};
useEffect(() => {
axios({
url: "/api/get-test-data/" + storeInfo.storeId,
method: "GET",
data: payload,
})
.then((data) => {
console.log("data.data.storeStatusPayload", JSON.stringify(data.data.storeStatusPayload))
updateStoreStatus(data.data.storeStatusPayload);
})
.catch((error) => {
console.log("changeStoreStatus: Internal server error");
});
}, []);
const updateStoreStatus = (updatedStoreStatus) => {
dispatch(updateStoreStatusAction(updatedStoreStatus));
};
//This works and produces: {"status":false}
console.log("storeStatusData", JSON.stringify(storeStatusData[0]))
// This does not when trying to access status
console.log("storeStatusData", JSON.stringify(storeStatusData[0].status))
return (
<div>
<main>
<h1>Test App</h1>
</main>
</div>
);
};
export default HomePage;
更新: 现在正在工作。谢谢!
更新了 home.js
import React, { useState, useEffect } from "react";
import axios from "axios";
import { updateStoreStatusAction } from '../reducers/storeStatusReducers'
import { useSelector, useDispatch } from 'react-redux'
const storeInfo = {
storeId : "1337",
storeStatus: true
}
const HomePage = (props) => {
const dispatch = useDispatch()
const storeStatusData = useSelector(state => state.storeStatus);
let payload = {
storeId: storeInfo.storeId,
};
useEffect(() => {
axios({
url: "/api/get-test-data/" + storeInfo.storeId,
method: "GET",
data: payload,
})
.then((data) => {
console.log("data.data.storeStatusPayload", JSON.stringify(data.data.storeStatusPayload))
updateStoreStatus(data.data.storeStatusPayload);
})
.catch((error) => {
console.log("changeStoreStatus: Internal server error");
});
}, []);
const updateStoreStatus = (updatedStoreStatus) => {
dispatch(updateStoreStatusAction(updatedStoreStatus));
};
//This works and produces: {"status":false}
console.log("storeStatusData", JSON.stringify(storeStatusData[0]))
// This does not when trying to access status
console.log("storeStatusData", JSON.stringify(storeStatusData[0].status))
const renderLoadingBar = () => {
if (storeStatusData[0] ) {
return (
<div>
loaded
</div>
);
} else {
return (
// table container
<div>
loading
</div>
);
}
};
return (
<div>
<main>
<h1>Test App</h1>
<div>{renderLoadingBar()}</div>
</main>
</div>
);
};
export default HomePage;
【问题讨论】:
-
初始状态是一个空数组,所以
storeStatusData[0]是undefined。它看起来与storeStatusData[0]一起工作的原因是控制台稍后在您在控制台中检查它时评估该值(chrome 会这样做),或者它记录两次,一次作为undefined,一次作为对象。 -
而且由于您使用的是
JSON.stringify,我倾向于使用 2 条日志。
标签: javascript reactjs react-redux