【问题标题】:Problem performing a mutations from react app从反应应用程序执行突变的问题
【发布时间】:2019-10-14 23:09:41
【问题描述】:
const ADD_TODO = gql`
  mutation AddTodo($type: String!) {
    addTodo(type: $type) {
      name
    }
  }
`;
const ADD_AUTHOR = gql`
  mutation AddAuthor($type: String!) {
    addAuthor(type: $type) {
      name
    }
  }
`;

我有上述两个突变来在我的数据库中添加数据。我正在捕获 bookval 和 authorval 变量中的突变所需的名称字段。这些变量分别传递给 AddBook 和 AddAuthor 函数

AddBook(bookval) {
    const [addBook, { data }] = useMutation(ADD_BOOK);
    addBook({ variables: { type: bookval } });
  };

  AddAuthor(authorval) {
    const [addAuthor, { data }] = useMutation(ADD_AUTHOR);
    addAuthor({ variables: { type: authorval } });
  };

这是我在表单提交上调用的函数。但是我得到了 Hooks 只能在函数组件内部调用的错误

 <form>
                <p>Book Name</p> 
                <input 
                  type='text'
                  ref={ (value) => this.book = value}
                  placeholder="enter book's name"/> 
                  <br/>
                  <p>Author Name</p>
                <input 
                  type='text'
                  ref={ (value) => this.author = value}
                  placeholder="enter author's name"/>
                  <br/>
                  <br/>
                  <button onClick={this.getValues.bind(this)}>Donate</button>
              </form>

这是我的表格

【问题讨论】:

  • 从外观上我可以看到你正在使用`this.author`所以你的组件是class component,你只能在functional component中使用钩子,你能分享更多你的代码吗?正在打电话给AddAuthorAddBook,也许我们可以帮忙。
  • 要不要直接转成函数组件?
  • 可以尝试为您的类组件使用突变组件:apollographql.com/docs/react/v2.5/essentials/mutations/…
  • 是的,这取决于要求,两者都可以工作。如果可能,转换为功能组件。如果不可能使用mutation component
  • 变异组件是否也适用于两个输入字段? (我只需要在突变组件中添加另一个输入字段吗?)

标签: reactjs graphql react-apollo apollo-client


【解决方案1】:

你可以这样做

return (
  <Mutation mutation={ADD_BOOK}>
    {(addBook, { data }) => (        
      <Mutation mutation={ADD_AUTHOR}>
        {(addAuthor, { data }) => (
          <div>
            <form
              onSubmit={e => {
                e.preventDefault();
                addBook({ variables: { type: this.book.value } });
                addAuthor({ variables: { type: this.author.value } });
                this.book.value = "";
                this.author.value = "";
              }}
            >
              <input
                ref={node => {
                  this.book = node;
                }}
              />
              <input
                ref={node => {
                  this.author = node;
                }}
              />
              <button type="submit">Add Item</button>
            </form>
          </div>
        )}
      </Mutation>
    )}
  </Mutation>
);

@note 给出的代码仅供参考。我假设您需要从单一表单中添加这两个东西。如果您需要单独添加它们,您可以将代码拆分为 2 个表单和 2 个变异组件。

如有任何疑问,请发表评论。

【讨论】:

  • 这很好,我只想添加来自单个表单的输入
  • 我们从哪里导入
  • import { Mutation } from "react-apollo" - 请同时查看此链接 [apollographql.com/docs/react/v2.5/essentials/mutations/…]
  • 我有两个表名为 books(id,name,authorId) 和 author(id,name)。我想将输入值中的数据插入这些表中。你能指导我吗
  • 哦好吧好吧。没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2021-07-19
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多