Я следую руководству по реагированию, добавляю запрос POST и столкнулся со следующей ошибкой:
Функции недопустимы в качестве дочерних элементов React. Это может произойти, если вы возвращаете компонент вместо рендеринга. Или, может быть, вы хотели вызвать эту функцию, а не вернуть ее.
До этого я смотрел события отправки, и все было хорошо. Веб-сайт все еще работает, но я получаю сообщение fetch aborted, когда проверяю консоль.
Я знаю, что у них уже много подобных ошибок при переполнении стека, и я рассмотрел несколько из них. Я видел много проблем и решений, некоторые понял. Но ни один из них не соответствует тому, что я пытаюсь сделать. Примечание. Я новичок в реагировании, это мое первое веб-приложение. Ошибка появилась только после добавления моего POST-запроса.
Create.js
import { useState } from "react";
const Create = () => {
const [title, setTitle] = useState('');
const [body, setBody] = useState('');
const [author, setAuthor] = useState('mario');
const [isLoading, setIsLoading] = useState(false);
//Submit events
const handleSubmit = (e) => {
e.preventDefault();
const blog = { title, body, author };
setIsLoading(true);
//POST request
fetch("http://localhost:8000/blogs", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(blog),
}).then(() => {
console.info("new blog added");
setIsLoading(false);
})
}
return (
<div className = "create">
<h2>Add a new blog</h2>
//Input form
<form onSubmit = { handleSubmit } >
<label>Blog title</label>
<input
type = "text"
required
value = { title }
onChange = {(e) => setTitle(e.target.value)}
/>
<label>Blog body</label>
<textarea
required
value = { body }
onChange = {(e) => setBody(e.target.value)}
></textarea>
<label>Blog author</label>
//Blog author
<select>
value = { author}
onChange = {(e) => setAuthor(e.target.value)}
<option value = "mario">Mario</option>
<option value = "yoshi">Yoshi</option>
</select>
</form>
//Button
{ !isLoading && <button>Add blog</button> }
{ isLoading && <button disabled>Adding blog...</button> }
<p>{ title }</p>
<p>{ body }</p>
<p>{ author }</p>
</div>
);
}
export default Create;



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема заключается в синтаксической ошибке в следующем фрагменте кода:
<select> // Blog author value = { author} onChange = {(e) => setAuthor(e.target.value)}
Это должно быть:
<label>Blog author</label>
<select
value = {author}
onChange = {(e) => setAuthor(e.target.value)}
>
узнайте о формах, если ваша форма должна быть в статусе отправки, кнопка отправки типа должна быть обернута формой
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Добавьте Catch к вашей выборке, и это позволит зарегистрировать ошибку, которая, по-видимому, происходит во время выборки.
fetch("http://localhost:8000/blogs", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(blog),
}).then(() => {
console.info("new blog added");
setIsLoading(false);
}).catch((error) => {console.info(error)});
}
Помимо этого, вы можете улучшить читаемость кода кнопки добавления, изменив его на следующее:
{ isLoading ? <button disabled>Adding blog</button> : <button>Add blog</button>}
Когда вы проверяете, является ли загрузка истинной или ложной, вы можете просто изменить ее на встроенный оператор if-else. Документация по этому поводу: https://legacy.reactjs.org/docs/conditional-rendering.html#inline-if-else-with-conditional-operator
это не исправило, но я добавил его в другую часть моего кода. Спасибо за отличную ссылку и совет.
<select>//Blog author value = { author}— Это ваш текущий JSX? Это неверно, реквизиты (т. е.:value = {author}) необходимо указать в элементе JSX, прежде чем вы его закроете>.