Linguine Code

Get current element with onMouseOver or onMouseEnter in React

Are you trying to figure out how to get the current element when a user hovers over it?

Great! I want to go over a couple methods that you can approach to solve this problem.

Method #1: React useRef

I recommend using React useRef if you’re targeting single elements.

Here’s an example of what that would look like:


const App = () => {
  const boxRef = React.useRef(null);

  const handleMouseEnter = () => {
    console.log(boxRef);
  };

  return (
    <div
      style={{ width: 200, height: 200, backgroundColor: 'red' }}
      ref={boxRef}
      onMouseEnter={handleMouseEnter}>
      Hover over me
    </div>
  );
};

If you’re interested in learning how to use React useRef with TypeScript, check out this article, “How to use React useRef with TypeScript“.

But what if you have an array of elements? Do you create a React useRef hook for each element the array?

Nope. Another appropriate method is to use the event object that comes with the event listener.

Method #2: Event object

In this example I’m going to use the React onMouseOver event.

This method may also apply to React onMouseEnter as well.


const cats = [
  {name: "Mr. Whiskers", color: 'black'},
  {name: "Sassy", color: 'white'},
  {name: "Smokey", color: 'gray'},
];

const App = () => {

  const handleMouseOver = (event) => {
    console.log(JSON.parse(event.target.dataset.info));
  };

  return (
    <>
    {cats.map((cat, i) => (
      <div
        key={i}
        data-info={JSON.stringify(cat)}
        style={{ width: 200, height: 200, backgroundColor: 'red', margin: 8, display: 'inline-block' }}
        onMouseOver={handleMouseOver}>
          {cat.name}
        </div>
    ))}
    </>
  );
};

In the code example above, I’m going over an array of cat objects.

Each cat object has a name, and the color of the cat.

In the JSX section, I’m iterating over each object in the array, and embedding the cat information into a data attribute called data-info.

The objective of this code example is to grab the current element that was hovered on, and console.log() the data attribute that was added to the div.

To achieve this, I attached an event handler called, handleMouseOver(), onto the onMouseOver event for each div directive.

The event function handler provides us an object called event.

I will use the event object and drill through the object tree to log the data attribute data-info.


const handleMouseOver = (event) => {
  console.log(JSON.parse(event.target.dataset.info));
};

The output looks like this:


Object {name: "Mr. Whiskers", color: "black"}
Object {name: "Sassy", color: "white"}
Object {name: "Smokey", color: "gray"}