当前位置: 首页 > article >正文

4.6 Sensors -- useMouse

4.6 Sensors – useMouse

https://vueuse.org/core/useMouse/

作用

响应式地返回鼠标位置

官方示例

import { useMouse } from '@vueuse/core'

const { x, y, sourceType } = useMouse()

参数type可以传入page、client、movement,分别代表:

  1. page:表示鼠标事件在页面上的 X 和 Y 坐标位置,它们包括了页面的滚动偏移。
  2. client:表示鼠标事件在视口中的 X 和 Y 坐标位置,它们不包括页面的滚动偏移
  3. movement:这两个属性表示自上一个鼠标事件以来鼠标在视口中的水平(X)和垂直(Y)移动量。
  • 无渲染组件代码如下:
<template>
  <UseMouse v-slot="{ x, y }">
    x: {{ x }}
    y: {{ y }}
  </UseMouse>
</template>

源码分析

主要逻辑是注册 mousemove、dragover、touchstart、touchmove、touchend事件,在移动中修改坐标值。

touch比较特殊,只有按下时才开始监听,且触摸点很多的话,只取第一个,主要是移动设备。

export function useMouse(options: UseMouseOptions = {}) {
  const {
    type = 'page',
    touch = true,
    resetOnTouchEnds = false, // touchEnd 时默认不清空数据
    initialValue = { x: 0, y: 0 },
    window = defaultWindow,
    eventFilter,
  } = options

  const x = ref(initialValue.x)
  const y = ref(initialValue.y)
  const sourceType = ref<MouseSourceType>(null)

  const mouseHandler = (event: MouseEvent) => {
    if (type === 'page') {
      x.value = event.pageX
      y.value = event.pageY
    }
    else if (type === 'client') {
      x.value = event.clientX
      y.value = event.clientY
    }
    else if (type === 'movement') {
      x.value = event.movementX
      y.value = event.movementY
    }
    sourceType.value = 'mouse'
  }
  const reset = () => {
    x.value = initialValue.x
    y.value = initialValue.y
  }
  
  const touchHandler = (event: TouchEvent) => {
    // 只有按下的时候才修改坐标,且以第一个接触点为准
    if (event.touches.length > 0) {
      const touch = event.touches[0]
      if (type === 'page') {
        x.value = touch.pageX
        y.value = touch.pageY
      }
      else if (type === 'client') {
        x.value = touch.clientX
        y.value = touch.clientY
      }
      sourceType.value = 'touch'
    }
  }

  const mouseHandlerWrapper = (event: MouseEvent) => {
    return eventFilter === undefined ? mouseHandler(event) : eventFilter(() => mouseHandler(event), {} as any)
  }

  const touchHandlerWrapper = (event: TouchEvent) => {
    return eventFilter === undefined ? touchHandler(event) : eventFilter(() => touchHandler(event), {} as any)
  }

  if (window) {
    useEventListener(window, 'mousemove', mouseHandlerWrapper, { passive: true })
    useEventListener(window, 'dragover', mouseHandlerWrapper, { passive: true })
    if (touch && type !== 'movement') {
      useEventListener(window, 'touchstart', touchHandlerWrapper, { passive: true })
      useEventListener(window, 'touchmove', touchHandlerWrapper, { passive: true })
      if (resetOnTouchEnds)
        useEventListener(window, 'touchend', reset, { passive: true })
    }
  }

  return {
    x,
    y,
    sourceType,
  }
}

http://www.kler.cn/a/293947.html

相关文章:

  • 4.4 软件设计:UML顺序图
  • 探索Pillow库:Python图像处理的瑞士军刀
  • 力扣515:在每个树行中找最大值
  • 32位、64位、x86与x64:深入解析计算机架构
  • GaussDB部署架构
  • 【C++】C++11特性(上)
  • EmguCV学习笔记 C# 10.2 人脸识别 FaceRecgnizer类
  • 太速科技-基于Kintex-7 XC7K325T的FMC USB3.0四路光纤数据转发卡
  • 解决MongoDB创建用户报错command createUser requires authentication
  • 结合AI图片增强、去背景,如何更好的恢复旧照片老照片?
  • 一台电脑对应一个IP地址吗?‌探讨两台电脑共用IP的可能性
  • Oracle数据库使用和维护的技巧与经验
  • Elasticsearch文档值
  • 浅谈Servlet
  • Java Web —— 扩展(Maven高级)
  • Elasticsearch 基本语法使用
  • C++20中lambda表达式新增加支持的features
  • halcon图像怎么显示在我们指定的区域
  • 【项目二】C++高性能服务器开发——日志系统(各种适配器)
  • Svn常用操作技巧详细说明
  • iptables防火墙的通俗理解,和k8s中的iptables策略使用
  • 数据结构基础之《(3)—二分法》
  • mysql高级sql
  • RAG与LLM原理及实践(14)---RAG Python 前端构建技术Flask
  • 『功能项目』Unity连接读取本地数据库【28】
  • Xcode打包出现错误Command PhaseScriptExecution failed with a nonzero exit code