Returns an array where the first item is the mouse state from useMouseState and the second item is the object of handler setters from useMouseEvents.
It is intended as a shortcut to those hooks.
- allow to easily receive the mouse position
- takes care of adding the mouse events listeners globally or to the defined target
- takes care of cleaning the listener when the component will unmount
- allows performing abstractions on mouse related events
Provide a DOM ref as first parameter to useMouse
import { useRef, useState } from 'react';
import { useMouse } from 'beautiful-react-hooks';
const MouseReporter = () => {
const ref = useRef();
const [ showCoords, setShowCoords] = useState(false);
const [position, { onMouseEnter, onMouseLeave }] = useMouse(ref);
onMouseEnter(() => setShowCoords(true));
onMouseLeave(() => setShowCoords(false));
return (
<DisplayDemo>
<div ref={ref}>
Move mouse over me to get its current coordinates:
{showCoords && (
<p>{position.clientX}, {position.clientY}</p>
)}
</div>
</DisplayDemo>
);
};
<MouseReporter />Avoid providing any argument to useMouse
import { useState } from 'react';
import { useMouse } from 'beautiful-react-hooks';
const MouseReporter = () => {
const [showCoords, setShowCoords] = useState(false);
const [position, { onMouseDown, onMouseUp }] = useMouse();
onMouseDown(() => setShowCoords(true));
onMouseUp(() => setShowCoords(false));
return (
<DisplayDemo>
<div>
The current mouse coordinates are:
{showCoords && (
<p>
{position.clientX}, {position.clientY}
</p>
)}
</div>
</DisplayDemo>
);
};
<MouseReporter />- If in need to get the mouse current position
- If in need to abstract some mouse related logic into a custom hooks
- You can't use the returned handler setter asynchronously, it will not have any effect but changing the handler possibly leading to bugs in your code.
- Absolutely avoid using
useMousehandler setters to replace the standard mouse handler props. useMouseis meant to be used to abstract more complex hooks that need to control the mouse, for example: a drag n drop hook.- Using
useMousehandlers instead of the classic props approach it's just as bad as it sounds since you'll lose the React SyntheticEvent performance boost. - If you were doing something like the following, please keep doing it:
const MyComponent = (props) => {
const { mouseDownHandler } = props;
return (
<div onMouseDown={mouseDownHandler} />
);
};