import React, { useEffect } from "react"; import useHttp from "./hooks/use-http"; export default function App() { const getReq = async () => { const response = await fetch( "" // assume this to be a random link fetching data ); const responseData = await response.json(); return responseData; }; const { sendRequest, data } = useHttp(getReq); useEffect(() => { sendRequest(); }, []); console.log(data); return <div></div>; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
import React, { useState } from "react"; const useHttp = (getReq) => { const [data, setData] = useState([]); const sendRequest = async () => { try { const data = await getReq(); setData(data); } catch (error) {} }; return { sendRequest, data, }; }; export default useHttp;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
In the useEffect hook, if I remove sendRequest as a dependency (as done in this example), I don't get any problems and the hook only runs once.
But, if I add it as a dependency (for good practice purposes), the hook runs continuously and I get recurring console.log statements. Could someone please explain why this is happening?
But, if I add it as a dependency (for good practice purposes), the hook runs continuously and I get recurring console.log statements. Could someone please explain why this is happening?
Because sendRequest
is a function which is re created each time the component is re-rendered, hence, it is different on each render. Because of that, when it is listed as a dependency, useEffect
re-runs. Consider using useCallback
and wrapping sendRequest
using it.
Consider re-rendering of a component same as the function being re-invoked, hence you are creating all the variables or functions inside it from scratch (except cases when React takes care to retain value of your variable across re-renders; this happens with variables from state for example).
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.