gpt4 book ai didi

javascript - 尝试访问存储变量时,React Redux "Cannot read property ' status' of undefined"错误

转载 作者:行者123 更新时间:2023-12-04 10:04:43 34 4
gpt4 key购买 nike

我正在开发一个应用程序来自学 React 和 Redux,在尝试访问已添加到商店的变量时遇到了问题。

我能够将数据添加到存储对象并通过使用 console.log 验证数据是否存在,但是当我尝试深入查看我想要访问的实际变量时,我收到一个错误:“TypeError:无法读取属性”状态'未定义”。

查看状态时,我可以看到状态在那里:
{"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;


主页.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;

最佳答案

由于您的效果是异步运行的,因此您的数据在初始渲染时将不可用。这意味着尝试访问不存在的数组元素上的 Prop 将导致您的应用程序崩溃。

您的初始日志语句似乎有效的事实很可能是因为它是 undefined在初始渲染上,然后在第二次渲染上的预期值。另一方面,您的第二个 console.log语句立即失败,您永远不会将其用于后续渲染。

为了防止这个问题发生,一个常见的模式是使用短路评估。例如:

const HomePage = (props) => {
// (initial component code here)

// Only log if the array element exists
storeStatusData[0] && console.log("storeStatusData", JSON.stringify(storeStatusData[0].status))


return (
<div>
<main>
<h1>Test App</h1>

</main>
</div>
);
};

关于javascript - 尝试访问存储变量时,React Redux "Cannot read property ' status' of undefined"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61646652/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com