React-Apollo-Hooks 使用Mutation 传递空变量?

Posted

技术标签:

【中文标题】React-Apollo-Hooks 使用Mutation 传递空变量?【英文标题】:React-Apollo-Hooks useMutation passing empty variables? 【发布时间】:2020-06-21 18:54:01 【问题描述】:

我正在尝试创建 addBook 突变,但是当我提交表单并调用突变时,会创建一本书,其中包含空字符串作为名称、流派和作者 ID。

我可以在 GraphiQL 中运行突变并且它可以正常工作,所以我认为这意味着问题出在组件中。

我不知道出了什么问题?


变异:

const addBookMutation = gql`
    mutation 
        addBook(name: "", genre: "", authorID: "") 
            id
            name
        
    
`;

组件:

import React,  useState  from 'react';
import  useQuery, useMutation  from '@apollo/react-hooks';
import  getAuthorsQuery, addBookMutation  from '../queries/queries';

export default function AddBook() 
    const  loading, error, data  = useQuery(getAuthorsQuery);

    const [name, setName] = useState('');
    const [genre, setGenre] = useState('');
    const [authorID, setAuthorID] = useState('');

    const [addBook,  data: bookData ] = useMutation(addBookMutation);
    let authors = [];

    if (error) return <p>Error :(</p>;
    if (data) 
        authors = data.authors;
    

    return (
        <div>
            <form
                className="bg-blue-900 p-4 flex flex-1 flex-wrap"
                onSubmit=e => 
                    e.preventDefault();
                    addBook(
                        bookData:  name, genre, authorID ,
                    );
                
            >
                <label className="font-semibold text-gray-100">Book Name</label>
                <input
                    type="text"
                    className="py-1 px-2 rounded border mx-2"
                    onChange=e => setName(e.target.value)
                />

                <label className="font-semibold text-gray-100">Genre</label>
                <input
                    type="text"
                    className="py-1 px-2 rounded border mx-2"
                    onChange=e => setGenre(e.target.value)
                />

                <label className="font-semibold text-gray-100">Author</label>
                <select
                    className="py-1 px-2 rounded border mx-2"
                    onChange=e => setAuthorID(e.target.value)
                >
                    loading ? <option>Loading authors...</option> : ''
                    <option defaultValue>Select Author</option>
                    authors.map(author => (
                        <option key=author.id value=author.id>
                            author.name
                        </option>
                    ))
                </select>
                <button
                    type="submit"
                    className="bg-gray-200 text-gray-900 font-semibold py-1 px-2 rounded"
                >
                    Add Book
                </button>
            </form>
        </div>
    );

【问题讨论】:

我已阅读文档并尝试以几种不同的方式连接突变。我仍然很困惑,这就是我在这里寻求帮助的原因。 好的,我会添加一个答案,但我看到的是你没有声明也没有将变量传递给突变 【参考方案1】:

首先将变量声明添加到突变中

const addBookMutation = gql`
    mutation AddBook($name: String!, $genre: String!, $authorID: String!)
        addBook(name: $name, genre: $genre, authorID: $authorID) 
            id
            name
        
    
`;

然后按照声明将变量传递给突变

...
e.preventDefault();
addBook(
  variables:  name, genre, authorID ,
);
...

【讨论】:

以上是关于React-Apollo-Hooks 使用Mutation 传递空变量?的主要内容,如果未能解决你的问题,请参考以下文章

使用`react-apollo-hooks`和`useSubscription`钩子时如何避免“自动更新”缓存

React-Apollo-Hooks 使用Mutation 传递空变量?

react-apollo-hooks 中的 useMutation 没有传递变量

将参数传递给 react-apollo-hooks useQuery

仅在第一次以惯用方式和优雅方式呈现组件时执行 react-apollo-hooks useQuery

UseApolloClient 查询不会返回 fetchMore