【问题标题】:TypeError: categories.map is not a function in ReactJsTypeError:categories.map 不是 ReactJs 中的函数
【发布时间】:2021-12-15 10:47:31
【问题描述】:

我遇到了这个错误:

TypeError: categories.map 不是函数

这是App.js

export default function Header() {
  const [categories, setCategories] = useState([]);
    useEffect(() => {
           const loadCategories = async () => {
               let res = await API.get(endpoints['categories'])
               setCategories(res.data)
           } 

           loadCategories()
    }, []);

    return (
        <Navbar bg="light" expand="lg">
            <Container>
                <Navbar.Brand href="#home">ECoursesAPP</Navbar.Brand>
                <Navbar.Toggle aria-controls="basic-navbar-nav" />
                <Navbar.Collapse id="basic-navbar-nav">
                <Nav className="me-auto">
                    <Link className="nav-link" to="/">Trang chủ</Link>
                    {categories.map(c => <Link className="nav-link" to="#link">{c.name}</Link>)}
                </Nav>
                </Navbar.Collapse>
            </Container>
        </Navbar>
    )
}

这是API.js

import axios from "axios";

export let endpoints = {
    "categories": "/categories/"
}
    
export default axios.create({
    baseURL: "http://localhost:8000"
})

【问题讨论】:

  • CONsole res.data 的值并检查它是否是一个数组。

标签: reactjs axios react-hooks


【解决方案1】:

您应该始终在 .map 之前进行空检查以避免运行时错误

{(categories || []).map(c => <Link className="nav-link" to="#link">{c.name}</Link>)}

【讨论】:

  • 显示 TypeError: (categories || []).map is not a function
  • 你能控制类别的价值吗?
  • 显示控制台:{数据:{...},状态:200,状态文本:'OK',标题:{...},配置:{...},...} 配置:{transitional:{...} , transformRequest: Array(1), transformResponse: Array(1), timeout: 0, adapter: ƒ, ...} data: {count: 3, next: 'localhost:8000/categories/?page=2', previous: null, results: Array(2) } 标头:{content-length: '175', content-type: 'application/json'} 请求:XMLHttpRequest {onreadystatechange: null, readyState: 4, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, ...} 状态: 200 statusText:“OK”[[原型]]:对象
  • 是的。那么它的输出是什么?
  • 并且有来自后端的输出数据:数据:计数:3下一个:“localhost:8000/categories/?page=2”上一个:空结果:数组(2)0:{id:3,名称:'Đồ họa'} 1: {id: 2, name: 'Lập trình hướng đối tượng'} 长度: 2 [[Prototype]]: Array(0) [[Prototype]]: Object
【解决方案2】:

可能您的 api 端点没有返回数组,因此您可以修复它或者您可以使用类别?.map

【讨论】:

    【解决方案3】:

    在第一次渲染时,您的 categories 数组是一个空数组。所以你正在做这样的事情:

    [].map(item => <p>{item.name}</p>)
    

    当数组中没有项目时,使用点表示法获取项目值会导致问题。

    有两种选择:

    1. setState的初始化阶段添加一个默认值,例如:
    const [categories, setCategories] = useState([
      {id: 0, name: "" , ...}
    ]);
    
    1. 在呈现 categories 之前等待 API 响应:
    {
      categories.length > 0 && categories.map(
        // rest of the codes ...
      )
    }
    

    更新

    你的api.js还有另一个问题

    在 Javascript 对象中,无需将 key 用引号括起来。所以把它从categories删除:

    let endpoints = {
        categories : "/categories/"
    }
    

    【讨论】:

    • 2路错误不显示但仍然无法从后端获取数据
    • 我现在已经更新了我的答案,请看看@HuyNguyen
    【解决方案4】:

    嘿,根据你的错误,问题是数组在第一次渲染时不显示元素,所以如果数组存在则使用逻辑,然后数组映射数据让我告诉你

        export default function Header() {
      const [categories, setCategories] = useState([]);
        useEffect(() => {
               const loadCategories = async () => {
                   let res = await API.get(endpoints['categories'])
                   setCategories(res.data)
    
           } 
    
           loadCategories()
    }, []);
    
    return (
        <Navbar bg="light" expand="lg">
            <Container>
                <Navbar.Brand href="#home">ECoursesAPP</Navbar.Brand>
                <Navbar.Toggle aria-controls="basic-navbar-nav" />
                <Navbar.Collapse id="basic-navbar-nav">
                <Nav className="me-auto">
                    <Link className="nav-link" to="/">Trang chủ</Link>
                    {categories && categories.map(c => <Link className="nav-link" to="#link">{c.name}</Link>)}
                </Nav>
                </Navbar.Collapse>
            </Container>
        </Navbar>
    )
    

    }

    【讨论】:

    • 还是报错,
    • 你确定你的后端工作正常吗?
    • localhost:8000/categories检查返回什么?
    • localhost:8000/categories 它返回类别的json数组
    • 我在设置后端时删除了这一行 :REST_FRAMEWORK { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': '2',}
    猜你喜欢
    • 2019-09-21
    • 2022-01-10
    • 2021-10-15
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多