npx skills add https://github.com/onmax/nuxt-skills --skill vueuseVue 组合式 API 实用工具集合。在编写自定义组合式函数之前,请先查看 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 模块会自动导入组合式函数 - 无需手动导入。
| 分类 | 示例 |
|---|---|
| 状态管理 | useLocalStorage, useSessionStorage, useRefHistory |
| 元素操作 | useElementSize, useIntersectionObserver, useResizeObserver |
| 浏览器 API | useClipboard, useFullscreen, useMediaQuery |
| 传感器 | useMouse, useKeyboard, useDeviceOrientation |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 网络 | useFetch, useWebSocket, useEventSource |
| 动画 | useTransition, useInterval, useTimeout |
| 组件 | useVModel, useVirtualList, useTemplateRefsList |
| 监听器 | watchDebounced, watchThrottled, watchOnce |
| 响应式 | createSharedComposable, toRef, toReactive |
| 数组 | useArrayFilter, useArrayMap, useSorted |
| 时间 | useDateFormat, useNow, useTimeAgo |
| 实用工具 | useDebounce, useThrottle, useMemoize |
根据您的需求加载组合式函数文件:
| 正在处理... | 加载文件 |
|---|---|
| 查找组合式函数 | references/composables.md |
| 特定组合式函数 | composables/<name>.md |
根据您的任务考虑加载以下参考文件:
请勿一次性加载所有文件。 仅加载与您当前任务相关的内容。
状态持久化:
const state = useLocalStorage('my-key', { count: 0 })
鼠标跟踪:
const { x, y } = useMouse()
防抖引用:
const search = ref('')
const debouncedSearch = refDebounced(search, 300)
共享组合式函数(单例):
const useSharedMouse = createSharedComposable(useMouse)
许多 VueUse 组合式函数使用在 SSR 期间不可用的浏览器 API。
使用isClient检查:
import { isClient } from '@vueuse/core'
if (isClient) {
// 仅限浏览器的代码
const { width } = useWindowSize()
}
在 onMounted 中包装:
const width = ref(0)
onMounted(() => {
// 仅在浏览器中运行
const { width: w } = useWindowSize()
width.value = w.value
})
使用 SSR 安全的组合式函数:
// 这些函数在内部检查 isClient
const mouse = useMouse() // 在服务器上返回 {x: 0, y: 0}
const storage = useLocalStorage('key', 'default') // 在服务器上使用默认值
@vueuse/nuxt 自动处理 SSR - 组合式函数在服务器上返回安全的默认值。
当目标是组件引用而非 DOM 元素时:
import type { MaybeElementRef } from '@vueuse/core'
// 组件引用需要 .$el 来获取 DOM 元素
const compRef = ref<ComponentInstance>()
const { width } = useElementSize(compRef) // ❌ 无法工作
// 使用 MaybeElementRef 模式
import { unrefElement } from '@vueuse/core'
const el = computed(() => unrefElement(compRef)) // 获取 .$el
const { width } = useElementSize(el) // ✅ 正常工作
或者直接访问$el:
const compRef = ref<ComponentInstance>()
onMounted(() => {
const el = compRef.value?.$el as HTMLElement
const { width } = useElementSize(el)
})
每周安装量
1.6K
代码仓库
GitHub 星标数
606
首次出现
2026年1月20日
安全审计
安装于
opencode1.1K
github-copilot1.1K
gemini-cli1.1K
codex1.1K
cursor981
claude-code849
Collection of essential Vue Composition utilities. Check VueUse before writing custom composables - most patterns already implemented.
Current stable: VueUse 14.x for 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 module auto-imports composables - no import needed.
| Category | Examples |
|---|---|
| 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 |
Load composable files based on what you need:
| Working on... | Load file |
|---|---|
| Finding a composable | references/composables.md |
| Specific composable | composables/<name>.md |
Consider loading these reference files based on your task:
DO NOT load all files at once. Load only what's relevant to your current task.
State persistence:
const state = useLocalStorage('my-key', { count: 0 })
Mouse tracking:
const { x, y } = useMouse()
Debounced ref:
const search = ref('')
const debouncedSearch = refDebounced(search, 300)
Shared composable (singleton):
const useSharedMouse = createSharedComposable(useMouse)
Many VueUse composables use browser APIs unavailable during SSR.
Check withisClient:
import { isClient } from '@vueuse/core'
if (isClient) {
// Browser-only code
const { width } = useWindowSize()
}
Wrap in onMounted:
const width = ref(0)
onMounted(() => {
// Only runs in browser
const { width: w } = useWindowSize()
width.value = w.value
})
Use SSR-safe composables:
// These check isClient internally
const mouse = useMouse() // Returns {x: 0, y: 0} on server
const storage = useLocalStorage('key', 'default') // Uses default on server
@vueuse/nuxt auto-handles SSR - composables return safe defaults on server.
When targeting component refs instead of DOM elements:
import type { MaybeElementRef } from '@vueuse/core'
// Component ref needs .$el to get DOM element
const compRef = ref<ComponentInstance>()
const { width } = useElementSize(compRef) // ❌ Won't work
// Use MaybeElementRef pattern
import { unrefElement } from '@vueuse/core'
const el = computed(() => unrefElement(compRef)) // Gets .$el
const { width } = useElementSize(el) // ✅ Works
Or access$el directly:
const compRef = ref<ComponentInstance>()
onMounted(() => {
const el = compRef.value?.$el as HTMLElement
const { width } = useElementSize(el)
})
Weekly Installs
1.6K
Repository
GitHub Stars
606
First Seen
Jan 20, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
opencode1.1K
github-copilot1.1K
gemini-cli1.1K
codex1.1K
cursor981
claude-code849
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
102,200 周安装