You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React自定义Hook返回对象而非数组导致MUI Autocomplete报错

MUI Autocomplete自定义Hook返回类型错误问题修复

问题核心原因

你的useFetchGames Hook中,fetchData是异步函数,调用它会直接返回Promise对象(typeof为object),而你在useEffect里直接把这个Promise赋值给了gameSearch状态,导致后续searchOptions变成了Promise而非预期的数组,所以Autocomplete执行map/filter时报错。

修复步骤

1. 正确处理异步请求的结果

在useEffect内部用异步函数包裹逻辑,等待fetchData解析完成后再更新状态:

useEffect(() => {
  const fetchAndSetData = async () => {
    if (searchString) {
      const data = await fetchData(searchString);
      setGameSearch(data || []);
    } else {
      setGameSearch([]);
    }
  };
  fetchAndSetData();
}, [searchString]);

2. 优化generateSearchOptions函数

原函数遍历逻辑冗余,改成更简洁的写法:

const generateSearchOptions = (array) => {
  return array?.map(item => item.name) || [];
};

3. 处理请求错误的边界情况

在fetchData中添加错误捕获后的兜底逻辑,避免请求失败时返回undefined:

async function fetchData(searchString) {
  try {
    const res = await axios.post("/api/games", { input: searchString });
    return generateSearchOptions(res.data);
  } catch (err) {
    console.log(err);
    return []; // 请求失败时返回空数组
  }
}

完整修复后的Hook代码

import axios from "axios";
import { useEffect, useState } from "react";

export default function useFetchGames(searchString) {
  const [gameSearch, setGameSearch] = useState([]);

  useEffect(() => {
    const fetchAndSetData = async () => {
      if (searchString) {
        const data = await fetchData(searchString);
        setGameSearch(data);
      } else {
        setGameSearch([]);
      }
    };
    fetchAndSetData();
  }, [searchString]);

  return gameSearch;
}

const generateSearchOptions = (array) => {
  return array?.map(item => item.name) || [];
};

async function fetchData(searchString) {
  try {
    const res = await axios.post("/api/games", { input: searchString });
    return generateSearchOptions(res.data);
  } catch (err) {
    console.log(err);
    return [];
  }
}

组件调用说明

原组件调用代码无需修改:

const searchOptions = useFetchGames(inputValue);

此时searchOptions始终为数组(初始空数组、请求中保持之前的数组、请求完成后更新为新数组),Autocomplete可以正常执行map/filter操作。

内容的提问来源于stack exchange,提问作者Qoussay El Akkari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:35:17