React - 自动完成调用 API

ile*_*et2 5 reactjs material-ui react-hooks

我正在使用 Material UI 自动完成组件在返回 JSON 的方法中进行 API 调用。这个想法是,当用户输入自动完成组件时,它会调用以查找与字符串匹配的结果。

我输入的代码存在的问题是我不知道如何进行 API 调用并在自动完成组件中返回结果

const [itemsAutocomplete, setItemsAutocomplete] = useState([])

 <Autocomplete
     disablePortal
     id="autocomplete-search"
     onChange={handleItemsOptions}
     getOptionLabel={option => option.name}
     sx={{ width: 300 }}
     renderInput={params => (
     <TextField {...params} label="Search an item..." />
     )}
     />



const handleItemsOptions = event => {

    const requestOptions = {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            name : search_name,
        }),
    }

   
    fetch(
        `${process.env.NEXT_PUBLIC_BACKEND_URL}/api/product/items/search/`,
        requestOptions,
    )
        .then(response => response.json())
        .then(json => setItemsAutocomplete(json))
}
Run Code Online (Sandbox Code Playgroud)

Ian*_*n A 12

如果您希望在每次用户在搜索框中键入内容时更新选项,您可以使用onInputChange自动完成的属性,并将其连接到执行 API 调用并options根据结果更新选项的函数。

超文本标记语言

<Autocomplete
        id="combo-box-demo"
        options={options}
        onInputChange={onInputChange}
        getOptionLabel={(option) => option.title}
        style={{ width: 300 }}
        renderInput={(params) => (
          <TextField {...params} label="Combo box" variant="outlined" />
        )}
      />
Run Code Online (Sandbox Code Playgroud)

JavaScript

const [options, setOptions] = useState([]);
const previousController = useRef();

const getData = (searchTerm) => {
  if (previousController.current) {
    previousController.current.abort();
  }
  const controller = new AbortController();
  const signal = controller.signal;
  previousController.current = controller;
  fetch("https://dummyjson.com/products/search?q=" + searchTerm, {
    signal,
    headers: {
      "Content-Type": "application/json",
      Accept: "application/json"
    }
  })
    .then(function (response) {
      return response.json();
    })
    .then(function (myJson) {
      console.log(
        "search term: " + searchTerm + ", results: ",
        myJson.products
      );
      const updatedOptions = myJson.products.map((p) => {
        return { title: p.title };
      });
      setOptions(updatedOptions);
    });
};

const onInputChange = (event, value, reason) => {
  if (value) {
    getData(value);
  } else {
    setOptions([]);
  }
};

Run Code Online (Sandbox Code Playgroud)

onInputChangegetData(value)如果用户输入了某些内容,将执行 HTTP 请求 ( )。如果字符串为空(即用户已删除他们键入的文本),它将默认为options空数组。在此函数中,value是用户输入的字符串。

getData执行 HTTP 请求并setOptions根据返回的结果调用更新自动完成选项。AbortController的用途是确保当用户键入(或删除)一个字符并发出下一个 HTTP 请求时,之前的 HTTP 请求被取消。这是因为,根据 API 的速度,请求可能不会按照发送的顺序返回。

请参阅此 CodeSandbox以获取工作演示。

  • 您好,我在项目中编写了这样的代码,它工作正常,但是当我在搜索后使用带有多个选项的自动完成功能时,它会重新渲染并清空我的文本字段。有什么解决办法吗? (2认同)