Состояние не определено после POST-запроса

#reactjs

#reactjs

Вопрос:

Используется для создания телефонной книги CRUD. Использование JSON-сервера в качестве моей притворной базы данных.

Когда я создаю новые данные, они успешно добавляются в мою базу данных. Однако в этот момент я получаю сообщение об ошибке состояния не определено. Когда я обновляю DOM, он отображается нормально.

Моя функциональность создания выглядит следующим образом.

   const createContact = async contactObject => {
    await fetch('http://localhost:3001/phonebook', {
      method: 'POST',
      body: JSON.stringify(contactObject),
      headers: {
        'Content-type': 'application/json; charset=UTF-8',
      },
    });
  };

  const contactObject = {
    name: newName,
    number: newNumber,
    date: new Date().toISOString(),
  };

  createContact(contactObject).then(res => setPersons(persons.concat(res)));
  

Начальное состояние

   const [persons, setPersons] = useState([])

  const getAllContacts = async () => {
    const res = await fetch('http://localhost:3001/phonebook')
    const data = await res.json()
    return data
  }

  useEffect(() => {
    getAllContacts().then(response => setPersons(response))
  }, [])
  

Новые данные добавляются в мою базу данных правильно onSubmit

 {
  "phonebook": [
    {
      "name": "hello",
      "number": "111",
      "date": "2020-10-29T03:02:44.604Z",
      "id": 1
    },
    {
      "name": "world",
      "number": "222",
      "date": "2020-10-29T03:16:00.725Z",
      "id": 2
    }
  ]
}
  

Я попытался сделать так, чтобы React не отображал состояние, если оно не доступно. В моем компоненте рендеринга

 export const ContactList = ({ persons }) => {
  return persons.length ? (
    <ul>
      {persons.map(person => (
        <Contact key={person.id} person={person} />
      ))}
    </ul>
  ) : (
    <h1>Loading contacts</h1>
  );
};
  

Я думал, что это не будет пытаться перечислять людей, пока они не будут доступны, однако это все еще дает мне persons.id неопределенную ошибку.

Первый раз делаю CRUD, поэтому я не знаком с тем, как реагирует на это.

Комментарии:

1. Вы ничего не возвращаете из метода, содержащего выборку.

2. В дополнение к тому, что написал Дейв, используйте функциональные обновления при обновлении состояния, например setPersons(prev => prev.concat(res)) .

Ответ №1:

Нужно вернуть что-то из функции

  const createContact = async (contactObject) => {
    const res = await fetch('http://localhost:3001/phonebook', {
        method: 'POST',
        body: JSON.stringify(contactObject),
        headers: {
            "Content-type": "application/json; charset=UTF-8"
        }
    })
    const data = await res.json()
    return data
  

Также при обновлении состояния требуются функциональные обновления

 .then(data => setPersons(persons => persons.concat(data)))