多次反应 useState 调用给出未定义 属性

multiple react useState calls gives undefined property

我正在尝试使用 title 属性 实现一个笔记应用程序。我以前让笔记应用程序运行 w/o adding-a-title 功能,但现在我已经集成了它,但我遇到了以下问题:textarea 元素的 return(注释文本本身)未定义,而 input 元素(注释标题)的 return return 是有效标题。

我敢肯定,下面的代码是错误来源的组件 - 该组件是 AddNote

到目前为止我尝试过的:

我没试过的:

import React, { useState } from 'react';

const AddNote = ({ handleAddNote }) => {
  const [noteTitle, setNoteTitle] = useState('');
  const [noteText, setNoteText] = useState('');

  const handleSaveClick = () => {
    if ((noteText.trim().length > 0) && (noteTitle.trim().length > 0)) {
      handleAddNote(noteText);
      setNoteText('');

      handleAddNote(noteTitle);
      setNoteTitle('');
    }
  };

  return (
    <div className='note new'>
      <div className="toolbar">
        <button
          className='add-delete-icon'
          onClick={handleSaveClick}
        >+</button>
        <input
          type="text"
          className="note-title"
          placeholder="Add a title..."
          value={noteTitle}
          onChange={
            event => setNoteTitle(event.target.value)
          }
          autoFocus
        />
      </div>
      <textarea
        className="note-text"
        placeholder="Add an idea..."
        value={noteText}
        onChange={
          event => setNoteText(event.target.value)
        }
      ></textarea>
    </div>
  );
};

export default AddNote;

我是不是做错了什么,特别是使用了 useState 的多个实例,即这种“批处理”'setState' 调用的想法?或者更确切地说,问题是否属于 handleSaveClick 匿名函数?

相关组件 - 意思是指 adding-a-title- 功能的组件 - 是 Note 组件 (Pastebin), the NoteList component (Pastebin), and notable the Home component (Pastebin)。

我会说问题出在这里:

const handleSaveClick = () => {
  if ((noteText.trim().length > 0) && (noteTitle.trim().length > 0)) {
    handleAddNote(noteText);
    setNoteText('');

    handleAddNote(noteTitle);
    setNoteTitle('');
  }
};

您正在呼叫 handleAddNote() 两次。这个功能是什么样子的?

查看 code,你应该这样调用 handleAddNote

if ((noteText.trim().length > 0) && (noteTitle.trim().length > 0)) {
    handleAddNote(noteTitle, noteText);
    setNoteText('');
    setNoteTitle('');
  }

handleAddNoteHome.jsx 中的 addNote 函数。 addNotetitletext 作为参数

const addNote = (title, text) => {....}

通过您的更新,您表明您已在 Home 组件中定义了以下函数:

const addNote = (title, text) => {
  const date = new Date();
  const options = { ... };

  const newNote = {
    id: nanoid(),
    title: title, // <--- here
    text: text, // <--- here
    date: date.toLocaleDateString(undefined, options)
  };

  const newNotes = [...notes, newNote];
  setNotes(newNotes);
};

这个 addNote() 函数需要两个参数传递给它,一个 titletext 然后在你的 newNote 对象中使用(见 <--- here 上面的评论)。然后你将这个 addNote 函数作为 prop 传递给 NoteList:

<NotesList
  notes={notes}
  handleAddNote={addNote}
  handleDeleteNote={deleteNote}
/>

然后,在 NoteList 内部,您将 handleAddNote(这是对 addNote 函数的引用)传递给 AddNote:

<AddNote handleAddNote={handleAddNote} />

因此,当您在 AddNote 组件中调用 handleAddNote() 时,您正在调用 Home 中定义的 addNote() 函数,它需要在一次调用中通过了你的 titletext,如下所示:

const handleSaveClick = () => {
  if ((noteText.trim().length > 0) && (noteTitle.trim().length > 0)) {
    handleAddNote(noteTitle, noteText);
    setNoteText('');
    setNoteTitle('');
  }
};