Ваш дочерний компонент выполняет рендеринг повторно, но он использует старые данные из предыдущего рендеринга. Это происходит потому, что вы не передаете url
как зависимость в useEffect
hook. И лучше будет переместить функцию fetchUrl
внутрь useEffect
(если вы не хотите использовать ее в других местах), потому что теперь eslint
выдает ошибку:
В React Hook useEffect отсутствует зависимость: 'fetchUrl'. Либо включите его, либо удалите массив зависимостей. (Реагирует-крючки / исчерпывающий DEPS)
Вот как это должно выглядеть:
function useFetch(url) {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function fetchUrl() {
const response = await fetch(url);
const json = await response.json();
setData(json);
setLoading(false);
}
fetchUrl();
}, [url]);
return [data, loading];
}
«И я не знаю, почему, когда я впервые захожу на динамическую страницу, console.log (url) сработал 3 раза?»
Это происходит потому, что ваш компонент перерисовывается 3 раза:
Когда он монтируется.
Когда ваш хук звонит setData(json)
.
- Когда ваш хук звонит
setLoading(false)
.
Вот рабочий пример: https://codesandbox.io/embed/condescending-wildflower-v8m4c