React - 自动完成调用 API

2024-03-16

我正在使用 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))
}

如果您想在每次用户在搜索框中键入内容时更新选项,您可以使用onInputChangeAutocomplete 属性并将其挂接到执行 API 调用并更新options根据结果​​。

HTML

<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

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根据返回的结果更新自动完成选项。指某东西的用途中止控制器 https://developer.mozilla.org/en-US/docs/Web/API/AbortController是为了确保当用户键入(或删除)一个字符并发出下一个 HTTP 请求时,之前的 HTTP 请求被取消。这是因为,根据 API 的速度,请求可能不会按照发送的顺序返回。

See 这个代码沙盒 https://codesandbox.io/s/react-mui-forked-2g3jq9?file=/index.js一个工作演示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React - 自动完成调用 API 的相关文章

随机推荐

  • 如何在黑莓手机中制作状态栏?

    我想在屏幕底部设置状态栏 它应该在左侧和右侧显示一个按钮 你可以在下面看到我的屏幕 我的代码是这样的 private void BottomLayout Bitmap topBg Bitmap getBitmapResource Image
  • 使用 iOS 版 OAuthConsumer 将图像上传到 tumblr

    我正在使用OAuth消费者 http code google com p oauthconsumer 在我的 iOS 应用程序中 它使用汤不热API http www tumblr com docs en api v2 posting 一般
  • paypal沙箱商户账户错误

    我有一个网站 我正在尝试使用 php 脚本将 paypal 连接到该网站 php 构建查询字符串然后提交到https www paypal com cgi bin webscr https www paypal com cgi bin we
  • Maui -- 如何使背景颜色透明?

    我正在尝试编写一个程序 该程序将用作另一个程序之上的覆盖 我希望文本 按钮和边框是实心的 背景是透明的
  • 如何向 Traefik 添加唯一的请求 ID 标头

    在Traefik中 是否可以为请求添加唯一的Request ID标头 我希望能够将访问日志与后端服务的日志关联起来 AFAIK 不支持它 但是 Traefik 2 3 6 中有一个功能解决方法 static config tracing W
  • 通过 FQL 识别来自 fb:comments 的垃圾邮件

    我正在运行 FQL 查询来获取网站上特定帖子的评论 有没有办法识别是否被标记为垃圾邮件 如果没有 我可以看到博客所有者删除了一些评论 以便它们在网站上不可见 是否有办法识别哪些内容已被博客所有者 隐藏 删除 Thanks 我正在使用 is
  • 如何使用 TypeScript 返回正确的 Promise

    所以我正在用 typescript 学习 Angular 2 我正在编写一个模拟服务 如果服务成功获取对象 它 我相信 应该返回一个 Promise 如果发生任何情况 则返回一个错误 我尝试过以下代码 但看起来它不是打字稿的编写语法 更新了
  • 指令中的 $watch 函数在 Angular JS 中没有被触发

    我是 Angular JS 的新手 一直在到处寻找为什么这不起作用的答案 我在这里有我的指令 directive carrouselPreview function return function scope element attrs s
  • 如何禁用表单身份验证

    我的网站中有一个文件夹 我使用基于表单的身份验证对其进行保护 我现在必须在该文件夹中开发两个新页面 并且我想在测试和调试新表单时关闭安全性 我已将网站 web config 文件中的身份验证模式更改为 mode None 并且已从安全文件夹
  • 嵌套溢出滚动隐藏的溢出不起作用

    我有一个 div 没有被剪切到父级的问题 即使它有overflow hidden 我已经浏览过overflow hiddenstackoverflow 上有问题 但大多数都有问题position或者似乎表明我的代码应该可以工作 这是一个MW
  • 读取 CSV Oracle 存储过程 UTL_FILE 时忽略引号之间的逗号

    示例数据 1 test xy yz dog cat 2 test2 xy fish bear 正如您在上面所看到的 第二列可能会也可能不会用引号引起来 并且作为字符串的一部分 我只是想找到一种方法来忽略引号内的逗号 如果有的话 我正在使用
  • 使用 Django 下载文件

    这可能是一个简单的问题 但我不知何故找不到解决方案 Django 提供了很多有关上传文件的信息 但是如何下载文件 假设我们有一个 HTML 按钮uploads something txt作为一个文件 我尝试过django views sta
  • MongoDB 项目放入数组中

    我有对象数组 嵌套 我想从这些嵌套对象中提取一些元素 并在数组中返回这些字段 下面是我的文档结构 从原始数据中模拟 detailLine name first value lineNumber 1 subLineCode detailLin
  • 为什么 IEnumerable 继承自 IEnumerable?

    这可能是一个老问题 为什么IEnumerable
  • Doxygen 将全局变量声明视为 C++ 中的函数

    当我运行 Doxygen 1 8 15 时 我在日志文件中收到警告 指出并未记录函数的所有参数 warning parameters of member gSwInstallIoMgr are not all documented warn
  • 根据表面包围的 3D 区域将表面分配给区域

    给定三维空间中的一组曲面 我尝试将每个曲面分配给一个区域 该区域引用该组所包围的最小 3D 区域 或者如果不适用则不指定任何区域 我还想确定一个表面是否是两个区域之间的界面 因此 例如 如果我们有 11 个表面 代表两个堆叠在一起的立方体
  • Visual Studio 2013 上缺少“Ado.Net 实体数据模型”

    我已经创建了新的 Web 项目 但找不到 ADO net 实体数据模型来添加它 如何修复或安装 转到 C ProgramData Package Cache 并搜索 EFTools msi 您应该找到两个文件 只需安装最新的一个 大约 96
  • 如何有效地将一组数字拟合到预定分布中

    假设我有一组数字 我想根据预定的分布对它们进行求和以适合队列 一个简单的例子是 如果一组数字的累积量为 100 并且队列 1 2 和 3 的分布分别为 0 2 0 3 0 5 那么我想找到总和为 20 的数字子集 另一个总和为 30 的唯一
  • Active_support/dependency.rb:247 `require': 无法加载此类文件 -- 2.1/pg_ext (LoadError)

    我在 Windows 机器上使用 Ruby 2 1 5 Rails 4 1 6 和 PostgreSQL 9 3 5 当我尝试bundle exec rails server 我最终出现以下错误 DL is deprecated pleas
  • React - 自动完成调用 API

    我正在使用 Material UI 自动完成组件在返回 JSON 的方法中进行 API 调用 这个想法是 当用户输入自动完成组件时 它会调用以查找与字符串匹配的结果 我输入的代码存在的问题是我不知道如何进行 API 调用并在自动完成组件中返