SuperAPI AI 工具集

vueuse

前端与建站

查看项目

更新于 10-16 14:50

技能介绍

用途

VueUse 是 Vue Composition API 的核心实用工具集合。在编写自定义 composable 之前建议先查阅 VueUse,因为大多数常见模式已经实现。当前稳定版本为 VueUse 14.x,适用于 Vue 3.5+。

安装

Vue 3 项目:

pnpm add @vueuse/core

Nuxt 项目:

pnpm add @vueuse/nuxt @vueuse/core
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@vueuse/nuxt'],
})

Nuxt 模块会自动导入 composables,无需手动 import。

主要能力(分类与示例)

  • State(状态):useLocalStorage、useSessionStorage、useRefHistory
  • Elements(元素):useElementSize、useIntersectionObserver、useResizeObserver
  • Browser(浏览器):useClipboard、useFullscreen、useMediaQuery
  • Sensors(传感器):useMouse、useKeyboard、useDeviceOrientation
  • Network(网络):useFetch、useWebSocket、useEventSource
  • Animation(动画):useTransition、useInterval、useTimeout
  • Component(组件):useVModel、useVirtualList、useTemplateRefsList
  • Watch(侦听):watchDebounced、watchThrottled、watchOnce
  • Reactivity(响应式):createSharedComposable、toRef、toReactive
  • Array(数组):useArrayFilter、useArrayMap、useSorted
  • Time(时间):useDateFormat、useNow、useTimeAgo
  • Utilities(工具):useDebounce、useThrottle、useMemoize

使用方式

按需加载 composable 参考文件:查找 composable 时加载 references/composables.md;查看具体 composable 时加载 composables/<name>.md。不要一次性加载全部文件,只加载与当前任务相关的内容。

常见模式

状态持久化:

const state = useLocalStorage('my-key', { count: 0 })

鼠标追踪:

const { x, y } = useMouse()

防抖 ref:

const search = ref('')
const debouncedSearch = refDebounced(search, 300)

共享 composable(单例):

const useSharedMouse = createSharedComposable(useMouse)

目标元素引用

当目标是组件 ref 而非 DOM 元素时:

import type { MaybeElementRef } from '@vueuse/core'

// 组件 ref 需要 .$el 才能拿到 DOM 元素
const compRef = ref<ComponentInstance>()
const { width } = useElementSize(compRef) // ❌ Won't work

// 使用 MaybeElementRef 模式
import { unrefElement } from '@vueuse/core'

const el = computed(() => unrefElement(compRef)) // Gets .$el
const { width } = useElementSize(el) // ✅ Works

或直接访问 $el:

const compRef = ref<ComponentInstance>()

onMounted(() => {
  const el = compRef.value?.$el as HTMLElement
  const { width } = useElementSize(el)
})

适用场景

Vue 3 与 Nuxt 项目中,需要快速接入鼠标/键盘/设备方向等传感器、本地或会话存储状态、剪贴板与全屏等浏览器能力、WebSocket 与 EventSource 等网络通信、防抖节流与共享单例等通用逻辑时,可直接使用对应 composable,避免重复造轮子。

限制(SSR 注意事项)

许多 VueUse composable 使用了 SSR 期间不可用的浏览器 API。可通过 isClient 判断:

import { isClient } from '@vueuse/core'

if (isClient) {
  // Browser-only code
  const { width } = useWindowSize()
}

或包裹在 onMounted 中:

const width = ref(0)

onMounted(() => {
  // Only runs in browser
  const { width: w } = useWindowSize()
  width.value = w.value
})

也可使用本身 SSR 安全的 composable:

// 这些内部会检查 isClient
const mouse = useMouse() // Returns {x: 0, y: 0} on server
const storage = useLocalStorage('key', 'default') // Uses default on server

@vueuse/nuxt 会自动处理 SSR,composable 在服务端返回安全默认值。

暂未提供

关于该工具的收费、价格方案与具体平台支持范围,当前资料未提供。