I want to build a hook that changes the width of an element on mousemove
and mousedown
events.
I'm using the following code (that is actually working):
import React, { useState, useCallback, useEffect, useRef } from "https://cdn.skypack.dev/react";
import ReactDOM from "https://cdn.skypack.dev/react-dom";
const useMouseDelta = (initialWidth) => {
const [dragging, setDragging] = useState(false);
const [result, setResult] = useState(initialWidth);
const origin = useRef(initialWidth);
const handleMouseDown = useCallback((e) => {
origin.current = e.clientX;
setDragging(true);
}, []);
const handleMouseUp = useCallback((e) => {
setDragging(false);
}, []);
const handleMouseMove = useCallback((e) => {
if (!dragging) {
return;
}
setResult(result + (e.clientX - origin.current));
},
[dragging]
);
useEffect(() => {
window.addEventListener('mousedown', handleMouseDown);
window.addEventListener('mouseup', handleMouseUp);
window.addEventListener('mousemove', handleMouseMove);
return () => {
window.removeEventListener('mousedown', handleMouseDown);
window.removeEventListener('mouseup', handleMouseUp);
window.removeEventListener('mousemove', handleMouseMove);
};
}, [dragging]);
return result;
};
const Test = () => {
const width = useMouseDelta(400);
return (
<div className="container" style=>
<div className="resize"></div>
</div>
)
}
ReactDOM.render(<Test />, document.getElementById('root'));
However, I'm seeing this warning in ESLint:
React Hook useCallback has a missing dependency: 'result'. Either include it or remove the dependency array. You can also do a functional update 'setResult(r => ...)' if you only need 'result' in the 'setResult' call
So I change it to:
setResult(r => r + (e.clientX - origin.current));
Now the drag is not working as desired anymore.
An example can be found here: CodePen example
from Change width on mousedown and mousemove in React
No comments:
Post a Comment