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

在使用表单组件时如何在apollo-client中链接突变

佟和安
2023-03-14

我在两篇非常相似的帖子中回顾了解决方案:如何在React中的Apollo客户机突变组件中包装GraphQL突变,以及如何在Apollo客户机中将突变链在一起。我认为我对表单的使用给我的解决方案增加了一些额外的复杂性。虽然传递的值(competitionId)在handleOnSubmit函数中是可见的(如果我在handleOnSubmit中的createCompetition()之后进行控制台日志记录),但它不会在handleOnSubmit中调用的第二个变异中作为变量传递。结果是成功执行了第一个突变,而第二个突变出现了400个错误:“errors”:[{“message”:“variable\”$CompetitionId\“of required type\”id!\“was not provided.”更具体地说,在第一个突变运行后,CompetitionId的值会传递给第二个突变,但它不会作为“variables”传递给createMatch函数,作为参数传递给HandleOnSubmit.看起来像是随createMatch函数一起传递给handleOnSubmit的“变量”,只包括单击submit按钮时可用的变量。competitionId是在单击submit按钮后生成的,第一个突变作为结果返回它。

handleOnSubmit = async(event, createCompetition, createMatch) => {
event.preventDefault();
await createCompetition();
await createMatch();
this.clearState();
this.props.history.push('/home');

}

render () {
const {location, name, action, caliber, rifleName, dateOf,competitionScore} = this.state;
const { matchNumber, targetNumber, relay, distanceToTarget, matchScore} = this.state;
return (
<div className="App">
  <h2 className="App">Add Competition</h2>
  <Mutation 
    mutation={CREATE_COMPETITION} 
    variables={{location, name, action, caliber, rifleName, dateOf, competitionScore}}
    refetchQueries={() => [
      { query: GET_ALL_COMPETITIONS, variables:{name: name}}
    ]}
    update={this.updateCache}>
    {(createCompetition, {data, loading, error}) => {

      if(loading) return <div>loading competition...</div>
      if(error) return <div>error: {error}</div>
      let competitionId;
      if(data) {
        competitionId = data.createCompetition._id;
      }
      return (
        <Mutation
          mutation={CREATE_MATCH}
          variables={{competitionId, matchNumber, targetNumber, distanceToTarget, matchScore}}>
          {(createMatch, {_, loading, error}) => {
            if(loading) return <div>loading match...</div>
            return (
              <form 
                className="form" 
                onSubmit={event => this.handleOnSubmit (event, createCompetition, createMatch)}>
                <label>  remaining form deleted for brevity

我希望CompetitionId的值作为变量传递给在handleOnSubmit方法中调用的createMatch函数。没有提供。

共有1个答案

乐成济
2023-03-14

看来你需要的是嵌套的突变:思维脸;

问:你在使用Prisma吗?

在GraphQL中,您可以通过一个突变来创建节点,如果您的类型是相关的,这很简单,所以我假设这就是您的情况。

type Competition {
  id: ID! @unique
  name: String!
  match: Match! @relation(name: "CompetitionMatch")
}

type Match {
  id: ID! @unique
  name: String!
  campetition: Competition! @relation(name: "CompetitionMatch")
}
type Mutation {
  createCompetition (name: String! match: MatchInput): Competition
}

input MatchInput {
  name: String!
}

现在,当您调用createCompetity突变时,您必须发送匹配数据,如下所示:

mutation createCompetition (
 name: 'Loremp competition'
 match: { name: 'child match'}
) {
 id
 name
 match {
  id
  name
 }
}

参考:https://www.graph.cool/docs/reference/graphql-api/mutation-api-ol0yuoz6go/#nested-create-mutations

希望能有所帮助!

 类似资料:
  • 问题内容: 我在状态中存储了一堆信息,我需要使用变异将其传递到我的graphQL服务器,但是在调用下一个变异之前,我需要使用每个变异的结果,因为我需要: 在数据库中创建一个新对象 使用为该对象生成的ID创建另一个对象 修改原始对象以存储第二个对象生成的ID 我注意到apollo Mutation组件具有onCompleted回调,但是我不知道如何使用此回调来触发另一个突变,或者这是否是解决我的问题

  • 问题内容: 我们目前正在从Relay转移到React Apollo 2.1 ,而我正在做的事情似乎很糟糕。 上下文: 只有在通过用户身份验证(通过API密钥)的情况下,才必须渲染某些组件,因此有一个组件可以保护其余的树。 在中,它是这样使用的(显然,下面的所有片段都是最小的示例): 如果身份验证成功,将进行渲染。 在第一次渲染/安装时将身份验证突变发送到服务器,并相应地调用渲染道具。 看起来像这样

  • 我的代码有问题吗??请告诉我错误在哪里。或者也许有人可以用JavaScript解决它??

  • Apollo Client 是一个全功能的 GraphQL 客户端,用于 React 、Angular 的交互。允许你轻松通过 GraphQL 获取数据并构建 UI 组件。

  • 问题内容: 在机械化中,我们可以使用follow_link或click_link单击链接。在美丽的汤中是否有类似的事情可以单击网页上的链接? 问题答案: 是HTML 解析器 。 进一步的讨论实际上取决于您所处的具体情况以及特定网页的复杂性。 如果您需要与网页进行交互:提交表单,单击按钮,滚动等-您需要使用利用真实浏览器的工具,例如。 例如,在某些情况下,如果提交表单时不涉及任何javascript

  • 问题内容: 假设我的网页上有这些元素。 我想单击带有文本的链接。如何使用 链接文本 来识别或单击该元素,而没有任何独特的属性,例如id或class。 在.Net中,我可以使用。nightwatch.js中的等效项是什么 问题答案: 定位器在内部使用XPath。 因此,使用XPath单击示例中的第二个链接: 请注意,根据内部HTML的不同,您可能需要连接子级并修剪空格: