首页 > 其他分享 >3.7 Browser -- useMediaQuery

3.7 Browser -- useMediaQuery

时间:2024-09-01 17:50:22浏览次数:9  
标签:const -- useMediaQuery update 查询 3.7 window mediaQuery

3.7 Browser – useMediaQuery

https://vueuse.org/core/useMediaQuery/

作用

响应式的媒体查询。一旦你创建了一个MediaQueryList对象,你就可以得到查询的结果,或者在结果变化时收到通知。

媒体查询我们一般都是用来根据窗口大小,来适配不同的UI。

比如:

@media screen and (max-width: 300px) {
    body {
        background-color:lightblue;
    }
}

官方示例

import { useMediaQuery } from '@vueuse/core'

const isLargeScreen = useMediaQuery('(min-width: 1024px)') // 窗口是否是大屏幕(最小宽度1024px)
const isPreferredDark = useMediaQuery('(prefers-color-scheme: dark)') // 窗口是否是黑暗模式

当屏幕大小变化时,isLargeScreen也会响应式改变。isPreferredDark也是同样的。

源码分析

比起如何实现,这段代码中,更重要的是知道**“媒体查询”**包括哪些?

export function useMediaQuery(query: MaybeComputedRef<string>, options: ConfigurableWindow = {}) {
  const { window = defaultWindow } = options
  
  // window.matchMedia 和 @media是等效的
  const isSupported = useSupported(() => window && 'matchMedia' in window && typeof window.matchMedia === 'function')

  let mediaQuery: MediaQueryList | undefined
  const matches = ref(false)

  const cleanup = () => {
    if (!mediaQuery)
      return
    if ('removeEventListener' in mediaQuery)
      mediaQuery.removeEventListener('change', update)
    else
      mediaQuery.removeListener(update)
  }

  /**
  * update 是 watchEffect的回调,所以其中所有的响应式变量发生变化都会触发update的执行。matches,query
  * 
  */
  const update = () => {
    if (!isSupported.value)
      return

    cleanup()
    
		// matchMedia() 返回一个新的 MediaQueryList 对象,表示指定的媒体查询字符串解析后的结果
    // 包括两个属性:1 media:查询语句的内容; 2 matches:用于检测查询结果
    mediaQuery = window!.matchMedia(resolveRef(query).value)
    matches.value = mediaQuery.matches
		
    // 根据mediaQuery支持的方法来注册监听。
    if ('addEventListener' in mediaQuery)
      mediaQuery.addEventListener('change', update)
    else
      mediaQuery.addListener(update)
  }
  watchEffect(update)

  // 这个方法内部调用vue3提供的一个方法onScopeDispose。当作用域销毁时,执行回调函数,也就是cleanup
  tryOnScopeDispose(() => cleanup())

  return matches
}

整体来看只做了两件事,监听和取消监听。

  1. 当查询对象发生变化,或者查询结果发生变化,都会重新注册。
  2. 在重新注册的时候,以及effect作用域销毁的时候,取消监听。

标签:const,--,useMediaQuery,update,查询,3.7,window,mediaQuery
From: https://blog.csdn.net/weixin_44438233/article/details/141780351

相关文章

  • 基于yolov10的学生课堂行为检测系统,支持图像检测,也支持视频和摄像实时检测(pytorch框架
       更多目标检测和图像分类识别项目可看我主页其他文章功能演示:基于yolov10的学生课堂行为检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的学生课堂行为检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码......
  • Gluon 编译 JavaFx -> android apk
    Gluon编译JavaFx->androidapk本文的内容属在linux服务器上搭建Gluon编译android-apk环境这一篇文章直接跟着官网操作一次性成功虚拟机版本centos8Architecture:x86-64开始安装相关前置工具gccversion6orhigherldversion2.26orhighersudoyumupd......
  • 手动依赖注入
    #DemoNormal\Demo.DI\Demo.DI.csproj<ProjectSdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><ImplicitUsings>enable</Imp......
  • vue axios
    axios是基于promise的http库,可以用在浏览器和node.js中特性:从浏览器中创建XMLHttpRequests、从node.js创建http请求、支持promiseApi、拦截请求和响应、取消请求、自动转换JSON数据、客户端支持防御xsrfaxios就是一个库,也可以单独独立出来发送ajax。安装: npminstallaxiosa......
  • 正点原子Linux C应用编程:移植tslib并使其适配7寸LCD1024*600的GT911触摸驱动
    正点原子LinuxC应用编程:移植tslib并使其适配7寸LCD1024*600的GT911触摸驱动作者在学习【正点原子】I.MX6U嵌入式LinuxC应用编程指南V1.4时,发现移植tslib后,触摸事件触发不正常。使用的硬件版本:正点原子I.MX6UALPHAV2.4版本底板,LCD:正点原子7寸1024*600,型号ATK-MD0700R-102460......
  • 自我介绍+软工5问
    自我介绍大家好!我叫阿依古再丽,来自美丽新疆,欢迎大家来新疆游玩。是一名大三生,现就读于计算机科学与技术专业。爱好是听音乐,打篮球,拍照,看综艺。还喜欢一些可可爱爱的猫狗,喜欢跟它们玩。软工5问1.如何学好软件工程这门课?2.软件工程的核心原则有哪些?3.软件工程到底是什么?4......
  • 自我介绍+软工5问
    自我介绍+软工5问这个作业属于哪个课程班级链接这个作业要求在哪里作业要求的链接这个作业的目标预习软件工程内容,熟悉markdown语法,git用法和博客园自我介绍我是计科1班王伊若,担任辅导员助理、计算机学院辩论队队长。我爱好广泛,喜欢摄影、阅读、观影、绘......
  • 2024年8月文章一览
    2024年8月编程人总共更新了3篇文章:1.2024年7月文章一览2.《ProgrammingfromtheGroundUp》阅读笔记:p95-p1023.《ProgrammingfromtheGroundUp》阅读笔记:p103-p1168月,对自己而言是糟糕的一个月,两个项目要赶,从月初赶到月底。一路战战兢兢,如履薄冰,好在终于赶在月底顺利完成......
  • .net程序找不到DLL最有效方式?
    原理:当程序启动加载程序集找不到时,会触发OnAssemblyResolve事件,再递归判断dll文件是否存在,如果存在则返回加载后的Assembly。不用注册全局程序集,也不用强签名,非常有效。publicApp(){LoadEnvPaths();//对引用C++有效AppDomain.CurrentDomain.AssemblyResolve+=O......
  • CLR/C++程序找不到DLL最有效方法?
     使用C++17及以上,支持filesystem处理不需要程序集强签名,也不用注册全局程序集缓存,非常有效。#include<iostream>#include<filesystem>usingnamespacestd::filesystem;namespacefs=std::filesystem;//-----------------------------------------------------......