VueUse的使用

VueUse的使用

VueUse 是基于 Vue 3 Composition API 封装的“工具函数”集合,被社区称为“Vue 瑞士军刀”。它把项目中反复出现的逻辑(本地存储、鼠标位置、防抖节流、剪贴板、全屏、息屏检测……)全部做成“可组合函数(Composable)”,直接在 setup() 里 import 就能用,无需再自己写一堆样板代码。

一、安装与按需引入

  1. 安装核心包
npm i @vueuse/core
# 如需要音效、动画、路由等再装对应扩展包
npm i @vueuse/sound @vueuse/motion @vueuse/router
  1. 按需引入
// 只拿需要的函数
import { useMouse, useLocalStorage, useDebounceFn } from '@vueuse/core'

二、10 行代码就能跑起来的 6 个高频场景

需求关键 API最小可运行片段
1. 实时鼠标坐标useMouseconst { x, y } = useMouse() 直接绑定模板 {{ x }},{{ y }}
2. 本地存储双向绑定useStorageconst name = useStorage('uname', 'tom') 输入框 v-model="name" 刷新仍保存
3. 按钮防抖useDebounceFnconst submit = useDebounceFn(() => api(), 500) 快速点击只执行 1 次
4. 元素是否进可视区useElementVisibilityconst target = ref(); const isShow = useElementVisibility(target) 做“懒加载/埋点”利器
5. 一键复制useClipboardconst { copy, isSupported } = useClipboard() copy('文本') 自动兼容旧浏览器
6. 页面标题动态化useTitleuseTitle computed(()=> 未读${count} 条消息) 微信未读红点同款

三、进阶:组合多个函数做业务

需求:做一个“拖拽上传”区域,要求

  • 进入页面临时改标题
  • 拖拽时高亮区域
  • 松手后调接口并防抖
  • 上传结果写入本地缓存,刷新可恢复列表
<script setup>
import { ref, computed } from 'vue'
import {
  useTitle, useDropZone, useDebounceFn, useLocalStorage
} from '@vueuse/core'

// 1. 标题
useTitle(computed(() =>
  files.value.length ? `已选 ${files.value.length} 个文件` : '拖拽上传 Demo'
))

// 2. 列表 + 缓存
const files = useLocalStorage('upload-files', [])

// 3. 拖拽区域
const dropRef = ref()
const { isOverDropZone } = useDropZone(dropRef, (droppedFiles) => {
  upload(droppedFiles.map(f => f.name))
})

// 4. 防抖上传
const upload = useDebounceFn((newFiles) => {
  // 模拟接口
  files.value = [...files.value, ...newFiles]
}, 600)
</script>

<template>
  <div
    ref="dropRef"
    class="box"
    :class="{ active: isOverDropZone }"
  >
    把文件拖进来(已缓存 {{ files.length }} 个)
  </div>
</template>

<style scoped>
.box { border: 2px dashed #ccc; padding: 40px; }
.active { border-color: #42b883; background: #f0f9ff; }
</style>

上面 30 行代码即完成“标题变化 + 拖拽高亮 + 防抖上传 + 本地缓存”完整链路,无需手动 addEventListener、setTimeout、localStorage.setItem

### 如何在 Vue 项目中使用 VueUse 的 `useClipboard` 功能 #### 安装依赖 为了在 Vue 项目中使用 VueUse 提供的功能,首先需要安装 VueUse 库。可以通过 npm 或 yarn 来完成安装。 ```bash npm install @vueuse/core ``` 或者: ```bash yarn add @vueuse/core ``` #### 导入并初始化 `useClipboard` `useClipboard` 是 VueUse 中的一个组合式 API 工具函数,用于简化与剪贴板交互的操作。它封装了浏览器原生的 Clipboard API[^2],使得开发者可以轻松实现复制和粘贴功能。 以下是具体的导入方式以及基本用法示例: ```javascript import { useClipboard } from '@vueuse/core'; // 初始化 useClipboard 函数 const { copy, isSupported, text } = useClipboard(); ``` 在这里: - **copy**: 这是一个方法,用来执行复制操作。 - **isSupported**: 表明当前环境是否支持 Clipboard API。 - **text**: 当前剪贴板的内容会存储在这个响应式的变量中。 #### 基本示例代码 下面展示了一个完整的组件例子,演示如何利用 `useClipboard` 实现简单的复制到剪贴板功能。 ```vue <template> <div> <input v-model="contentToCopy" placeholder="输入要复制的文字..." /> <button @click="handleClick">点击复制</button> <!-- 显示状态 --> <p>剪贴板内容: {{ clipboardContent }}</p> <p v-if="!clipboardSupport">您的设备不支持剪贴板功能。</p> </div> </template> <script> import { ref } from 'vue'; import { useClipboard } from '@vueuse/core'; export default { setup() { const contentToCopy = ref('默认文字'); const { copy, isSupported, text } = useClipboard(); // 是否支持剪切板功能 const clipboardSupport = isSupported; // 绑定剪贴板内容至模板显示 const clipboardContent = text; const handleClick = async () => { try { await copy(contentToCopy.value); alert('已成功复制到剪贴板!'); } catch (error) { console.error(error); alert('复制失败,请重试...'); } }; return { contentToCopy, clipboardContent, clipboardSupport, handleClick, }; }, }; </script> ``` 上述代码片段展示了如何通过绑定事件监听器来触发复制行为,并实时更新页面上的反馈信息。 #### 关键点解析 1. **兼容性检测** 如果目标用户的运行环境中可能缺乏对现代 Clipboard API 的支持,则应该先判断 `isSupported` 属性再决定后续逻辑走向。 2. **错误处理机制** 考虑到实际开发场景下的不确定性因素(比如权限被拒绝等情况),应当加入必要的异常捕获流程以提升用户体验。 3. **动态数据同步** 利用了 Vue 的双向绑定特性 (`v-model`) 和响应式设计模式让界面能够及时反映出最新的变化情况。 #### 参考资料扩展阅读提示 对于希望深入理解该插件更多特性的读者来说,强烈推荐访问其官方文档链接进一步学习[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码工人笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值