介绍
VueUse 是基于 Vue 组合式 API 的实用工具函数集合库,由 Vue 核心团队成员 Anthony Fu 主导维护,提供 200+ 开箱即用的组合式函数(Composables),核心目标是复用逻辑、简化开发、避免重复造轮子。
核心定位
- 适配 Vue 3(主推)与 Vue 2.7+(兼容版),基于 Composition API 设计。
- 把浏览器 API、DOM 操作、状态管理、业务逻辑等封装为响应式函数,统一以
use开头(如useMouse、useStorage)。
核心特点
- TypeScript 优先:全量类型定义,代码提示完善,减少类型错误。
- 按需引入(Tree-shaking):仅打包用到的函数,不增加冗余体积。
- SSR 友好:多数函数兼容 Nuxt 等服务端渲染场景。
- 自动清理副作用:内部自动移除事件监听、清除定时器,避免内存泄漏。
- 灵活可配置:支持 ref 传参、自定义事件过滤器、多目标绑定。
- CDN 可用:无需打包器,直接通过 CDN 引入使用。
优点
- 大幅提升开发效率:避免重复编写监听、存储、请求等逻辑。
- 统一响应式范式:所有函数遵循 Vue 响应式设计,学习成本低。
- 轻量高性能:按需引入,自动清理副作用,不污染环境。
- 文档完善:每个函数都有在线演示与详细参数说明。
缺点
- 函数数量多:200+ 函数需要时间熟悉,易遗漏实用功能。
- 依赖 Vue 版本:Vue 2 需单独安装兼容版,部分新函数不支持 Vue 2。
- 定制化深度有限:复杂场景可能仍需原生 API 或自定义逻辑。
安装
npm安装
npm i @vueuse/core
pnpm安装
pnpm add @vueuse/core
引入方式
按需引入(推荐)
import { useMouse, useStorage } from '@vueuse/core'
全量引入(不推荐)
import * as VueUse from '@vueuse/core'
CDN 引入
<script src="https://unpkg.com/@vueuse/core"></script>
功能分类
1. 状态与响应式
useState:轻量响应式状态useStorage:本地存储(localStorage/sessionStorage)响应式绑定useGlobalState:全局状态共享useCounter:计数器(增减、重置)useToggle:布尔值切换
2. 浏览器 API
useMouse:鼠标位置、按键状态useWindowSize:窗口宽高响应式useMediaQuery:媒体查询(如暗黑模式)useClipboard:剪贴板读写useOnline:网络状态监听useDocumentVisibility:页面可见性
3. DOM 与元素
useElementSize:元素宽高监听useIntersectionObserver:交叉观察器(懒加载)useResizeObserver:元素尺寸变化useClickOutside:点击元素外部触发useFocus:元素焦点状态
4. 异步与请求
useFetch:响应式网络请求useAsyncState:异步状态管理useTimeout:定时器(自动清理)useInterval:间隔定时器
5. 动画与过渡
useTransition:数值过渡动画useSpring:弹性动画useMotion:元素运动控制
6. 表单与验证
useForm:表单状态管理useField:表单字段绑定useVModel:双向绑定简化
7. 工具类
useDebounce:防抖useThrottle:节流useClone:响应式克隆useDeepClone:深拷贝useId:生成唯一 ID
常用函数示例
1. useMouse(鼠标位置)
import { useMouse } from '@vueuse/core'
const { x, y, left, right, middle } = useMouse()
// 模板:{{ x }}, {{ y }} 实时显示鼠标坐标
2. useStorage(本地存储)
import { useStorage } from '@vueuse/core'
// 绑定 localStorage 中的 'token',默认值 ''
const token = useStorage('token', '')
token.value = 'xxx' // 自动同步到 localStorage
3. useWindowSize(窗口大小)
import { useWindowSize } from '@vueuse/core'
const { width, height } = useWindowSize()
// 窗口缩放时,width/height 自动更新
4. useClickOutside(点击外部关闭)
<template>
<div ref="target" v-if="show">弹窗</div>
</template>
<script>
import { ref } from 'vue'
import { useClickOutside } from '@vueuse/core'
export default {
setup() {
const show = ref(true)
const target = ref(null)
useClickOutside(target, () => {
show.value = false
})
return { show, target }
}
}
</script>
5. useFetch(网络请求)
import { useFetch } from '@vueuse/core'
const { data, isLoading, error } = useFetch('https://api.example.com/data').json()
// 自动请求,data 响应式,isLoading 加载状态
高级用法
1. 自定义组合式函数
基于 VueUse 封装业务逻辑:
import { useStorage, useToggle } from '@vueuse/core'
export function useTheme() {
const isDark = useStorage('dark-mode', false)
const toggleDark = useToggle(isDark)
return { isDark, toggleDark }
}
2. 配置默认选项
import { setConfig } from '@vueuse/core'
setConfig({
eventFilter: 'passive' // 全局事件过滤器
})
3. 服务端渲染(SSR)适配
多数函数自动适配 SSR,如需手动控制:
import { useWindowSize, configurableWindow } from '@vueuse/core'
// SSR 时使用模拟 window
const { width } = useWindowSize({ window: configurableWindow })
生态与扩展
- 官方插件:支持 Vue Router、Firebase、RxJS、Electron 等集成。
- Nuxt 模块:
@vueuse/nuxt一键集成到 Nuxt 项目。 - 组件库:
@vueuse/components提供封装好的组件(如<UseMouse>)。
总结
VueUse 是 Vue 生态的必备工具库,尤其适合 Vue 3 项目。它把繁琐的通用逻辑封装为简洁的响应式函数,兼顾开发效率、代码质量与性能,是中大型项目的逻辑复用首选方案。