无法读取 null 的属性“map”
2021-02-07
1622
我有一个 React 组件,它调用后端 API,该 API 返回一个对象数组。
本质上,我有一个
useFetch.js
文件,它获取数据,然后显示在
Products.js
文件中
我的主要问题是,当我只是记录返回的数据时,无论我刷新浏览器多少次,总是会记录正确的数据。但是,一旦我包含一个地图来呈现数据,它就会 仅第一次 显示,然后我收到错误
Cannot read property 'map' of null
当我仅记录数据时的简单场景中的细分:
Products.js
import React from "react";
import useFetch from "./useFetch";
import DisplayTable from "./DisplayTable"
export default function Products(props) {
const [data, loading, error] = useFetch("http://localhost:8080/products");
console.log("data", data)
console.log("loading", loading)
console.log("error", error)
return (
<div>
</div>
)
}
useFetch.js
import { useState, useEffect } from "react";
export default function useFetch(url) {
const [loading, setLoading] = useState(false);
const [error, setError] = useState(false);
const [data, setData] = useState(null);
async function asyncFetchAPI() {
setLoading(true)
fetch(url, {method: "GET"})
.then(response => response.json())
.then(data => setData(data))
.then(loading => setLoading(false))
.catch((error) => {
console.log('error: ' + error)
setError(true)
})
}
useEffect(() => {
asyncFetchAPI();
}, []);
return [data, loading, error];
}
以上工作正常,我可以完美地在控制台中看到数据。但是,当我修改
Products.js
以包含地图并按如下方式显示时
const displayTable = data.map(item => <DisplayTable key={item.id} item={item} />)
现在的新结果是:
import React from "react";
import useFetch from "./useFetch";
import DisplayTable from "./DisplayTable"
export default function Products(props) {
const [data, loading, error] = useFetch("http://localhost:8080/products");
console.log("data", data)
console.log("loading", loading)
console.log("error", error)
const displayTable = data.map(item => <DisplayTable key={item.id} item={item} />)
return (
<div>
</div>
)
}
此时,我得到
Cannot read property 'map' of null
值得一提的是,我的
DisplayTable.js
函数如下所示:
import React from "react"
function DisplayTable(props) {
console.log(props)
return (
<h1>{props.item.categoryId}</h1>
)
}
export default DisplayTable
2个回答
您可以在
useFetch.js
文件中用空数组初始化数据状态来修复此问题
const [data, setData] = useState([]);
或在其他文件中,即
const [data = [], loading, error] = useFetch("http://localhost:8080/products");
Muhammad Haseeb
2021-02-07
问题是您以异步方式请求数据,因此第一次返回的数据为
null
,然后您尝试映射
null
。
例如,此处您的数据最初为
null
const [data, setData] = useState(null);
console.log
有时可能会显示变量的当前状态,因此不要被其欺骗。
因此,在映射之前,您可以设置如下条件:
data && data.map....
或使用空数组作为初始值
Giorgi Moniava
2021-02-07