【发布时间】:2019-12-16 09:32:57
【问题描述】:
当我检查长度 (array.length) 时,我有一个数组返回未定义,只有页面被刷新。
如果我在 chrome 的新选项卡中打开本地环境,一切正常,并且我得到数组的长度。仅在刷新页面一次后,页面崩溃并且我收到以下错误: “TypeError:无法读取未定义的属性‘长度’”。
我正在为项目使用 React、React 的 Context API(我从上下文提供程序获取数组)和 Nextjs。我感觉这个问题与 SSR 有关,但我不完全确定。
这是与问题相关的相关代码。
上下文提供者
export function CartProvider(props) {
let initializeState;
if (typeof window !== 'undefined') {
initializeState = JSON.parse(sessionStorage.getItem('cart'));
if (initializeState === null) {
initializeState = [];
}
}
// Sets the cart
const [ cart, setCart ] = useState(initializeState);
return (
<CartContext.Provider
value={{ cart, setCart, checkCart, addItem, deleteItem, quantityIncrease, quantityDecrease }}
>
{props.children}
</CartContext.Provider>
);
}
这是使用 Context Provider 的代码
Cart.js
import React, { Fragment, useContext } from 'react';
import ShoppingCart from '../components/ShoppingCart';
import { CartContext } from '../contexts/CartContext';
const cart = () => {
const { cart } = useContext(CartContext);
return (
<Fragment>
{cart.length !== 0 ? (
<ShoppingCart />
) : (
<div>
<h1>Your cart is empty</h1>
</div>
)}
</Fragment>
);
};
export default cart;
非常感谢任何帮助!
【问题讨论】:
-
如果
.length返回undefined那么它不是一个数组。 -
我已经使用 Array.isArray(cart) 检查了数组,它返回数组。刷新页面时出现错误。
-
好的,那你的问题是什么?刷新页面后,它不是数组而是其他东西,因此它的
.length返回undefined。 -
当我简单的console.log(cart),不检查长度的时候,页面总是返回[],这是一个数组。无论我是否刷新页面,都会发生这种情况。
-
显示此
console.log(cart, typeof cart, Array.isArray(cart), cart.length)
标签: javascript reactjs next.js