React, приложение Graphql CRUD - удалить мутацию удаляет первым в списке - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь создать простую демонстрацию CRUD в React с использованием Graphql.

У меня работает бэкэнд, у меня есть команды create и read.

Я выводлю список Имена рецептов и поле ввода для добавления в список.

У каждого рецепта в списке есть кнопка удаления для удаления этого рецепта.

У меня работает удаление, но вместо удаления рецепта щелчок по нему всегда удаляет первый рецепт в списке.

Правильный идентификатор передается на удаление мутации, но на вкладках сети отображается идентификатор первого рецепта в списке.

Может кто-нибудь увидит, что я делаю не так.

Схема на стороне сервера

. js

exports.typeDefs = `

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

  type Query{
    recipe:[Recipe]
  }

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

`

resolvers. 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 recipe = await Recipe.findOneAndRemove({ id })
      return recipe
    }
  }
}

клиент

запросы / 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: ID!){
    deleteRecipe(_id: $id){
      _id
      name
      description
    }
  }
`

App.tsx

import React, { useState, useEffect } 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 [recipeId, setRecipeId] = useState<string>('')

  useEffect(() => {
    deleteRecipe()
    console.log('recipeId = ', recipeId)
  }, [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 handelDelete = (e: React.MouseEvent<HTMLButtonElement>) => {
    setRecipeId(e.target.parentElement.getAttribute("data-id"))
  }

  const [deleteRecipe] = useMutation(DELETE_RECIPE, {
    variables: { id: recipeId }, 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, i) => (
            <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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...