当前位置:首页 > React

react实现鼠标定位

2026-01-27 14:47:40React

实现鼠标位置追踪

在React中获取鼠标位置可以通过监听mousemove事件实现。需要创建一个状态来存储坐标,并在组件挂载时添加事件监听器。

import React, { useState, useEffect } from 'react';

function MouseTracker() {
  const [position, setPosition] = useState({ x: 0, y: 0 });

  useEffect(() => {
    const handleMouseMove = (e) => {
      setPosition({ x: e.clientX, y: e.clientY });
    };

    window.addEventListener('mousemove', handleMouseMove);
    return () => {
      window.removeEventListener('mousemove', handleMouseMove);
    };
  }, []);

  return (
    <div>
      <p>X: {position.x}, Y: {position.y}</p>
    </div>
  );
}

自定义钩子封装

将鼠标追踪逻辑封装成自定义钩子可以提高代码复用性。创建一个返回鼠标位置的钩子。

react实现鼠标定位

function useMousePosition() {
  const [position, setPosition] = useState({ x: 0, y: 0 });

  useEffect(() => {
    const updatePosition = (e) => {
      setPosition({ x: e.clientX, y: e.clientY });
    };

    window.addEventListener('mousemove', updatePosition);
    return () => window.removeEventListener('mousemove', updatePosition);
  }, []);

  return position;
}

// 使用示例
function App() {
  const { x, y } = useMousePosition();
  return <div>Mouse X: {x}, Y: {y}</div>;
}

性能优化版本

对于高频触发的事件,可以使用防抖(debounce)或节流(throttle)技术优化性能。

react实现鼠标定位

function useDebouncedMousePosition(delay = 100) {
  const [position, setPosition] = useState({ x: 0, y: 0 });
  const timerRef = useRef();

  useEffect(() => {
    const updatePosition = (e) => {
      clearTimeout(timerRef.current);
      timerRef.current = setTimeout(() => {
        setPosition({ x: e.clientX, y: e.clientY });
      }, delay);
    };

    window.addEventListener('mousemove', updatePosition);
    return () => {
      clearTimeout(timerRef.current);
      window.removeEventListener('mousemove', updatePosition);
    };
  }, [delay]);

  return position;
}

元素相对位置计算

如果需要获取鼠标相对于某个元素的坐标,可以使用getBoundingClientRect()方法。

function ElementMouseTracker() {
  const [position, setPosition] = useState({ x: 0, y: 0 });
  const elementRef = useRef();

  useEffect(() => {
    const handleMouseMove = (e) => {
      const rect = elementRef.current.getBoundingClientRect();
      setPosition({
        x: e.clientX - rect.left,
        y: e.clientY - rect.top
      });
    };

    const element = elementRef.current;
    element.addEventListener('mousemove', handleMouseMove);

    return () => {
      element.removeEventListener('mousemove', handleMouseMove);
    };
  }, []);

  return (
    <div ref={elementRef} style={{ width: '300px', height: '300px', border: '1px solid black' }}>
      <p>Relative X: {position.x}, Y: {position.y}</p>
    </div>
  );
}

鼠标进入/离开检测

结合mouseentermouseleave事件可以实现鼠标进出检测功能。

function HoverTracker() {
  const [isHovering, setIsHovering] = useState(false);

  return (
    <div
      onMouseEnter={() => setIsHovering(true)}
      onMouseLeave={() => setIsHovering(false)}
      style={{ padding: '20px', backgroundColor: isHovering ? 'lightblue' : 'white' }}
    >
      {isHovering ? 'Mouse is inside' : 'Mouse is outside'}
    </div>
  );
}

标签: 鼠标react
分享给朋友:

相关文章

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: node…

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高:基于 JavaScript 和 React 语法,可同时开发 iOS 和 Android 应用,减少重复代码量。性能接近原生:通过原生组件渲染,性能…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…

如何优化react

如何优化react

优化 React 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

react 如何分页

react 如何分页

分页实现方法 在React中实现分页功能可以通过多种方式完成,具体取决于数据来源(如API或本地数据)和UI库的选择。以下是常见的实现方法: 使用本地数据分页 对于存储在组件状态或Context中…

react如何查

react如何查

React 查询方法 React 提供了多种查询 DOM 元素的方式,以下是几种常见的方法: 使用 ref 通过 useRef 钩子可以获取 DOM 节点的引用,适用于直接操作 DOM 的场景。…