【发布时间】:2022-11-12 16:32:42
【问题描述】:
我正在使用一个 MUI 自动完成字段,该字段采用一个数组作为选项。 我创建了这个钩子,它接受输入值并基于它获取 API。 这是它的代码:
import axios from "axios";
import { useEffect, useState } from "react";
export default function useFetchGames(searchString) {
const [gameSearch, setGameSearch] = useState([]);
useEffect(() => {
if (searchString) setGameSearch(fetchData(searchString));
}, [searchString]);
return gameSearch;
}
const generateSearchOptions = (array) => {
const tempArray = [];
array.map((item) => {
tempArray.push(item.name);
});
return tempArray;
};
async function fetchData(searchString) {
const res = await axios
.post("/api/games", { input: searchString })
.catch((err) => {
console.log(err);
});
return generateSearchOptions(res.data);
}
然后我在我有自动完成元素的组件中调用这个钩子。
const searchOptions = useFetchGames(inputValue);
问题是,useFetchGames 应该返回一个数组,因为状态是一个数组。但是每当输入发生变化时,我都会收到一个错误,即您无法过滤或映射对象。基本上自动完成元素试图映射searchOptions,但它不是一个数组。
我什至尝试用log(typeof searchOptions); 记录它的类型并返回一个对象。
我不明白我做错了什么。
【问题讨论】:
-
控制台 res.data 的结果
-
它是一个对象数组。该代码在组件本身中实现时可以正常工作。但是我需要在其他组件中重用它,所以我决定把它做成一个钩子。我将在编辑中添加 res.data 的日志
-
函数
fetchData(searchString)也将返回一个承诺,而不是您期望的数据...... -
res.data 是一个数组。关于承诺,我该如何解决。我试图按照他们在 react 网站中创建自定义 Hooks 的文档中所做的操作。
-
对不起,我的错,这是一个假设,并编辑了看到你的编辑:)
标签: javascript reactjs arrays react-hooks axios