Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 刷新页面时,Array.length返回未定义_Javascript_Reactjs_Next.js - Fatal编程技术网

Javascript 刷新页面时,Array.length返回未定义

Javascript 刷新页面时,Array.length返回未定义,javascript,reactjs,next.js,Javascript,Reactjs,Next.js,我有一个数组,当我检查长度(array.length)时返回undefined,只有页面被刷新 如果我在chrome中的一个新选项卡中打开本地环境,一切都会正常工作,并获得阵列的长度。只有在刷新页面一次后,页面才会崩溃,并且我得到以下错误: TypeError:无法读取未定义的属性'length' 我正在为项目使用React、React的上下文API(我从上下文提供程序获取数组)和Nextjs。我觉得这个问题与SSR有关,但我不能完全确定 以下是与问题相关的代码 上下文提供程序 export f

我有一个数组,当我检查长度(array.length)时返回undefined,只有页面被刷新

如果我在chrome中的一个新选项卡中打开本地环境,一切都会正常工作,并获得阵列的长度。只有在刷新页面一次后,页面才会崩溃,并且我得到以下错误: TypeError:无法读取未定义的属性'length'

我正在为项目使用React、React的上下文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>
    );
}
导出函数提供程序(道具){
让房地产草签;
如果(窗口类型!==“未定义”){
initializeState=JSON.parse(sessionStorage.getItem('cart');
if(initializeState===null){
InitializeEstate=[];
}
}
//设置购物车
const[cart,setCart]=useState(initializeState);
返回(
{props.children}
);
}
这就是使用上下文提供程序的代码

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;
import React,{Fragment,useContext}来自'React';
从“../components/ShoppingCart”导入ShoppingCart;
从“../contents/CartContext”导入{CartContext};
常量车=()=>{
const{cart}=useContext(CartContext);
返回(
{cart.length!==0(
) : (
你的车是空的
)}
);
};
导出默认购物车;

非常感谢您的帮助

这是一个异步问题。该变量在评估时未初始化,因此您可以获得:

“TypeError:无法读取未定义的属性'length'”

使用提供者时,请尝试应用保护模式,如下所示:

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 && (cart.length !== 0)) ? (
                <ShoppingCart />
            ) : (
                <div>
                    <h1>Your cart is empty</h1>
                </div>
            )}
        </Fragment>
    );
};

export default cart;
翻译为:

当符号“购物车”计算为一个值时

然后返回表达式“cart.length!==0”的结果

否则返回false


这样,您就可以在运行时“保护”不安全的代码。

这是一个异步问题。该变量在评估时未初始化,因此您可以获得:

“TypeError:无法读取未定义的属性'length'”

使用提供者时,请尝试应用保护模式,如下所示:

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 && (cart.length !== 0)) ? (
                <ShoppingCart />
            ) : (
                <div>
                    <h1>Your cart is empty</h1>
                </div>
            )}
        </Fragment>
    );
};

export default cart;
翻译为:

当符号“购物车”计算为一个值时

然后返回表达式“cart.length!==0”的结果

否则返回false


这样,您可以在运行时“保护”不安全的代码。

我认为您的错误与SSR有关。
如果使用SSR运行代码,initializeState将接收未定义的。
但是initializeState应该是您期望的数组。
因此,我建议您更改代码:

//更改
让房地产草签;
如果(窗口类型!==“未定义”){
initializeState=JSON.parse(sessionStorage.getItem('cart');
if(initializeState===null){
InitializeEstate=[];
}
}
//到
让initializeState=[];
if(typeof window!='undefined'&&sessionStorage.getItem('cart')){
initializeState=JSON.parse(sessionStorage.getItem('cart');

}
我认为您的错误与SSR有关。
如果使用SSR运行代码,initializeState将接收未定义的。
但是initializeState应该是您期望的数组。
因此,我建议您更改代码:

//更改
让房地产草签;
如果(窗口类型!==“未定义”){
initializeState=JSON.parse(sessionStorage.getItem('cart');
if(initializeState===null){
InitializeEstate=[];
}
}
//到
让initializeState=[];
if(typeof window!='undefined'&&sessionStorage.getItem('cart')){
initializeState=JSON.parse(sessionStorage.getItem('cart');

}
如果
.length
返回
未定义
则它不是数组。我已使用array.isArray(cart)检查了数组,它返回数组。当页面刷新时,我得到错误。好的,那么你的问题是什么?刷新页面后,它不是一个数组,而是另一个数组,因此它的
.length
返回
未定义的
。无论我是否刷新页面,都会发生这种情况。显示此
console.log(cart,typeof cart,Array.isArray(cart,cart.length)
。当页面刷新时,我得到错误。好的,那么你的问题是什么?刷新页面后,它不是一个数组,而是另一个数组,因此它的
.length
返回
未定义的
。无论我是否刷新页面,都会发生这种情况。显示此
console.log(cart,typeof cart,Array.isArray(cart,cart.length)
感谢您的回复,但是,这似乎没有起到作用。我仍然得到TypeError:当我运行该代码时,无法读取undefined的属性“length”。@RogyBear这很奇怪!看看这里:谢谢你的回复,但是,这似乎没有起作用。我仍然得到TypeError:当我运行该代码时,无法读取undefined的属性“length”。@RogyBear这很奇怪!请看这里: