哈喽兄弟们,我是大布布将军!
咱们的 Vue 3 系列连续剧更新到现在,装备库已经很豪华了:
- 引擎:Vue 3(响应式核心)
- 燃料:Pinia(状态管理)
- 涡轮增压:Vite(极速构建)
看起来是不是已经无敌了?但在实际干活的时候,你是不是还在手撸这些代码:
- 监听个窗口大小变化,还得写
addEventListener和removeEventListener? - 搞个“点击复制到剪贴板”,还得去搜一下
document.execCommand怎么用? - 老板让你加个“夜间模式”,你看着满屏的 CSS 变量和 LocalStorage 读写逻辑陷入沉思?
兄弟,时代变了!能躺着绝不站着,能调库绝手写。
今天咱们介绍的这位大神——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()
完了?对,完了。 你就直接用 x 和 y,它们就是响应式的 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(服务端渲染) ,让你的网站被百度/谷歌秒收录的?
咱们下期见!