开发者问题收集

如何使用 React Hooks 编写删除处理函数?

2021-02-07
3900

我正在使用钩子在 React 中创建一个抽认卡应用,但在删除一副抽认卡时遇到了麻烦。我能够在页面上呈现 Bootstrap 卡片,其中包含抽认卡名称、描述、卡片数量和所需的按钮。但是,我无法删除一副卡片,因为我被告知 setFlashcards 不是一个函数。这是我的代码:

App.js

function Layout() {
  const [flashcards, setFlashcards] = useState([])

  useEffect(() => {
    axios
    .get('http://localhost:5000/decks?_embed=cards')
    .then(res => {
      setFlashcards(res.data.map((questionItem, index) => {
        return {
          id: `${index}-${Date.now()}`,
          name: questionItem.name,
          description: questionItem.description,
          cards: questionItem.cards.length,
        }
      }))
    })
  }, [])

  return (
    <div>
      <Header />
      <ShowAllDecks flashcards={flashcards} setFlashcards={setFlashcards} />
      <NotFound />
    </div>
  )
}

ShowAllDecks.js

function ShowAllDecks({ flashcards, setFlashcards }) {

    return (
        <div className='container'>
            <button>Create New</button>
            {flashcards.map((flashcard) => {
                return <Deck flashcards={flashcards} flashcard={flashcard} key={flashcard.id} />
            })}
        </div>
    )
}

Deck.js

function Deck({ flashcard, flashcards, setFlashcards }) {
    const deleteHandler = () => {
        setFlashcards(flashcards.filter(el => el.id !== flashcard.id))
    }


    return (
        <div className='container'>
            <div className='card'>
                <div className='card-body'>
                    <h3 className='card-title'>{flashcard.name}</h3>
                    <p className='card-text'>{flashcard.description}</p>
                    <p className='card-text'>{flashcard.cards} cards</p>
                    <button>View</button>
                    <button>Study</button>
                    <button onClick={deleteHandler}>Delete</button>
                </div>
            </div>
        </div>
    )
}

一张卡片的卡片组示例:

[
  {
    'id': 1,
    'name': 'A Deck Name'
    'description': 'A Deck Description',
    'cards': [
      {
        'id': 1,
        'front': 'Front of card',
        'back': 'Back of card',
        'deckId': 1
      }
    ]
  }
]
1个回答

我假设您正在运行呼叫以获取 flashcardsapp.js 中,因为您要将其传递给其他组件?如果您要经常将道具钻入其他组件,也可能最好使用 上下文 。否则,如果仅用于显示所有甲板,则可以在 alldecks 组件中运行获取。无论如何,我在下面更改了您的代码,将其保存在 app.js

app.js

772518841

showaldecks.js

463063735

deck.js

714922571

Joe
2021-02-07