Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.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 无法读取属性';地图';未定义的错误。反应类型脚本_Javascript_Reactjs_Typescript - Fatal编程技术网

Javascript 无法读取属性';地图';未定义的错误。反应类型脚本

Javascript 无法读取属性';地图';未定义的错误。反应类型脚本,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,我这里有这个密码。我一直收到一个错误: TypeError:无法读取未定义的属性“map” 以下是一些事实: 我从前端javascript文件获取数据。所以不应该有任何异步问题 singleCategory.title始终正确显示 只有在刷新页面时才会发生错误。如果我注释掉地图代码并添加代码。这样React就可以在不刷新的情况下注入它。它起作用了。我只有在刷新页面或尝试导航到页面时才会出错 为什么singleCategory.title显示正确,但“使用地图”未定义?此外,映射仅在刷新时未定义。

我这里有这个密码。我一直收到一个错误:

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

以下是一些事实:

  • 我从前端javascript文件获取数据。所以不应该有任何异步问题
  • singleCategory.title
    始终正确显示
  • 只有在刷新页面时才会发生错误。如果我注释掉地图代码并添加代码。这样React就可以在不刷新的情况下注入它。它起作用了。我只有在刷新页面或尝试导航到页面时才会出错
  • 为什么
    singleCategory.title
    显示正确,但“使用地图”未定义?此外,映射仅在刷新时未定义。如果代码被注入,它就会正常工作

    const CoursesCategories: React.FC = () => {
        const [singleCategory, setSingleCategory] = useState<CategoriesInterface>([] as any);
    
        useEffect(() => {
            const fullUrl = window.location.href;
            const segments = new URL(fullUrl).pathname.split('/');
            const id = segments.pop() || segments.pop();
    
            for (let category of Categories ) {
                if (category.url === id) {
                    setSingleCategory(category);
                    console.log(singleCategory)
                }
            }
        }, [singleCategory]);
    
    
        return (
            <div>
                {
                    singleCategory.courses !== [] ? (
                        <div>
                            <CategoryTitle title={singleCategory.title} />
    
                            <div className={wrapper.headerWrapper}>
                                {
                                    singleCategory.courses.map((course: CoursesInterface) => (
                                        <h2 key={course.id}>{course.title}</h2>
                                        )
                                    )
                                }
                            </div>
                        </div>
                    ) : ''
                }
    
            </div>
        )
    }
    
    const课程类别:React.FC=()=>{
    const[singleCategory,setSingleCategory]=useState([]如有);
    useffect(()=>{
    const fullUrl=window.location.href;
    const segments=新URL(fullUrl).pathname.split('/');
    const id=segments.pop()| | segments.pop();
    for(让类别中的类别){
    如果(category.url==id){
    设置SingleCategory(类别);
    console.log(singleCategory)
    }
    }
    },[单一类别];
    返回(
    {
    singleCategory.courses!=[](
    {
    singleCategory.courses.map((课程:课程界面)=>(
    {课程名称}
    )
    )
    }
    ) : ''
    }
    )
    }
    
    编辑1。如果我这样写的话,我会得到

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

    {singleCategory.courses.length>0&&singleCategory.courses.map((课程:课程界面)=>(
    {课程名称}
    )
    )}
    
    由于您使用的是typescript,因此可以使用:

    {singleCategory.courses?.length>0
    &&singleCategory.courses?.map((课程:课程界面)=>(
    {课程名称}
    )
    )}
    

    因为在第一次渲染时,该属性不可用。

    useffect
    在第一次渲染后运行,因此未在该渲染上定义singleCategory。通常有条件地渲染贴图,并在第二次渲染时使用获取的数据进行渲染。将条件渲染添加到.map()
    {singleCategory.courses.length>0&&singleCategory.courses.map(…)}
    { singleCategory.courses.length > 0 && singleCategory.courses.map((course: CoursesInterface) => (
                                        <h2 key={course.id}>{course.title}</h2>
                                    )
                                )}
    
    { singleCategory.courses?.length > 0
        && singleCategory.courses?.map((course: CoursesInterface) => (
                                        <h2 key={course.id}>{course.title}</h2>
                                    )
      )}