I have a registered onmousemove
event in useEffect as follows. But in order not to run the effect every time the component renders I pass it an empty array dependency. But still the function that handles the event is called. But the function is inside useEffect. How could this be possible?
import { useEffect, useState } from "react";
const UseEffect1 = () => {
const [X, setX] = useState(0);
const [Y, setY] = useState(0);
const handleMouseMove = (e) => {
setX(e.clientX);
setY(e.clientY);
};
useEffect(() => {
window.addEventListener("onmousemove", handleMouseMove);
}, []);
return (
<div>
<p>
width {X} - height {Y}
</p>
</div>
);
};
export default UseEffect1;
CodePudding user response:
The useEffect
hook is called every time the component renders.
As you have registered onmousemove
inside useEffect
, the handleMouseMove
function is called after rendering of component.
CodePudding user response:
useEffect
runs every time a dependency changes, but as you've only provided []
it will run once and create your listener.
You can also remove the listener when the component is unmounted by returning a callback function. For example
useEffect(() => {
window.addEventListener("onmousemove", handleMouseMove);
return () => {
window.removeEventListener("onmousemove", handleMouseMove);
}
}, []);