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

3.7 Browser -- useMediaQuery

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 | undefinedconst matches = ref(false)const cleanup = () => {if (!mediaQuery)returnif ('removeEventListener' in mediaQuery)mediaQuery.removeEventListener('change', update)elsemediaQuery.removeListener(update)}/*** update 是 watchEffect的回调,所以其中所有的响应式变量发生变化都会触发update的执行。matches,query* */const update = () => {if (!isSupported.value)returncleanup()// 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)elsemediaQuery.addListener(update)}watchEffect(update)// 这个方法内部调用vue3提供的一个方法onScopeDispose。当作用域销毁时,执行回调函数,也就是cleanuptryOnScopeDispose(() => cleanup())return matches
}

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数字经济GBC管理平台高管培训在京圆满成功举办
  • uniapp+vue3+setup返回上一页传参
  • 【Rust练习】11.struct
  • Python——模块和包
  • Python 实现电子邮件加密技术解析与实用代码案例
  • 火语言RPA流程组件介绍--提示/弹出/确认消息
  • mysql和pg等数据库之间的数据迁移实战分享
  • MathType常见问题汇总
  • 讲一下如何优化Android应用的启动速度
  • vulhub xxe靶机通关教程
  • PLC边缘计算网关的选择策略-天拓四方
  • 怎么使用PPT倒计时插件?这款在线PPT工具,堪称办公必备!
  • uniapp二维码生成
  • 聚道云软件连接器8月新增应用合集(4)
  • EI论文被引多少次算高引?
  • [译]前端离线指南(上)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Android框架之Volley
  • Docker容器管理
  • es6(二):字符串的扩展
  • Hexo+码云+git快速搭建免费的静态Blog
  • js中forEach回调同异步问题
  • nodejs实现webservice问题总结
  • Python3爬取英雄联盟英雄皮肤大图
  • Selenium实战教程系列(二)---元素定位
  • SpiderData 2019年2月16日 DApp数据排行榜
  • vue-loader 源码解析系列之 selector
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 将 Measurements 和 Units 应用到物理学
  • 前端之Sass/Scss实战笔记
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • Python 之网络式编程
  • raise 与 raise ... from 的区别
  • 阿里云ACE认证学习知识点梳理
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​【已解决】npm install​卡主不动的情况
  • ​queue --- 一个同步的队列类​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (003)SlickEdit Unity的补全
  • (11)MATLAB PCA+SVM 人脸识别
  • (Python第六天)文件处理
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (分布式缓存)Redis持久化
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)php投票系统 毕业设计 121500
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ****Linux下Mysql的安装和配置
  • ***监测系统的构建(chkrootkit )
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net Web项目创建比较不错的参考文章