Поскольку вы объявляете функцию getData
внутри компонента React, она будет воссоздана при каждом рендеринге, и, следовательно, зависимости вашего эффекта меняются при каждом рендере. Это причина, по которой эффект выполняется на каждом рендере.
Чтобы предотвратить это, вы должны объявить функцию getData
вне компонента, а затем передать запрос. Вот так:
function getData(query) {
return fetch(`https://jsonplaceholder.typicode.com/${query}`)
.then(response => response.json());
}
function YouComponent({ query }) {
...
useEffect(() => {
getData(query).then(setData);
console.log("useEffect ran...");
}, [query]);
...
P.S: Я не уверен, будет ли плагин eslint автоматически добавлять getData к зависимостям при этом, но даже если это так, это не повредит.