Проблема с объявлением функционального компонента в React

Я пытаюсь объявить функциональный компонент в React, чтобы использовать свой собственный хук для вызовов API. Я получаю rules-of-hooks, что мой хук useGet не может быть вызван внутри обратного вызова. На мой взгляд, я объявляю функциональный компонент, я должен что-то упустить?

Пример:

export const MyComponent = () => {
  const [data, setData] = useState();

  useEffect(() => {
    const { getData } = useGet("myUrl");
    setData(getData);
  }, [getData]);


  return (
     <div>{data}</div>
  );
};

Вы звоните useGet внутри useEffect, переместите useGet из useEffect.

Dave Newton 08.11.2022 17:14

Кроме того, использование хука useState в хуках useEffect создает бесконечный цикл, поэтому вам также следует избегать этого.

Ankit 08.11.2022 17:16

Хуки нельзя вызывать внутри эффекта. Это должен быть вызов верхнего уровня внутри компонента.

Mr. Polywhirl 08.11.2022 17:19
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
75
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Это правда, что хуки можно вызывать только в функциональных компонентах, но хуки также необходимо вызывать на верхнем уровне компонента. Вы пытаетесь вызвать useGet внутри useEffect, что не разрешено. Если я не ошибаюсь, вы, вероятно, можете просто переместить строку const {getData} = useGet("myUrl"); на 2 строки вверх, и она должна работать.

Кажется, что вы на самом деле вызываете свой пользовательский хук из обратного вызова, который находится внутри useEffect. Мы должны вызывать хуки реагирования на верхнем уровне функции компонента.

Может быть, лучше не использовать хук, а просто создать и импортировать функцию извлечения или вызвать API извлечения прямо из useEffect, как этот https://designcode.io/react-hooks-handbook-fetch-data-from-an-api

Вы правы, создав функциональный компонент.

Вернемся к официальной документации React и посмотрим на Rules of Hooks

Вызывать хуки только на верхнем уровне

Не вызывайте хуки внутри циклов, условий или вложенных функций. Вместо этого всегда используйте хуки на верхнем уровне вашей функции React. до любого раннего возвращения.

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

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

Вы не можете вызывать хуки внутри useEffect. Просто переместите его над вызовом вот так:

const { getData } = useGet("myUrl");

useEffect(() => {    
    setData(getData);
  }, [getData]);

Насколько я понимаю, количество хуков в вашем компоненте должно быть всегда одинаковым. Вызов некоторых в useEffect может привести к тому, что хуки иногда вызываются, а иногда нет, поскольку useEffect зависит от изменения значений переменных.

(Также, как примечание, в вашем коде в useEffect(()=>{const { getData } = useGet("myUrl");...}, [getData]) вы будете проверять изменения в переменной (getData), которая еще не объявлена. Однако это исправляется, когда вы помещаете вызов ловушки вне useEffect.)

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