vueuse
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseVueUse
VueUse
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组合式API实用工具集合。在编写自定义组合式函数前先查看VueUse——大多数模式都已实现。
当前稳定版本: VueUse 14.x 适用于 Vue 3.5+
Installation
安装
Vue 3:
bash
pnpm add @vueuse/coreNuxt:
bash
pnpm add @vueuse/nuxt @vueuse/corets
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@vueuse/nuxt'],
})Nuxt module auto-imports composables - no import needed.
Vue 3:
bash
pnpm add @vueuse/coreNuxt:
bash
pnpm add @vueuse/nuxt @vueuse/corets
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@vueuse/nuxt'],
})Nuxt模块会自动导入组合式函数——无需手动导入。
Categories
分类
| 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 |
| 分类 | 示例 |
|---|---|
| 状态管理 | useLocalStorage, useSessionStorage, useRefHistory |
| 元素操作 | useElementSize, useIntersectionObserver, useResizeObserver |
| 浏览器API | useClipboard, useFullscreen, useMediaQuery |
| 传感器 | useMouse, useKeyboard, useDeviceOrientation |
| 网络操作 | useFetch, useWebSocket, useEventSource |
| 动画 | useTransition, useInterval, useTimeout |
| 组件相关 | useVModel, useVirtualList, useTemplateRefsList |
| 监听工具 | watchDebounced, watchThrottled, watchOnce |
| 响应式处理 | createSharedComposable, toRef, toReactive |
| 数组操作 | useArrayFilter, useArrayMap, useSorted |
| 时间处理 | useDateFormat, useNow, useTimeAgo |
| 通用工具 | useDebounce, useThrottle, useMemoize |
Quick Reference
快速参考
Load composable files based on what you need:
| Working on... | Load file |
|---|---|
| Finding a composable | references/composables.md |
| Specific composable | |
根据需求加载组合式函数相关文件:
| 正在进行... | 加载文件 |
|---|---|
| 查找组合式函数 | references/composables.md |
| 特定组合式函数详情 | |
Loading Files
文件加载建议
Consider loading these reference files based on your task:
- references/composables.md - if searching for VueUse composables by category or functionality
DO NOT load all files at once. Load only what's relevant to your current task.
根据你的任务考虑加载以下参考文件:
- references/composables.md - 若按分类或功能搜索VueUse组合式函数
请勿一次性加载所有文件。 仅加载与当前任务相关的文件。
Common Patterns
常见使用模式
State persistence:
ts
const state = useLocalStorage('my-key', { count: 0 })Mouse tracking:
ts
const { x, y } = useMouse()Debounced ref:
ts
const search = ref('')
const debouncedSearch = refDebounced(search, 300)Shared composable (singleton):
ts
const useSharedMouse = createSharedComposable(useMouse)状态持久化:
ts
const state = useLocalStorage('my-key', { count: 0 })鼠标追踪:
ts
const { x, y } = useMouse()防抖响应式变量:
ts
const search = ref('')
const debouncedSearch = refDebounced(search, 300)共享组合式函数(单例):
ts
const useSharedMouse = createSharedComposable(useMouse)SSR Gotchas
SSR注意事项
Many VueUse composables use browser APIs unavailable during SSR.
Check with :
isClientts
import { isClient } from '@vueuse/core'
if (isClient) {
// Browser-only code
const { width } = useWindowSize()
}Wrap in onMounted:
ts
const width = ref(0)
onMounted(() => {
// Only runs in browser
const { width: w } = useWindowSize()
width.value = w.value
})Use SSR-safe composables:
ts
// 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许多VueUse组合式函数使用了SSR期间不可用的浏览器API。
使用检查:
isClientts
import { isClient } from '@vueuse/core'
if (isClient) {
// 仅在浏览器中运行的代码
const { width } = useWindowSize()
}包裹在onMounted中:
ts
const width = ref(0)
onMounted(() => {
// 仅在浏览器中运行
const { width: w } = useWindowSize()
width.value = w.value
})使用支持SSR的组合式函数:
ts
// 这些函数内部会自动检查isClient
const mouse = useMouse() // 在服务端返回{x: 0, y: 0}
const storage = useLocalStorage('key', 'default') // 在服务端使用默认值@vueuse/nuxtTarget Element Refs
目标元素引用
When targeting component refs instead of DOM elements:
ts
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) // ✅ WorksOr access directly:
$elts
const compRef = ref<ComponentInstance>()
onMounted(() => {
const el = compRef.value?.$el as HTMLElement
const { width } = useElementSize(el)
})当目标是组件引用而非DOM元素时:
ts
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) // ✅ 可以正常工作或者直接访问:
$elts
const compRef = ref<ComponentInstance>()
onMounted(() => {
const el = compRef.value?.$el as HTMLElement
const { width } = useElementSize(el)
})