🧰 拒绝“造轮子”!VueUse:Vue 3 时代的“瑞士军刀”,用过就回不去了

84 阅读4分钟

哈喽兄弟们,我是大布布将军

咱们的 Vue 3 系列连续剧更新到现在,装备库已经很豪华了:

  • 引擎:Vue 3(响应式核心)
  • 燃料:Pinia(状态管理)
  • 涡轮增压:Vite(极速构建)

看起来是不是已经无敌了?但在实际干活的时候,你是不是还在手撸这些代码:

  • 监听个窗口大小变化,还得写 addEventListenerremoveEventListener
  • 搞个“点击复制到剪贴板”,还得去搜一下 document.execCommand 怎么用?
  • 老板让你加个“夜间模式”,你看着满屏的 CSS 变量和 LocalStorage 读写逻辑陷入沉思?

兄弟,时代变了!能躺着绝不站着,能调库绝手写。

d315af46ly1hijajfjkhij20sg0sbaeq(1).jpg

今天咱们介绍的这位大神——VueUse,号称 "Vue 3 时代的 Lodash" 。它就像是多啦A梦的百宝袋,里面装了几百个写好的组合式函数(Composables)

有了它,上面那些功能,统统一行代码搞定。不信?咱们来验验货!


一、起手式:哪里不会点哪里

先来个最经典的例子。如果要获取鼠标在页面上的实时坐标,普通写法你得怎么写?

痛苦的手撸版:

JavaScript

const x = ref(0)
const y = ref(0)

const update = (e) => {
  x.value = e.pageX
  y.value = e.pageY
}

onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
// 还没完,还要担心组件销毁时没解绑导致的内存泄漏...

VueUse 快乐版:

JavaScript

import { useMouse } from '@vueuse/core'

const { x, y } = useMouse()

完了?对,完了。 你就直接用 xy,它们就是响应式的 ref。组件销毁时,VueUse 会自动帮你把事件监听器清理得干干净净。这不比你自己写得满头大汗香吗?


二、装X利器:一键“夜间模式”

现在是个网站都流行搞个 Dark Mode(深色模式)。如果要自己实现,你得判断系统偏好、读写 LocalStorage、给 html 标签加 class... 逻辑稍微有点绕。

用 VueUse 的 useDark,简直简单到令人发指:

JavaScript

import { useDark, useToggle } from '@vueuse/core'

// 1. 这一行代码做了什么?
// - 自动检测系统是否是深色模式
// - 自动从 LocalStorage 读取/保存设置
// - 自动给 html 标签添加 'dark' 类名
const isDark = useDark()

// 2. 这一行代码生成一个切换开关函数
const toggleDark = useToggle(isDark)

在模板里直接用:

HTML

<button @click="toggleDark()">
  {{ isDark ? '关灯' : '开灯' }}
</button>

只要你的 CSS 写好了 .dark 下的样式,这就完事了!从今往后,老板再让我加夜间模式,我报价 3 天,实际开发 3 分钟,剩下的时间...咳咳,用来学习!


三、浏览器 API 驯兽师

浏览器原生提供了很多强大的 API,比如全屏、剪贴板、地理位置、摄像头等,但那个原生语法吧,有时候真的一言难尽。VueUse 把它们全封装成了响应式的。

1. 全屏切换 (useFullscreen)

想让某个 div 全屏?

JavaScript

import { useFullscreen } from '@vueuse/core'
const el = ref(null) // 绑定到你的 div 上

const { isFullscreen, toggle } = useFullscreen(el)

点一下 toggle(),全屏了;再点一下,回来了。

2. 剪贴板复制 (useClipboard)

这可是后台管理系统的高频需求:“点击复制订单号”。

JavaScript

import { useClipboard } from '@vueuse/core'

const { text, copy, isSupported } = useClipboard()

<button @click="copy(orderNum)">复制订单号</button>

连“当前浏览器是否支持复制”这个 isSupported 状态都给你备好了,贴心不?


四、不仅是工具,更是“最佳实践”

VueUse 里的宝贝远不止这些。它有 200+ 个函数,覆盖了:

  • Sensors: 监听滚动、视口变化、设备方向...
  • State: 封装 LocalStorage (useStorage),让 storage 像普通变量一样读写。
  • Network: 封装 fetch (useFetch),自动处理 loading 和 error 状态。
  • Utilities: 防抖、节流、时间格式化...

为什么我强烈推荐你用 VueUse? 不仅仅是因为偷懒。更是因为 VueUse 的作者(Anthony Fu 大神)和社区维护者们,把 Vue 3 Composition API 的最佳实践都写进去了。

  • 自动清理副作用(不用怕内存泄漏)。
  • 极其完善的 TypeScript 类型支持。
  • 兼容 SSR(服务端渲染)。

你自己手写的 useEffect,很可能在边界情况(比如组件快速卸载)下报错,但 VueUse 早就替你踩过这些坑了。


总结

如果说 Vue 3 是你的屠龙刀,那 VueUse 就是你的瑞士军刀。 屠龙刀用来砍大怪(构建核心业务),瑞士军刀用来解决那些繁琐、重复、细碎的日常需求。

记住大将军的一句话: 在写任何通用的逻辑之前,先去 VueUse 文档 搜一下。 大概率,那里已经有一个写得比你更好、更稳的函数在等你了。


👋 互动时间: 你在项目里用过 VueUse 里的哪个函数觉得最“真香”?或者你有没有自己封装过什么好用的 Hooks?来评论区秀一下!

下期预告: 全家桶齐了,工具库也有了。但是!咱们现在的应用还是个 SPA(单页应用) ,SEO(搜索引擎优化)极差,且首屏加载可能慢。 如果你想做一个官网、博客或者电商平台,光靠 Vue 3 就不够了。 下一期,咱们来聊聊 Nuxt 3 —— 它是如何让 Vue 支持 SSR(服务端渲染) ,让你的网站被百度/谷歌秒收录的?

咱们下期见!

lg_90841_1619336946_60851ef204362.png