Исправить ошибку React: функции недопустимы в качестве дочерних элементов React

Я следую руководству по реагированию, добавляю запрос 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;
<select>//Blog author value = { author} — Это ваш текущий JSX? Это неверно, реквизиты (т. е.: value = {author}) необходимо указать в элементе JSX, прежде чем вы его закроете >.
Nick Parsons 14.03.2024 10:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Проблема заключается в синтаксической ошибке в следующем фрагменте кода:

<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

это не исправило, но я добавил его в другую часть моего кода. Спасибо за отличную ссылку и совет.

Felix Songwe 14.03.2024 13:30

Другие вопросы по теме