在类组件的方法中获取查询

2024-03-20

Apollo 客户端(2.6.3)与反应。 是否可以在类组件的方法中获取数据? 我正在构建一个全局搜索组件,并且我只想在键入第三个(以及每个后续)字符时才获取​​数据。现在它是用 fetch api 实现的,但我想切换到 apollo 客户端和 graphql api。

到目前为止,我还没有遇到任何与 apollo 客户端 API 相关的问题,因为我使用<Query/>成分。

我尝试使用新的 hooks api,但结果发现 useLazyQuery() 只能在函数组件中使用(钩子规则)。

这就是我到目前为止所做的。我知道该组件很混乱,并且我愿意接受建议。这是我的第一个反应应用程序。

import React, { Component } from "react";
import PropTypes from "prop-types";
import { Select, Icon, Button } from "antd";
import { es } from "../../../utils/queries";
import { useLazyQuery } from "@apollo/react-hooks";

const { Option, OptGroup } = Select;

class GlobalSearch extends Component {
  constructor(props) {
    super(props);
    this.searchInput = React.createRef();
  }

  state = {
    data: [],
    value: undefined,
    display: false
  };

  componentDidMount() {
    document.addEventListener("click", this.onClickOutside);
  }

  generateOptions(data) {
    return data.map(d => {
      if (d._index === "cases") {
        d.label = (
          <div>
            <Icon style={{ fontSize: "18px" }} type="tool" />
            <span style={{ color: "#183247" }}>
              {d._source.number + d._source.serialNumber}
            </span>
          </div>
        );
      } else if (d._index === "items") {
        d.label = (
          <div>
            <Icon style={{ fontSize: "18px" }} type="barcode-o" />
            <span style={{ color: "#183247" }}>{d._source.name}</span>
          </div>
        );
      } else if (d._index === "people") {
        d.label = (
          <div>
            <Icon
              type="user"
              style={{ fontSize: "18px", float: "left", marginTop: "3px" }}
            />
            <div style={{ marginLeft: "26px" }}>
              <span style={{ color: "#183247" }}>
                {" "}
                <div>{d._source.name + " " + d._source.surname}</div>
              </span>
              <div>{d._source.email}</div>
            </div>
          </div>
        );
      } else if (d._index === "counterparties") {
        d.label = (
          <div>
            <Icon style={{ fontSize: "18px" }} type="shop" />
            <span style={{ color: "#183247" }}>{d._source.name}</span>
          </div>
        );
      } else {
        d.label = "undefined";
      }
      return d;
    });
  }

  //group data according to type of the search result (index e.g. cases, items, contacts)
  setData = es_data => {
    const data = {};
    const map = new Map();
    for (const item of es_data) {
      if (!map.has(item._index)) {
        map.set(item._index);

        data[item._index] = [];
      }
      data[item._index].push(item);
    }

    this.setState({ data: data });
  };

  handleSearch = value => {
    if (value.length > 2) {
      //tutaj wyszukujemy dane na serwerze a wyniki callbackiem przesyłamy do state.data[]
      //response.json() calls mixin methods from body
      
      const host = window.location.hostname

      // const { loading, data } = useLazyQuery(es(value));
      // if (loading) return undefined;

      // if (data) {
      //   this.setData(this.generateOptions(data));
      // }

      fetch(`http://${host}:3000/api/es?searchString=${value}`)
        .then(response => response.json())
        .then(es_data => {
          this.setData(this.generateOptions(es_data));
        });
    }
  };

  handleChange = value => {
    //przy kazdym wpisanym znaku aktualizuj wartosc pola
    this.setState({ value });
  };

  handleSelect = (key, option) => {
    console.log(key);
    console.log(option);
  };

  handleBlur = e => {
    this.setState({ display: false, value: undefined, data: [] });
  };

  onClick = () => {
    this.setState({ display: !this.state.display });
  };

  getSearchField(options) {
    if (this.state.display) {
      return (
        <Select
          id="global-search-field"
          optionLabelProp="label"
          showSearch
          value={this.state.value}
          placeholder={"search..."}
          style={{ display: this.state.display, width: "350px" }}
          defaultActiveFirstOption={true}
          showArrow={false}
          filterOption={false}
          onSearch={this.handleSearch}
          onChange={this.handleChange}
          onSelect={this.handleSelect}
          notFoundContent={"nothing here..."}
          onBlur={this.handleBlur}
          autoFocus={true}
          showAction={["focus"]}
          dropdownClassName="global-search-dropdown"
        >
          {options}
        </Select>
      );
    }
  }

  render() {
    //generate options for each group (index)
    const options = Object.keys(this.state.data).map(d => (
      <OptGroup label={d}>
        {this.state.data[d].map(d => (
          <Option
            className={d._index}
            type={d._index}
            key={d._id}
            label={d.label}
          >
            <div>{d.label}</div>
          </Option>
        ))}
      </OptGroup>
    ));

    return (
      <span>
        {this.getSearchField(options)}

        <Button
          id="global-search"
          shape="circle"
          icon="search"
          onClick={this.onClick}
        />
      </span>
    );
  }
}

export default GlobalSearch;

Apollo Client 提供基于 Promise 的 API,可以对查询/突变的运行时间/地点提供更严格的控制。这是一个例子他们的文档 https://www.apollographql.com/docs/tutorial/client/#make-your-first-query:

client
  .query({
    query: gql`
      query GetLaunch {
        launch(id: 56) {
          id
          mission {
            name
          }
        }
      }
    `,
    variables: { ... }
  })
  .then(result => console.log(result));

您可以导入客户端并在任何方法或函数中使用此模式,就像使用 Promises 的任何其他异步操作一样。

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

在类组件的方法中获取查询 的相关文章

  • 使用 Jquery 附加链接

    我正在尝试根据您所在的页面添加指向我的页面的链接 我使用 Squarespace 来构建这个网站 因此对我来说最简单的方法是使用 Javascript 或 Jquery 我认为我缺少的这个语法有问题 我已经尝试用 来打破引号 但这不起作用
  • 修复输入字段后,html5 oninvalid 不起作用

    我的表单中有这个输入代码
  • 无法在 IE 中的选择选项上使用 onmouseover 事件

    更新的代码 function getElements var x document getElementsByTagName option var el document getElementById selectDept el onmou
  • 发布到 npm 时出现问题

    所以我尝试使用 React 构建一个开源项目并将其推送到 npm 问题是 我的组件虽然在测试环境中运行良好 安装到其他组件 但当我将其发布到 npm 并下载包并尝试访问它时 它给了我一个错误 这是代码的一个小示例 import React
  • Facebook 自定义故事与大图像 - 使用 Javascript 打开图

    我正在尝试创建一个自定义故事 每次有人尝试发布它时都会有一个新图像 现在我创建了一个对象 以及将两者结合起来的动作和故事 我想要实现的是一个看起来像这样的故事https fbcdn dragon a akamaihd net hphotos
  • 如何解构 React props 并仍然访问其他 props?

    我很好奇如果我想要所有的 props 但也想要解构单个属性 那么组件的参数 props 是否可以像导入一样解构 我想这更像是一个 JavaScript 问题 而不是一个 React 问题 但是举个例子 import React useEff
  • 从 html5

    我正在寻找一种方法来根据用户代理字符串将控件属性添加到视频标签 我不希望在 iPad 和 Android 之外的任何浏览器或设备上出现控件属性 所以我认为用户代理是最好的识别方法 因为 ipad 和 android 一词出现在各自的 UA
  • 动态更改 vuejs 2 中的选择输入选项

    如何动态更改选择下拉 v model 中的选项 我有 2 个选择输入 其中一个应该根据其他输入进行更改 例如 如果我选择 水果 则选择显示水果 如果我选择 蔬菜 则选择显示蔬菜 我不使用Vuejs 但查看文档后 var TypesArr F
  • Intro.js 2页然后返回首页

    我在用intro js http introjs com 为我的网站创建一个小介绍 我希望游览从第 1 页 主页 2 另一页 然后回到第 1 页 主页 我已经成功地从第 1 2 页开始 但不确定如何让它返回到第 1 页 我对 javascr
  • 在移动网站中处理 iPhone 事件(如向左滑动)

    iPhone 浏览器是否有可以使用 Javascript 挂钩的特殊事件 例如 如果用户向左滑动 我想执行某个操作 如果有类似的活动 很高兴看到所有这些活动的参考 理想情况下 有一天所有触摸屏移动浏览器都会有一个标准 您可以访问多点触控事件
  • 运行故事书时出错 - sh: 1: start-storybook: 未找到

    我运行时遇到错误故事书 即使是干净的安装 npm run storybook gt storybook media programmersedge New Volume devs demostorybook gt start storybo
  • Onblur 事件在另一个 div 的 onclick 之前触发

    如上所述 我有一个按钮 单击该按钮将打开子菜单 对于子菜单中的每个选项 都有三个元素 我认为实际上还有更多元素 但为了简单起见 将其保留为 3 我将焦点放在子菜单的主 div 白色 框架 上 Onblur 这个 div 然后我隐藏子菜单 这
  • iPhone 点击时使 div 变暗

    当您的 div 附加了点击处理程序时 当点击该 div 时 iPhone 会使该 div 变暗 作为点击指示器 示例 在移动 Safari 上查看http jsbin com awejo3 4 http jsbin com awejo3 4
  • Facebook API Javascript JSON 响应

    function getUser FB api me function response console log Response is response alert Your name is response first name ale
  • 如何使用 Jquery .animate() 函数创建连续滚动内容? [复制]

    这个问题在这里已经有答案了 可能的重复 在jquery中实现圆形滚动条 https stackoverflow com questions 812049 implementing circular scroller in jquery 我想
  • 在React组件中使用的字符串变量中插入html

    我正在为我的投资组合网站构建一个反应应用程序 目前我已经用 JSX 编写了应用程序 因此我可以添加以下内容 class Project extends React Component render return div h1 this pr
  • Babel/RequireJS + typeof“RangeError:超出最大调用堆栈大小”

    我有一个非常基本的 JS 错误 我很羞愧无法解决它 我正在使用 ES6 和 Babel 进行开发 并且正在做一些实验 请注意 我在 Babel 中使用了这些参数 presets es2015 plugins transform es2015
  • 动态 dom 操作后,如何在浏览器历史记录中保留 dom 状态?

    是否有一个通用的解决方案来保留 dom 状态 以便当用户使用后退 前进返回页面时 整个页面处于他们离开时的确切状态 这篇文章询问并回答了为什么不同浏览器和不同 javascript 库的行为不一致 Ajax 后退按钮和 DOM 更新 htt
  • 在firefox上用js改变表单方法

    我需要使用 javascript jQuery 或纯 更改表单的方法属性 我的表单有 method post 我尝试用以下方法更改它 submit button click function var url input id url val
  • 这个 JQuery 指令做什么 $(function(){...}) [重复]

    这个问题在这里已经有答案了 我最近一直在研究JQuery 尽管我知道一些东西 但书上有这样一句话我根本无法理解 function current entry 1 有谁知道这条线是如何工作的以及它的作用是什么 它类似于 JQuery 函数中的

随机推荐

  • 如何在 Apache 网站内托管 ASP.NET Core Web 应用程序?

    我有一个旧的php使用开发的应用程序Yii2框架托管在Centos路径上的服务器 var www html 该应用程序可在以下位置访问http somedomain com 我正在开发使用新的 API 项目ASP NET MVC Core需
  • 在 IntelliJ IDEA 中运行时出现 java.lang.ClassNotFoundException

    我创建一个使用数据库的程序 在 IntelliJ IDEA 中编译时出现以下错误 有人知道为什么会发生这种情况以及我该如何解决它吗 您收到的错误不是在编译时发生的 而是在您尝试运行应用程序时发生的 发生这种情况是因为 Java 无法找到Ta
  • Bash 脚本:无法正确处理 SIGTSTP

    我有一个 bash 脚本 用于安装和卸载设备 并在其间执行一些读取操作 由于设备速度非常慢 因此脚本大约需要 15 秒才能完成 安装至少需要 5 6 秒 由于安装此设备可能会导致其他问题 因此我不希望此脚本被中断 话虽如此 我可以正确处理
  • Vue3“在‘vue-router’中找不到导出‘createWebHistory,createRouter’

    我正在创建一个 Vue3 应用程序 添加路由器后 我的第一页正在加载 但它完全是空白的 我收到以下信息 错误 未捕获类型错误 对象 不是函数 在控制台中 src router index js 中出现警告 未找到导出 createRoute
  • “System.Runtime.Serialization.IExtensibleDataObject”在程序集中定义

    我创建了一个服务 在调用它并执行它时出现以下错误 有人告诉我这个错误是什么 类型 System Runtime Serialization IExtensibleDataObject 是 在未引用的程序集中定义 您必须添加一个 引用程序集
  • Puppeteer 无法获得完整的源代码

    我正在使用 Node js 创建一个简单的抓取应用程序傀儡师 https github com GoogleChrome puppeteer 我想要抓取的页面是 下面是我现在正在使用的代码 const url https www betre
  • 如何比较两个 std::istream 引用?

    我正在将编译器从 GCC 切换到 Clang LLVM 并遇到了我以前没有遇到过的编译错误 我有一堂课看起来像这样 include
  • minikube:无法连接本地部署的 nginx 服务

    我已经在我的 ubuntu 16 04 机器上安装了 minikube 并启动了一个集群 并显示一条消息 Kubernetes is available at https 192 168 99 100 443 接下来 我使用以下命令部署了
  • 如何使用 spacy 或 nltk 检索句子的主要意图?

    我有一个用例 我想使用 spacy 或 nltk 或任何 NLP 库提取句子的主要有意义部分 例句1 我怎样才能发出反对骚扰的声音 意图是 大声疾呼反对骚扰 例句2 唐老鸭是由哪个漫画家 哪个人 谁创作的 意图是 唐老鸭是由 创造的 例句3
  • 使用实体框架记录每个数据更改

    客户需要将每个数据更改与进行修改的实际用户一起记录到日志表中 该应用程序使用一个 SQL 用户来访问数据库 但我们需要记录 真实 用户 ID 我们可以在 t sql 中通过为每个表插入和更新编写触发器并使用 context info 来存储
  • 从 C++ 中的给定文件点读取目录

    我有两个程序将同时读取 写入文件到同一目录 但不会同时读取 写入文件 我已经完成了写作部分 但我正在努力获得阅读目录部分的一半体面且有效的实现 目录中的文件遵循以下命名方案 Image INDEX KEY DEL TIMESTAMP IND
  • Azure Function CosmosDBTrigger 不可扩展

    我有一个带有 CosmosDBTrigger 的 Azure 函数 用于使用 Application Insights 监控的消费游戏 正在监控的集合有500 000插入更改提要中 消费计划将实例数量扩大到15几分钟之内 但只有第一个实例能
  • 使用 axios 递归获取数据并链接结果

    我有一个模式的网址http www data com 1 其中末尾的 1 可以一直运行到一个未预定义的数字 它返回一个数组 我需要将我得到的所有数组连接成一个 我的策略是递归执行 get 请求 直到收到 404 错误 然后返回结果 var
  • Kubernetes 上的 Spring Boot 应用程序 如何使用外部 message.properties 文件来支持 i18n 和 l10n?

    我们有一个部署到 Kubernetes 的 Spring Boot 应用程序 我们正在向此应用程序添加 i18n 功能 并希望将 messages properties 文件放置在应用程序 jar war 之外 我已经能够在春季启动中做到这
  • PowerShell 代码整洁还是重新格式化? [复制]

    这个问题在这里已经有答案了 可能的重复 有 PowerShell 代码格式化程序 漂亮的打印机吗 https stackoverflow com questions 2987176 is there a powershell code fo
  • 如何在数据框中按名称删除列

    我有一个很大的数据集 我想阅读特定的列或删除所有其他列 data lt read dta file dta 我选择我不感兴趣的列 var out lt names data names data in c iden name x serv
  • 反向填充猫鼬

    我怎样才能反向填充 mongo 我有 2 个模式 User var user scheme new mongoose Schema name String age Number roles type mongoose Schema Type
  • GNU less 的 bash 循环每 2 分钟刷新一次

    我有一台 Linux 机器 其中有一个数据文件夹和一个脚本 该脚本会生成一个报告 xlsx 电子表格文件 显示正在运行的文件夹中不断变化的内容 我使用 xlsx2tsv 脚本将其转换为 tsv 文本 耗时不到一秒 该脚本大约需要 1 分钟来
  • 使用 Typescript 和 React 三纤维的着色器

    我正在尝试将着色器与 React 三纤维和 Typescript 一起使用 着色器文件 import ShaderMaterial from three import extend from react three fiber class
  • 在类组件的方法中获取查询

    Apollo 客户端 2 6 3 与反应 是否可以在类组件的方法中获取数据 我正在构建一个全局搜索组件 并且我只想在键入第三个 以及每个后续 字符时才获取 数据 现在它是用 fetch api 实现的 但我想切换到 apollo 客户端和