我有一个搜索框,可以复制和粘贴excel中的列。我解析输入并生成条目数组。
然后,我正在映射条目并为每个项目调用一个自定义钩子,以从我的graphql
端点中获取一些数据。
例如:
在搜索框中提供了3个条目:
["D38999/26", "LJT06RE25-61PA", "D38999/46FJ61AA"]
fetchData
函数一次接收这些项目之一作为查询参数。当前,此过程将返回3个单独的对象,例如:
{query: "D38999/26", cables: Array(35)}
{query: "LJT06RE25-61PA", cables: Array(1)}
{query: "D38999/46FJ61AA", cables: Array(1)}
如何设置反应挂钩,以允许我将每个对象作为对象数组附加到result
状态中?
我的最终目标将是这样的对象数组:
[
{query: "D38999/26", cables: Array(35)},
{query: "LJT06RE25-61PA", cables: Array(1)},
{query: "D38999/46FJ61AA", cables: Array(1)}
]
这是我当前用于解决API终结点的自定义钩子
const useCableMatch = () => {
const [result, setResult] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [isError, setIsError] = useState(false);
const client = useApolloClient();
const fetchData = async query => {
setIsError(false);
setIsLoading(true);
try {
const { data } = await client.query({
query: GET_VALID_CABLE,
variables: { pn: `%${query}%` },
});
const response = { query, ...data };
console.log('response:', response);
setResult(response);
} catch (error) {
setIsError(true);
}
setIsLoading(false);
};
return [{ result, isLoading, isError }, fetchData];
};
当前setResult
已设置为仅从响应返回单个对象。我想返回一个数组,将生成的每个对象附加到现有的对象数组中。
答案 0 :(得分:1)
假设可以将response
直接添加到result
数组中,则可以:
setResult(result => [...result, response]);
这将通过使用array spread operator
附加先前response
状态中的新result
。
答案 1 :(得分:0)
您可以将整个数组传递给钩子,然后将结果作为数组返回。您还应该将useEffect
用于异步逻辑。我重写了您的代码以一次处理所有3个字段:
const useCableMatch = (searchInput) => {
const [result, setResult] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [isError, setIsError] = useState(false);
const client = useApolloClient();
useEffect((searchInput) => {
setIsError(false);
setIsLoading(true);
let response
for(let field of searchInput){
try {
const { data } = await client.query({
query: GET_VALID_CABLE,
variables: { pn: `%${field}%` },
});
response = { ...data };
} catch (error) {
setIsError(true);
}
}
setResult(current => {query, ...current, ...response);
setIsLoading(false);
};
}, [searchInput])
return [{ result, isLoading, isError }];
};