反应挂钩无法读取 属性 未定义的地图
react hooks cannot read property map of undefined
我正在开发一个电影列表搜索应用程序,稍后可能会尝试添加延迟加载。这仅用于 POC 目的。以后可能会把它添加到我的投资组合中。
因此,我首先创建了一个全局 api.js
,我将在其中放置带有回调的 API 调用,然后使用来自组件的回调调用 API。
const PageOneApi = (callback, errorCallback) => {
axios("https://run.mocky.io/v3/36e4f9ce-2e48-4d44-9cf8-57f6900f8e12")
.then((response) => {
console.log("response from page one api", response);
callback(response);
})
.catch((err) => {
console.log("error from page one api", err);
errorCallback(err);
});
};
export const movieListApi = {
PageOneApi,
};
我有一个 movieList
组件:
function MovieList() {
const [pageOneData, setPageOneData] = useState({});
useEffect(async () => {
await movieListApi.PageOneApi(
(res) => {
const pageOneData = res.data.page;
setPageOneData(pageOneData);
console.log("page one data: ", pageOneData);
},
(err) => {
console.log(err);
}
);
}, []);
const movieList = pageOneData.contentItems;
console.log(movieList);
return (
<div>
<h4 className="text-white p-5">{pageOneData.title}</h4>
<div className="grid grid-flow-row grid-cols-3 grid-rows-3 gap-7 m-5">
{movieList.map((movie) => {
console.log("movie", movie);
})}
</div>
</div>
);
}
现在,问题是我无法遍历 movieList
,即使它是一个数组。
由于 pageOneData
最初是一个空对象,因此 pageOneData.contentItems
在第一个渲染周期中将是未定义的。导致 movieList.map 失败,因为你的 useEffect 调用是在初始渲染之后进行的,并且会触发一个 API,它又是异步的,需要时间来获取结果
您可以使用 movieList 的默认值来解决错误
const movieList = pageOneData.contentItems || [];
或
<div className="grid grid-flow-row grid-cols-3 grid-rows-3 gap-7 m-5">
{movieList?.map((movie) => {
console.log("movie", movie);
})}
</div>
最初 pageOneData
是空白对象,所以 pageOneData.contentItems
将 return 未定义,所以首先渲染反应会抛出错误。
要解决这个问题,您可以使用 optional chaining 所以请尝试以下操作:-
{movieList?.map((movie) => {
console.log("movie", movie);
})}
我正在开发一个电影列表搜索应用程序,稍后可能会尝试添加延迟加载。这仅用于 POC 目的。以后可能会把它添加到我的投资组合中。
因此,我首先创建了一个全局 api.js
,我将在其中放置带有回调的 API 调用,然后使用来自组件的回调调用 API。
const PageOneApi = (callback, errorCallback) => {
axios("https://run.mocky.io/v3/36e4f9ce-2e48-4d44-9cf8-57f6900f8e12")
.then((response) => {
console.log("response from page one api", response);
callback(response);
})
.catch((err) => {
console.log("error from page one api", err);
errorCallback(err);
});
};
export const movieListApi = {
PageOneApi,
};
我有一个 movieList
组件:
function MovieList() {
const [pageOneData, setPageOneData] = useState({});
useEffect(async () => {
await movieListApi.PageOneApi(
(res) => {
const pageOneData = res.data.page;
setPageOneData(pageOneData);
console.log("page one data: ", pageOneData);
},
(err) => {
console.log(err);
}
);
}, []);
const movieList = pageOneData.contentItems;
console.log(movieList);
return (
<div>
<h4 className="text-white p-5">{pageOneData.title}</h4>
<div className="grid grid-flow-row grid-cols-3 grid-rows-3 gap-7 m-5">
{movieList.map((movie) => {
console.log("movie", movie);
})}
</div>
</div>
);
}
现在,问题是我无法遍历 movieList
,即使它是一个数组。
由于 pageOneData
最初是一个空对象,因此 pageOneData.contentItems
在第一个渲染周期中将是未定义的。导致 movieList.map 失败,因为你的 useEffect 调用是在初始渲染之后进行的,并且会触发一个 API,它又是异步的,需要时间来获取结果
您可以使用 movieList 的默认值来解决错误
const movieList = pageOneData.contentItems || [];
或
<div className="grid grid-flow-row grid-cols-3 grid-rows-3 gap-7 m-5">
{movieList?.map((movie) => {
console.log("movie", movie);
})}
</div>
最初 pageOneData
是空白对象,所以 pageOneData.contentItems
将 return 未定义,所以首先渲染反应会抛出错误。
要解决这个问题,您可以使用 optional chaining 所以请尝试以下操作:-
{movieList?.map((movie) => {
console.log("movie", movie);
})}