Vue使用VueUse实现开发效率提升指南

 更新时间:2025年05月22日 08:36:15   作者:Microi风闲  
VueUse/Core 是一个基于 Composition API 的Vue实用函数集合,它提供了一系列可复用的组合式函数,涵盖了常见的开发需求,下面小编来和大家讲讲它的具体应用吧

引言

在现代前端开发中,Vue.js 因其简洁的API和响应式系统而广受欢迎。然而,在日常开发中,我们经常会遇到一些重复性的需求,如表单处理、事件监听、状态管理等。这时候,一个高质量的实用工具库可以显著提升我们的开发效率。VueUse/Core 正是这样一个为 Vue 开发者量身定制的工具集合。

什么是VueUse/Core

VueUse/Core 是一个基于 Composition API 的Vue实用函数集合,它提供了一系列可复用的组合式函数,涵盖了常见的开发需求。这个库由 Anthony Fu 创建并维护,已经成为 Vue生态 中最受欢迎的工具库之一。

官方地址:https://vueuse.nodejs.cn/

为什么选择VueUse/Core

开箱即用的实用功能:无需重复造轮子,直接使用经过社区验证的解决方案

完美的Composition API集成:专为Vue 3设计,同时也支持Vue 2.7+

极小的体积:Tree-shakable 设计,只打包你使用的函数

优秀的TypeScript支持:完整的类型定义,提升开发体验

活跃的社区:持续更新,不断添加新功能

核心功能详解

1. 状态管理

VueUse 提供了多种状态管理方案,比 Vuex 或 Pinia 更轻量,适合简单场景。

import { useStorage } from '@vueuse/core'

// 自动持久化到localStorage
const count = useStorage('my-count', 0)

useStorage 会自动将状态同步到 localStorage 或 sessionStorage ,实现持久化状态。

2. 元素操作

import { useMouse, useElementVisibility } from '@vueuse/core'

const { x, y } = useMouse() // 跟踪鼠标位置

const isVisible = useElementVisibility(refElement) // 元素是否可见

3. 实用工具函数

import { useDebounceFn, useThrottleFn } from '@vueuse/core'

const debouncedFn = useDebounceFn(() => {
  // 防抖逻辑
}, 500)

const throttledFn = useThrottleFn(() => {
  // 节流逻辑
}, 500)

4. 浏览器API封装

import { useClipboard, usePreferredDark } from '@vueuse/core'

​​​​​​​const { copy, isSupported } = useClipboard()

const isDark = usePreferredDark() // 检测用户是否偏好暗色主题

5. 传感器相关

import { useDeviceMotion, useBattery } from '@vueuse/core'

const motion = useDeviceMotion() // 设备运动传感器
const battery = useBattery() // 电池状态

实战示例:构建一个拖拽上传组件

让我们通过一个实际例子来展示 VueUse 的强大功能。

<template>
  <div 
    ref="dropZoneRef"
    :class="{ 'active': isOverDropZone }"
    @click="openFileDialog"
  >
    <input 
      type="file" 
      ref="inputRef"
      style="display: none" 
      @change="handleFileChange"
    />
    <p>拖拽文件到这里或点击上传</p>
    <div v-if="files.length">
      <div v-for="file in files" :key="file.name">
        {{ file.name }} ({{ formatFileSize(file.size) }})
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { 
  useDropZone,
  useFileDialog,
  useFileSystemAccess,
  useObjectUrl
} from '@vueuse/core'

const dropZoneRef = ref(null)
const inputRef = ref(null)
const files = ref([])

const { isOverDropZone } = useDropZone(dropZoneRef, (files) => {
  handleFiles(files)
})

const { open, onChange } = useFileDialog({
  accept: 'image/*',
  multiple: true
})

onChange((files) => {
  handleFiles(files)
})

function handleFiles(newFiles) {
  files.value = [...files.value, ...newFiles]
}

function formatFileSize(bytes) {
  if (bytes === 0) return '0 Bytes'
  const k = 1024
  const sizes = ['Bytes', 'KB', 'MB', 'GB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

function openFileDialog() {
  open()
}
</script>

<style scoped>
.active {
  border: 2px dashed #42b983;
  background-color: rgba(66, 185, 131, 0.1);
}
</style>

这个示例展示了如何使用多个 VueUse 函数快速构建一个功能丰富的拖拽上传组件。

性能优化技巧

按需导入:VueUse支持 Tree-shaking ,只导入你需要的函数

import { useDebounceFn } from '@vueuse/core' // 正确
import VueUse from '@vueuse/core' // 避免这样导入

合理使用防抖和节流:对于频繁触发的事件,使用 useDebounceFn 或useThrottleFn

及时清理副作用:VueUse 会自动清理大部分副作用,但对于自定义监听器,记得在 onUnmounted 中清理

利用共享状态:对于全局状态,考虑使用 createSharedComposable 创建共享实例

与原生实现对比

让我们比较一下原生实现和使用 VueUse 的实现差异:

原生实现鼠标跟踪:

import { ref, onMounted, onUnmounted } from 'vue'

const x = ref(0)
const y = ref(0)

function update(e) {
  x.value = e.pageX
  y.value = e.pageY
}

onMounted(() => {
  window.addEventListener('mousemove', update)
})

onUnmounted(() => {
  window.removeEventListener('mousemove', update)
})

使用 VueUse:

import { useMouse } from '@vueuse/core'

​​​​​​​const { x, y } = useMouse()

显然,VueUse 版本更简洁,且不需要手动管理事件监听器的生命周期。

常见问题解答

Q: VueUse适合生产环境吗?

A: 是的,VueUse 已经在许多生产环境中使用,并且有良好的测试覆盖率。

Q: VueUse会增加多少打包体积?

A: 由于 Tree-shaking 支持,你只打包你使用的函数。单个函数通常只有几KB。

Q: 如何贡献自己的函数?

A: VueUse是开源项目,欢迎通过 GitHub 提交PR。确保你的函数有良好的TypeScript支持和测试用例。

总结

VueUse/Core 是一个强大而灵活的 Vue 工具库,它通过提供一系列精心设计的组合式函数,极大地提升了 Vue 开发的效率和体验。无论你是需要处理常见的UI交互,还是需要访问浏览器API,VueUse 都能提供简洁优雅的解决方案。

以上就是Vue使用VueUse实现开发效率提升指南的详细内容,更多关于Vue VueUse使用的资料请关注脚本之家其它相关文章!

相关文章

  • Vue + element 实现多选框组并保存已选id集合的示例代码

    Vue + element 实现多选框组并保存已选id集合的示例代码

    这篇文章主要介绍了Vue + element 实现多选框组并保存已选id集合,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 一文搞懂Vue3中的异步组件defineAsyncComponentAPI的用法

    一文搞懂Vue3中的异步组件defineAsyncComponentAPI的用法

    这篇文章主要介绍了一文搞懂Vue3中的异步组件,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 前端请求超时截断axios timeout设置未生效情况解决记录

    前端请求超时截断axios timeout设置未生效情况解决记录

    在项目中遇到了后台接口返回数据慢的时候往往需要设置请求失效时间,在项目中遇到设置timeout失效问题由此记录下来,这篇文章主要给大家介绍了前端请求超时截断axios timeout设置未生效情况解决的相关资料,需要的朋友可以参考下
    2024-07-07
  • vue实现图片转pdf的示例代码

    vue实现图片转pdf的示例代码

    这篇文章主要为大家详细介绍了vue实现图片转pdf的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以跟随小编一起了解一下
    2023-08-08
  • vue EventSource使用及配置请求头、webpack代理配置教程

    vue EventSource使用及配置请求头、webpack代理配置教程

    EventSourcePolyfill是EventSource封装的一个方法,可以配置请求头,安装依赖后,不需要加请求头时直接使用,需要加请求头时可以自定义请求头,基于webpack的vue项目,需要配置代理以解决跨域问题,设置devServer的compress属性为false以实时收到EventSource的消息
    2025-12-12
  • vue实现监听localstorage值变化

    vue实现监听localstorage值变化

    这篇文章主要介绍了vue实现监听localstorage值变化,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Vuecli3配置代理及遇到的问题解决

    Vuecli3配置代理及遇到的问题解决

    这篇文章主要为大家介绍了Vuecli3配置代理及遇到的问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • vue中的slot-scope及scope.row用法

    vue中的slot-scope及scope.row用法

    这篇文章主要介绍了vue中的slot-scope及scope.row用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • vue如何实现点击选中取消切换

    vue如何实现点击选中取消切换

    这篇文章主要介绍了vue实现点击选中取消切换,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue父组件异步如何获取数据传给子组件

    vue父组件异步如何获取数据传给子组件

    这篇文章主要介绍了vue父组件异步如何获取数据传给子组件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论