Ниже приведен фрагмент ссылки на codeandbox :
// function getFetchUrl(query) {
// return "https://hn.algolia.com/api/v1/search?query=" + query;
// }
function App() {
const [reactResult, setReactResult] = useState(null);
const [reduxResult, setReduxResult] = useState(null);
function SearchResults() {
// ? Re-triggers all effects on every render
// const getFetchUrl = useCallback((query) => {
// return "https://hn.algolia.com/api/v1/search?query=" + query;
// }, []);
function getFetchUrl(query) {
return "https://hn.algolia.com/api/v1/search?query=" + query;
}
useEffect(() => {
console.log("running effect: 15");
setReactResult(getFetchUrl("react"));
// ... Fetch data and do something ...
// }, [getFetchUrl]); // ? Deps are correct but they change too often
}, [getFetchUrl]);
useEffect(() => {
console.log("running effect: 21");
setReduxResult(getFetchUrl("redux"));
// ... Fetch data and do something ...
// }, [getFetchUrl]); // ? Deps are correct but they change too often
}, [getFetchUrl]);
// ...
}
SearchResults();
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>{reactResult}</h2>
<h2>{reduxResult}</h2>
</div>
);
}
Вывод в консоли:
running effect: 15
running effect: 21
running effect: 15
running effect: 21
Я проверил this ответ, и я получаю, что функции переопределяются, что приводит к повторному запуску useEffect
(во второй раз).Но я хочу прояснить одно сомнение:
Когда useEffect
запускается во второй раз, он вызывает функции stateSetter
(что требует от React рендеринга компонента снова).
Так не должен ли приведенный выше фрагмент работать в бесконечном цикле?
Пример и базовое понимание взяты из Полное руководство по использованию эффекта