当前位置:首页 > 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如何迭代

react如何迭代

在 React 中迭代数组或对象 React 提供了多种方式来处理数组或对象的迭代,以下是常见的方法: 使用 map 方法迭代数组 map 是 JavaScript 数组的内置方法,常用于在 Rea…

react如何引入echarts

react如何引入echarts

安装 ECharts 依赖 在 React 项目中安装 ECharts 核心库和 React 封装库: npm install echarts echarts-for-react 基础引入方式 创建…

如何升级react native

如何升级react native

升级 React Native 的步骤 检查当前版本 运行以下命令查看当前项目的 React Native 版本: react-native --version 更新 React Native CL…

如何搭建react项目

如何搭建react项目

使用 Create React App 搭建项目 Create React App (CRA) 是官方推荐的快速搭建 React 项目的工具,无需配置构建工具(如 Webpack 或 Babel)。…

react如何上传文件

react如何上传文件

使用React上传文件的方法 使用HTML的input元素和FormData 创建一个文件输入字段,通过onChange事件获取文件对象,使用FormData将文件数据发送到服务器。 import…

react如何下载包

react如何下载包

使用 npm 安装 React 包 在项目目录下运行以下命令,通过 npm 安装 React 核心库和 React DOM: npm install react react-dom 使用 yarn…