4.4 Sensors -- useDevicePixelRatio

4.4 Sensors – useDevicePixelRatio

https://vueuse.org/core/useDevicePixelRatio/

作用

动态追踪devicePixelRatio的变化。

window.devicePixelRatio = 物理像素/ 设备独立像素。

没有可以监听 window.devicePixelRatio 变化的事件监听器。因此,函数以编程方式,使用媒体查询(window.matchMedia)来实现。

官方示例

import { useDevicePixelRatio } from '@vueuse/core'

export default {
  setup() {
    const { pixelRatio } = useDevicePixelRatio()

    return { pixelRatio }
  },
}
  • 无渲染组件代码如下:
<template>
  <UseDevicePixelRatio v-slot="{ pixelRatio }">
    Pixel Ratio: {{ pixelRatio }}
  </UseDevicePixelRatio>
</template>

源码分析

一般情况下,我们不需要监听pixelRatio的变化。

export function useDevicePixelRatio({
  window = defaultWindow,
}: ConfigurableWindow = {}) {
  if (!window) {
    return {
      pixelRatio: ref(1),
    }
  }

  const pixelRatio = ref(1)

  const cleanups: Fn[] = []

  const cleanup = () => {
    cleanups.map(i => i())
    cleanups.length = 0
  }

  const observe = () => {
    pixelRatio.value = window.devicePixelRatio
    cleanup()
    /**
    * window.matchMedia 查询一个媒体查询字符串,并返回一个MediaQueryList对象,表示媒体查询的结果。
    * resolution是一个媒体特性,用于查询设备的分辨率
    * pixelRatio.value 当前设备的像素比
    
    * media = {
    * 	matches: true,
    *		media: "(resolution: 1dppx)"
    *		onchange: null
    * }
    */
    const media = window.matchMedia(`(resolution: ${pixelRatio.value}dppx)`)
    // once 表示只监听一次,因为触发了observe会重新注册
    media.addEventListener('change', observe, { once: true })
    cleanups.push(() => {
      media.removeEventListener('change', observe)
    })
  }

  observe()
  tryOnScopeDispose(cleanup)

  return { pixelRatio }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值