【问题标题】:React, Graphql - how to pass variable to mutationReact,Graphql - 如何将变量传递给突变
【发布时间】:2020-05-05 05:03:36
【问题描述】:

我正在尝试在 React 中使用 Graphql 创建一个简单的 CRUD 应用程序。

我有创建和阅读,但我真的在为删除而苦苦挣扎。

我已经设置好后端,并且在 Playground 中一切正常。

在操场上我可以像删除突变一样

mutation{
    deleteRecipe(_id: "5e22e40f9f3478160a31555a"){
      _id
      name
    }
}

并得到响应

{
  "data": {
    "deleteRecipe": {
      "_id": "5e22e40f9f3478160a31555a",
      "name": "test 13"
    }
  }
}   

我在让这个突变在 React 中工作时遇到了很大的问题(在 React 中,创建和读取都在工作)

服务器端

schema.js

exports.typeDefs = `

  type Recipe{
    _id: String
    name: String
    description: String
  }

  type Query{
    recipe:[Recipe]
  }

  type Mutation{
    addRecipe(name: String!, description: String):Recipe,
    deleteRecipe(_id: String!):Recipe
  }

`

解析器.js

exports.resolvers = {

  Query: {
    recipe: async (obj, args, { Recipe }, info) => {
      const allRecipes = await Recipe.find()
      return allRecipes
    }
  },
  Mutation: {
    addRecipe: async (obj, { name, description }, { Recipe }, info) => {
      const newRecipe = await new Recipe({
        name,
        description
      }).save()
      return newRecipe
    },
    deleteRecipe: async (obj, { _id }, { Recipe }, info) => {
      const delRecipe = await Recipe.findByIdAndRemove({ _id })
      return delRecipe
    }
  }
}   

客户端

查询/index.tsx

import { gql } from 'apollo-boost';

export const GET_ALL_RECIPES = gql`
  query RecipeData{
    recipe{
      _id
      name
      description
    }
  }
`

export const ADD_RECIPE = gql`
  mutation addRecipe($name: String!, $description:String){
    addRecipe(name: $name, description: $description){
      _id
      name
      description
    }
  }
`

export const DELETE_RECIPE = gql`
  mutation deleteRecipe($id: String!){
    deleteRecipe(_id: $id){
      _id
      name
      description
    }
  }
`

App.tsx

import React, { useState } from 'react';
import './App.css';

import { RecipeData } from '../generated/RecipeData';
import { GET_ALL_RECIPES, ADD_RECIPE, DELETE_RECIPE } from '../queries';
import { useQuery, useMutation } from 'react-apollo-hooks';


const App: React.FC = () => {

  const [name, setName] = useState<string>('')
  const [description, setDes] = useState<string>('')
  const [] = useState<string>('')

  // useEffect(() => {
  //   deleteRecipe()
  // }, [recipeId])

  const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setName(e.target.value)
  }

  const handleDesChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setDes(e.target.value)
  }

  const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
    e.preventDefault()
    createRecipe()
  };

  const [deleteRecipe] = useMutation(DELETE_RECIPE)

  const handelDelete = (e: React.MouseEvent<HTMLButtonElement>) => {
    e.preventDefault()
    const delID = e.target.parentElement.getAttribute("data-id")
    deleteRecipe({ variables: { _id: delID }, refetchQueries: ['RecipeData'] });
  }

  // const [deleteRecipe, {data}] = useMutation(DELETE_RECIPE, {
  //   variables: { _id:  }, refetchQueries: ['RecipeData']
  // })

  const [createRecipe, { error }] = useMutation(ADD_RECIPE, {
    variables: { name, description }, refetchQueries: ['RecipeData']
  })
  if (error) {
    console.error('erroring : ', error)
  }

  const { data, loading } = useQuery<RecipeData | null>(GET_ALL_RECIPES, {
    suspend: false
  })

  if (loading || !data) return <div>Loading</div>

  return (
    <div className="App">
      <h1>Graphql</h1>
      <ul>
        {
          data.recipe !== null && data.recipe.map((recipe) => (
            <li key={recipe._id} data-id={recipe._id}>
              {recipe.name}
              <button onClick={handelDelete}>X</button>
            </li>
          ))
        }
      </ul>

      <form>
        <div>
          <label>Name</label>
          <input
            type="text"
            value={name}
            onChange={handleNameChange}
          />
        </div>
        <div>
          <label>Description</label>
          <input
            type="text"
            value={description}
            onChange={handleDesChange}
          />
        </div>
        <button onClick={handleClick}>Add Recipe</button>
      </form>
    </div>
  );
}

export default App;

在“网络”选项卡中出现错误

"Variable "$id" of required type "String!" was not provided.",… 

我假设我没有将 id 值传递给 deleteRecipe

如何在此处将 id 传递给 deleteRecipe

  const [deleteRecipe] = useMutation(DELETE_RECIPE)

  const handelDelete = (e: React.MouseEvent<HTMLButtonElement>) => {
    e.preventDefault()
    const delID = e.target.parentElement.getAttribute("data-id")
    deleteRecipe({ variables: { _id: delID }, refetchQueries: ['RecipeData'] });
  }

【问题讨论】:

  • 你的变量的名字是什么?您要传递给 deleteRecipevariables 对象中的名称是什么?

标签: reactjs graphql


【解决方案1】:

你的变量是id

{ variables: { id: delID }

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 2019-11-19
    • 2020-09-22
    • 2017-05-15
    • 2018-01-27
    • 2019-05-12
    • 2020-02-07
    • 2017-08-22
    • 2022-01-24
    相关资源
    最近更新 更多