当前位置:首页 > 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>
  );
}

自定义钩子封装

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

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)技术优化性能。

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事件可以实现鼠标进出检测功能。

react实现鼠标定位

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 组件分为函数组件和类组件两种形式。函数组件是现代 React 开发的主流方式,结合 Hooks 可以实现完整功能。 函数组件示例: function Gree…

react 如何运行

react 如何运行

运行 React 项目的步骤 安装 Node.js 确保系统已安装 Node.js(建议版本 16+),可通过官网下载并安装。安装后验证版本: node -v npm -v 创建 React 项目…

如何清洁react

如何清洁react

清洁 React 项目的方法 删除未使用的依赖项 运行 npm ls 或 yarn list 检查已安装的依赖项,使用 npm uninstall <package> 或 yarn rem…

react 如何操作cookie

react 如何操作cookie

安装依赖 在React项目中操作cookie通常需要第三方库的支持,推荐使用js-cookie。通过npm或yarn安装: npm install js-cookie # 或 yarn add js…

react 如何算精通

react 如何算精通

精通 React 的标准 精通 React 不仅需要掌握基础语法和核心概念,还需具备解决复杂问题、优化性能和架构设计的能力。以下是衡量 React 精通程度的关键维度: 核心概念与机制 组件化开…

如何调试react源码

如何调试react源码

调试React源码的方法 克隆React源码仓库到本地: git clone https://github.com/facebook/react.git cd react 安装依赖并构建开发版本:…