当前位置: 首页 > 知识库问答 >
问题:

React-Apollo客户端,如何将查询结果添加到状态

聂季同
2023-03-14

我创建了一个由Apollo客户端和graphQL驱动的react应用程序
定义了我的架构,因此预期结果是一个对象数组(<代码>[{名称:“metric 1”,类型:“type A”},{名称:“metric 2”,类型:“type B”})])

在jsx文件中,我定义了以下查询:

query metrics($id: String!) {
  metrics(id: $id) {
    type
    name
  }
}`;

我用Apollo HOC包装了组件,如下所示:

export default graphql(metricsQuery, {
  options: (ownProps) => {
    return {
      variables: {id: ownProps.id}
    }
  }
})(MetricsComp);

Apollo客户端工作正常,并在渲染方法中返回道具的预期列表。

我想让用户在客户机上操纵结果(编辑/删除列表中的指标,不需要改变服务器上的实际数据)。然而,由于结果在组件道具上,我必须将它们移动到状态,以便能够变异。如何将结果移动到状态而不引起无限循环?

共有3个答案

范建华
2023-03-14

您可以使用这个:

import {useState} from 'react';
import {useQuery} from '@apollo/client';

const [metrics,setMetrics]=useState();

useQuery(metricsQuery,{
    variables:{id: ownProps.id},
    onCompleted({metrics}){
        setMetrics(metrics);
    }
});
艾善
2023-03-14

组件WillReceiveProps将很快被弃用(参考链接)

如果您使用的是React 16,则可以执行以下操作:

class DemoClass extends Component {
  state = {
    demoState: null // This is the state value which is dependent on props
  }

  render() {
    ...
  }
}

DemoClass.propTypes = {
  demoProp: PropTypes.any.isRequired,  // This prop will be set as state of the component (demoState)
}

DemoClass.getDerivedStateFromProps = (props, state) => {
  if (state.demoState === null && props.demoProp) {
    return {
      demoState: props.demoProp,
    }
  }
  return null;
}

您可以通过阅读以下内容了解更多信息:link 1, link 2

龚沛
2023-03-14

如果apollo在这件事上像中继一样工作,您可以尝试使用组件WillReceiveProps

class ... extends Component {

  componentWillReceiveProps({ metrics }) {
    if(metrics) {
      this.setState({
        metrics,
      })
    }  
  }
}

像这样的。

 类似资料:
  • 我的用途是case是一个map组件。我只希望当用户按下按钮时加载标记的数据,但不是在初始组件安装或位置改变时。 下面的代码示例:

  • 问题内容: 我正在用SSRS编写一份报告。该数据集填充有MS SQL Server的SQL查询。它使用Union All查询几个相似的表。问题是有一些信息丢失。不同的表适用于不同的工作站点,但是这些表中的任何列都没有站点名称。标识站点的唯一方法是通过表名。在“全部合并”的结果的合并列中,无法分辨出哪些行来自哪个站点。 有没有一种方法可以更改我的查询以在结果中添加一列,该列将具有与每一行相关联的工作

  • 我的任务是用hibernate的数据值填充prime faces数据表。我们可以通过这个查询获取表中的所有记录 将从表雇员中获取所有记录,雇员字段有两个字段名称,以及将其转换为列表的Hibernate查询 列表=查询。list();我想将其转换为数组列表,其中包含两个字段name,age和hibernate中的所有对象 然后用 有人能举例说明吗

  • 问题内容: 在Apollo React文档http://dev.apollodata.com/react/queries.html#basics中,有显示组件时自动获取的示例,但是我想在单击按钮时运行查询。我看到一个在单击按钮时“重新”获取查询的示例,但我不希望它最初进行查询。我看到有一种方法可以调用变异,但是如何调用查询呢? 问题答案: 您可以通过使用高阶组件传递对Apollo客户端的引用来实现

  • 假设Component-TODOList需要以两种不同的方式显示TODO的列表,listview和gridview。假设我想保持两个视图作为不同的组件,那么最佳实践是什么- > 使用graphql查询创建TodoList组件,然后将查询结果传递给TODOListView和TODOGridView组件? 创建没有graphql查询的TodoList组件,然后在ToDoListView和TODOGri

  • 我们这样实现了graphql api响应。 如果我通过graphiql查询我们的api,响应看起来像预期的那样。但不幸的是,我们应用程序中的apollo客户机从返回对象中剥离了除之外的所有属性。 这是意料之中的行为吗?如果是这样,我如何改变它或以不同的方式解决这个问题。我需要得到相应地实现分页的数据总量。 我知道有一个带有的方法,但它不会告诉我列表中条目的全部数量。