当前位置: 首页 > news >正文

Vue3 + 组合式 API + 完整可运行 的 3 个超级常用通用 Hooks:useRequest、useClipboard、useStorage

1. useRequest —— 统一管理接口请求(最常用)

功能:

  • 自动管理 data /loading/error
  • 支持手动 / 自动执行
  • 支持传参
  • 支持异步函数
// src/hooks/useRequest.ts import { ref, onMounted } from 'vue' export function useRequest<T = any>( apiFn: (...args: any[]) => Promise<T>, options = { immediate: true } ) { const data = ref<T | null>(null) const loading = ref(false) const error = ref<Error | null>(null) const run = async (...args: any[]) => { loading.value = true error.value = null try { const res = await apiFn(...args) data.value = res return res } catch (err) { error.value = err as Error console.error('请求失败:', err) } finally { loading.value = false } } // 立即执行 if (options.immediate) { onMounted(() => run()) } return { data, loading, error, run } }
<script setup lang="ts"> import { useRequest } from '@/hooks/useRequest' // 模拟接口 const getList = () => fetch('/api/list').then(res => res.json()) const { data, loading, error, run } = useRequest(getList) </script> <template> <div v-if="loading">加载中...</div> <div v-else-if="error">请求失败:{{ error.message }}</div> <div v-else>数据:{{ data }}</div> <button @click="run">刷新</button> </template>

2. useClipboard —— 复制到剪贴板

功能:

  • 复制文本
  • 自动提示复制成功状态
  • 兼容所有现代浏览器
// src/hooks/useClipboard.ts import { ref } from 'vue' export function useClipboard() { const copied = ref(false) const copy = async (text: string) => { try { await navigator.clipboard.writeText(text) copied.value = true setTimeout(() => (copied.value = false), 1500) } catch (err) { console.error('复制失败', err) } } return { copy, copied } }
<script setup> import { useClipboard } from '@/hooks/useClipboard' const { copy, copied } = useClipboard() </script> <template> <button @click="copy('我是要复制的内容')"> {{ copied ? '复制成功' : '点击复制' }} </button> </template>

3. useStorage —— 本地存储(localStorage /sessionStorage)

功能:

  • 自动 JSON 序列化 / 反序列化
  • 响应式
  • 支持 localStorage /sessionStorage
  • 支持删除
// src/hooks/useStorage.ts import { ref, watch } from 'vue' type StorageType = 'local' | 'session' export function useStorage<T>( key: string, defaultValue: T, type: StorageType = 'local' ) { const storage = type === 'local' ? localStorage : sessionStorage // 初始化 const read = () => { try { const item = storage.getItem(key) return item ? JSON.parse(item) : defaultValue } catch { return defaultValue } } const data = ref<T>(read()) // 监听变化自动保存 watch( data, (val) => { storage.setItem(key, JSON.stringify(val)) }, { deep: true } ) // 删除 const remove = () => { storage.removeItem(key) data.value = defaultValue } return { data, remove } }
<script setup> import { useStorage } from '@/hooks/useStorage' // 存 localStorage const { data: userInfo, remove } = useStorage('userInfo', { name: '张三' }) // 存 sessionStorage // const { data } = useStorage('token', '', 'session') </script> <template> <div>{{ userInfo.name }}</div> <button @click="userInfo.name = '李四'">修改</button> <button @click="remove">删除</button> </template>
// src/hooks/useModal.ts import { ref } from 'vue' export function useModal(initVisible = false) { const visible = ref(initVisible) const open = () => (visible.value = true) const close = () => (visible.value = false) const toggle = () => (visible.value = !visible.value) return { visible, open, close, toggle } }
http://www.jsqmd.com/news/870957/

相关文章:

  • Topit:macOS窗口置顶工具,让多任务工作流更流畅
  • CANN 异步推理:隐藏推理延迟提升吞吐量的完整方案
  • ncmdump工具终极指南:3步解锁网易云音乐NCM格式限制
  • 80集短剧,3天拍完:当电影人下场做Agent,影视生产迎来了“最懂行”的解法
  • RocketMQ Dledger 集群与 Raft 协议
  • 黄金回收白银回收铂金回收彩金回收店铺推荐织金县2026最新五家靠谱回收门店TOP5排行榜及联系方式推荐 - 前途无量YY
  • 终极指南:5步解决Cursor AI试用限制,永久免费使用Pro功能
  • 抖音无水印视频下载终极指南:免费快速获取高清素材
  • 3个关键步骤掌握Hugo-PaperMod主题部署
  • 3分钟搞定!在Mac上直接运行Windows应用的终极指南
  • VR-Reversal:无需VR设备,3D视频转换工具让你的普通显示器变身沉浸式影院
  • 在PC上解锁Switch游戏体验:Ryujinx模拟器深度配置手册
  • 终极电视盒子管理方案:TVBoxOSC让你的客厅影院更智能
  • 如何快速部署i茅台智能预约系统:面向初学者的完整指南
  • 黄金回收白银回收铂金回收彩金回收店铺推荐志丹县2026最新五家靠谱回收门店TOP5排行榜及联系方式推荐 - 前途无量YY
  • 免费多平台资源下载终极指南:如何一键获取视频号、抖音无水印内容
  • 黄金回收白银回收铂金回收彩金回收店铺推荐中方县2026最新五家靠谱回收门店TOP5排行榜及联系方式推荐 - 前途无量YY
  • 我为什么会把 555电影 当成“工具站”来看
  • 如何高效实现STL到STEP格式转换:stltostp工具的完整解决方案
  • ZMK开源键盘固件:从零打造你的终极定制化机械键盘
  • Windows 11安卓子系统WSA终极指南:开发者必知的完整解决方案
  • FlashAttention 的“加速玄学”:为什么 A100 能快 2 倍,910 却只能快 1.5 倍?
  • Spring-Ai-Alibaba [03] multiple-llm-client-demo
  • 如何让工艺工程师主导TVA应用开发
  • 革命性macOS窗口管理:Topit智能窗口置顶工具的深度解析与实战指南
  • STM32F103C8T6+TJA1042+UTA0403:一个CAN通讯新手踩过的所有坑(附完整接线图与代码)
  • 黄金回收白银回收铂金回收彩金回收店铺推荐中江县2026最新五家靠谱回收门店TOP5排行榜及联系方式推荐 - 前途无量YY
  • 黄金回收白银回收铂金回收彩金回收店铺推荐株洲县2026最新五家靠谱回收门店TOP5排行榜及联系方式推荐 - 前途无量YY
  • LingJing靶场+burp-labs:闭环式渗透实战教学系统
  • 三大核心优势打造离线版游戏王:YgoMaster免费畅玩指南