Vue 3 中实现多个可复用模态框实例的组合式函数最佳实践
发布时间 - 2026-01-29 00:00:00 点击率:次在 vue 3 组合式 api 中,一个 composable(如 `usemodal`)默认返回共享响应式状态,无法直接支持多实例;需通过解构重命名或参数化设计,使每个调用独立维护自身状态。
要让 useModal 同时支持多个模态框实例(如 Modal 1 和 Modal 2),核心在于确保每次调用 useModal() 都创建一份独立的响应式状态副本——而 Vue 的 ref、reactive 等响应式 API 天然具备该能力:只要 useModal 是一个普通函数(非单例),每次调用都会新建 ref 实例。
✅ 正确做法:利用 ES6 解构重命名,为不同实例分配专属变量名
// useModal.ts
import { ref } from 'vue'
export function useModal() {
const isOpen = ref(false)
const toggle = () => { isOpen.value = !isOpen.value }
const open = () => { isOpen.value = true }
const close = () => { isOpen.value = false }
return {
isOpen,
toggle,
open,
close
}
}在组件中多次调用并解构重命名:
Modal 1 Content Modal 2 Content
⚠️ 注意事项:
立即学习“

- ❌ 不要写成 const { isOpen: isOneOpen } = useModal() 再重复解构(虽语法合法,但语义模糊且易出错);推荐直接赋值为对象(如 modalOne),语义更清晰、API 更一致、便于后续扩展方法(如 open()/close())。
- ❌ 避免在 setup() 外部缓存 useModal() 返回值(如 const sharedModal = useModal()),否则所有组件将共享同一状态。
- ✅ 若需进一步抽象(如带初始状态或 ID),可升级 useModal 为工厂函数:
// 支持初始化与标识
export function useModal(initial = false, id?: string) {
const isOpen = ref(initial)
const toggle = () => { isOpen.value = !isOpen.value }
return {
id,
isOpen,
toggle,
open: () => { isOpen.value = true },
close: () => { isOpen.value = false }
}
}
// 使用时可传参区分行为
const modalA = useModal(true, 'login')
const modalB = useModal(false, 'confirm')? 总结:Vue 3 的 composables 本质是「状态工厂函数」,其复用性正源于每次调用都生*新响应式引用。无需特殊技巧,只需保证:多次调用 + 合理命名/组织返回值,即可优雅支撑任意数量的独立模态框、抽屉、提示框等交互组件。
# vue
# react
# es6
# red
# const
# 对象
# 重命名
# 返回值
# 是一个
# 模态
# 多个
# 只需
# 要让
# 值为
# 化与
# 学习笔记
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么实现验证码(Captcha)功能
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
七夕网站制作视频,七夕大促活动怎么报名?
如何快速搭建FTP站点实现文件共享?
javascript基于原型链的继承及call和apply函数用法分析
网站建设要注意的标准 促进网站用户好感度!
HTML 中动态设置元素 name 属性的正确语法详解
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
简单实现Android验证码
如何自定义建站之星网站的导航菜单样式?
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Laravel如何使用Vite进行前端资源打包?(配置示例)
Linux后台任务运行方法_nohup与&使用技巧【技巧】
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
如何在IIS中新建站点并解决端口绑定冲突?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
javascript日期怎么处理_如何格式化输出
简单实现jsp分页
昵图网官方站入口 昵图网素材图库官网入口
如何将凡科建站内容保存为本地文件?
js实现获取鼠标当前的位置
如何确保西部建站助手FTP传输的安全性?
如何用腾讯建站主机快速创建免费网站?
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
如何在Windows服务器上快速搭建网站?
如何快速查询网站的真实建站时间?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
js实现点击每个li节点,都弹出其文本值及修改
简单实现Android文件上传
如何快速搭建高效简练网站?
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
大学网站设计制作软件有哪些,如何将网站制作成自己app?
如何在阿里云域名上完成建站全流程?
如何实现建站之星域名转发设置?
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何用VPS主机快速搭建个人网站?
如何在阿里云部署织梦网站?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
JS实现鼠标移上去显示图片或微信二维码
在线教育网站制作平台,山西立德教育官网?

