首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动完成调用API

自动完成调用API
EN

Stack Overflow用户
提问于 2022-03-20 09:06:37
回答 1查看 5.3K关注 0票数 2

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

我所放的代码的问题是,我不知道如何在自动完成组件中调用API并返回结果

代码语言:javascript
复制
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))
}
EN

回答 1

Stack Overflow用户

发布于 2022-04-12 17:51:35

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

代码语言:javascript
复制
<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" />
        )}
      />

Javascript

代码语言: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([]);
  }
};

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

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

有关工作演示,请参见这个CodeSandbox

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71545423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档