Vue3使用hook封装媒体查询和事件监听的代码示例

 更新时间:2023年07月04日 09:54:43   作者:萌萌哒草头将军  
这篇文章主要给大家详细介绍Vue3如何使用hook封装媒体查询和事件监听,使得Vue的开发更加丝滑,文中通过代码示例给大家介绍的非常详细,感兴趣的同学跟着小编一起来学习吧

js中媒体查询的主要方法是使用window对象下的matchMedia对象,查询语句和CSS媒体查询一样。

封装媒体查询

首先我们先看监听系统主题色的例子

  • 首先创建媒体查询对象
  • 根据查询结果设置对应的值
  • 然后建立监听事件,并且在退出时取消监听
export const useTheme = () => {
  // 首先创建媒体查询对象
  const themeMedia = matchMedia("(prefers-color-scheme: light)")
  // 根据查询结果设置对应的值
  const theme = ref(themeMedia.matches ? 'light' : 'dark')
  const onChange = (e: MediaQueryListEvent) => theme.value = e.matches ? 'light' : 'dark'
  watchEffect((onCleanup) => {
    //  然后建立监听事件
    themeMedia.addEventListener('change', onChange)
    // 并且在退出时取消监听
    onCleanup(() => themeMedia.removeEventListener('change', onChange))
  })
  return theme;
}

我们测试下

const theme = useTheme()
watchEffect(() => console.log(theme.value, 'theme'))

如果我们其他查询查询,我们需要重新设置新的值,所以,接下来我们封装一个更通用的媒体查询hook,如下,

export const useMatchMedia = (query: string) => {
  const themeMedia = matchMedia(query)
  const match = ref(themeMedia.matches)
  const onChange = (e: MediaQueryListEvent) => match.value = e.matches
  watchEffect((onCleanup) => {
    themeMedia.addEventListener('change', onChange)
    onCleanup(() => themeMedia.removeEventListener('change', onChange))
  })
  return match
}

这个例子里,我们不再对特定的媒体查询值做处理,同时,我们将查询语句作为动态变量,将结果处理交给开发者。

我们使用通用的hook重写监听系统主题色的hook,如下:

export const useTheme = () => {
  const theme = useMatchMedia("(prefers-color-scheme: light)")
  const theme = ref(themeMedia.matches ? 'light' : 'dark')
  return theme  ? 'light' : 'dark'
}

是不是这样更简洁了。

封装事件监听

接下来,我们再看第二个简单的例子,监听网络状态。

监听网络状态,主要通过监听navigator.onLine的变化,值的变化可以通过addEventListener方法,

有了封装媒体查询的例子,我们首先会想到封装事件监听的值的变化可以通过addEventListener方法,成为一个通用的钩子函数。如下:

export const useEventListener = <K extends keyof WindowEventMap>(
  target: K,
  listener: (ev: WindowEventMap[K]) => any
) => {
  watchEffect((onCleanup) => {
    addEventListener(target, listener)
    onCleanup(() => removeEventListener(target, listener))
  })
}

此时,我们就可以这样封装监听网络状态的hook了

export const useNetWork = () => {
  const isOnLine = ref(navigator.onLine)
  const setOnLine = () => isOnLine.value = true
  const setOffLine = () => isOnLine.value = false
  useEventListener('online', setOnLine)
  useEventListener('offline', setOffLine)
  return isOnLine
}

我们测试下

const isOnLine = useNetWork()
watchEffect(() => console.log(isOnLine.value, 'isOnLine'))
<h1 v-if="isOnLine">onLine</h1>
<h1 v-else>offLine</h1>

接下来我们测试下其他的监听事件,比如监听scroll事件。

useEventListener('scroll', () => console.log('scroll'))

功能是正常的,但是顺理成章,我们还需要写一个防抖函数

export const debounce = (
  fn: (...args: any[]) => void,
  delay: number
) => {
  let timer: NodeJS.Timeout
  return  (...args: any[]) => {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, delay)
  }
}
useEventListener('scroll', debounce(() => console.log('scroll'), 200))

好了今天的分享到这了,如果文章中有纰漏的地方欢迎指正,我及时修改,感谢你的阅读

以上就是Vue3使用hook封装媒体查询和事件监听的代码示例的详细内容,更多关于Vue3 hook封装媒体查询和事件监听的资料请关注脚本之家其它相关文章!

相关文章

  • vue3使用Electron打包成exe的方法与打包报错解决

    vue3使用Electron打包成exe的方法与打包报错解决

    在前端开发中,Electron是一种常用的工具,它允许开发者使用Web技术构建桌面应用程序,本文主要介绍了vue3使用Electron打包成exe的方法与打包报错解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • axios前端访问后端携带cookie的代码实例

    axios前端访问后端携带cookie的代码实例

    当用户在网站登录后,服务器会在其浏览器上设置一个包含登录信息的Cookie,通过这个Cookie,服务器能够识别用户是否已登录,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • 详解vue中axios的封装

    详解vue中axios的封装

    这篇文章大家分享了vue中axios的封装的相关知识点以及实例代码,有兴趣的朋友参考学习下。
    2018-07-07
  • Element Plus修改表格行和单元格样式详解

    Element Plus修改表格行和单元格样式详解

    在使用Element Plus中的table组件展示数据时,由于需要对表格行内数据的数据进行修改,下面这篇文章主要给大家介绍了关于Element Plus修改表格行和单元格样式的相关资料,需要的朋友可以参考下
    2022-04-04
  • 在Vue mounted方法中使用data变量详解

    在Vue mounted方法中使用data变量详解

    今天小编就为大家分享一篇在Vue mounted方法中使用data变量详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • ant-desigin-vue中form表单的使用解读

    ant-desigin-vue中form表单的使用解读

    这篇文章主要介绍了ant-desigin-vue中form表单的使用解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 利用Vue3和element-plus实现图片上传组件

    利用Vue3和element-plus实现图片上传组件

    element-plus提供了uploader组件,但是不好定制化。所以本文将利用Vue3和element-plus实现一个图片上传的组件,感兴趣的可以了解一下
    2022-03-03
  • 使用el-checkbox-group选中后值为true和false遇到的坑

    使用el-checkbox-group选中后值为true和false遇到的坑

    这篇文章主要介绍了使用el-checkbox-group选中后值为true和false遇到的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • undefined是否会变为null原理解析

    undefined是否会变为null原理解析

    这篇文章主要为大家介绍了undefined是否会变为null原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 解析vue data不可以使用箭头函数问题

    解析vue data不可以使用箭头函数问题

    这篇文章主要介绍了vue data不可以使用箭头函数问题,本文通过源码解析给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07

最新评论