I've been learning React and I read that the function returned from useEffect is meant to do cleanup and React performs the cleanup when the component unmounts.
So I experimented with it a bit but found in the following example that the function was called every time the component re-renders as opposed to only the time it got unmounted from the DOM, i.e. it console.log("unmount"); every time the component re-renders.
Why is that?
function Something({ setShow }) { const [array, setArray] = useState([]); const myRef = useRef(null); useEffect(() => { const id = setInterval(() => { setArray(array.concat("hello")); }, 3000); myRef.current = id; return () => { console.log("unmount"); clearInterval(myRef.current); }; }, [array]); const unmount = () => { setShow(false); }; return ( <div> {array.map((item, index) => { return ( <p key={index}> {Array(index + 1) .fill(item) .join("")} </p> ); })} <button onClick={() => unmount()}>close</button> </div> ); } function App() { const [show, setShow] = useState(true); return show ? <Something setShow={setShow} /> : null; } Live example: https://codesandbox.io/s/vigilant-leavitt-z1jd2