首页/新闻资讯/正文详情

Quasar Bottom Sheet 插件完全指南:从列表/网格动作面板到源码级关闭原理

发布时间:2026/9/20 23:42:10 来源:云帆数科 栏目:资讯中心
Quasar Bottom Sheet 插件完全指南:从列表/网格动作面板到源码级关闭原理
Quasar Bottom Sheet 插件完全指南从列表/网格动作面板到源码级关闭原理【免费下载链接】quasarQuasar Framework - Build high-performance VueJS user interfaces in record time项目地址: https://gitcode.com/gh_mirrors/qu/quasarBottom Sheet底部动作面板是 Quasar Framework 内置的一个 UI 插件它从设备屏幕底部滑出展示一组可供用户确认或取消的操作选项。本文以官方文档 docs/src/pages/quasar-plugins/bottom-sheet.md 为主体结合仓库源码插件实现、组件渲染、核心调度器展开读完你将掌握BottomSheet.create()/$q.bottomSheet()的完整用法、全部可配置参数、链式回调 API以及点背景关闭、按 ESC 关闭、路由跳转关闭等行为背后的实现原理。什么是 Bottom SheetBottom Sheet 从设备屏幕的底部边缘向上滑出显示一组操作选项并支持确认或取消某个动作。它与菜单Menu在定位上有微妙区别可以作为菜单的替代方案当需要在一组并列选项中快速选择时Bottom Sheet 的触达面积更大、更符合移动端手势习惯不应用于导航它只适合承载动作如分享、上传、删除确认不适合承担页面路由级别的导航职责。Bottom Sheet 始终悬浮在页面其他所有组件之上必须被关闭后才能与底层的页面内容交互。触发时页面其余部分会变暗出现半透明遮罩将视觉焦点集中到面板选项上。它支持两种展示形态列表List纵向排列适合条目较多、文本较长的场景网格Grid横向按行排布适合图标化的快捷动作。同时每个动作项既可以配图标icon也可以配头像avatar或图片img。在 Quasar 中Bottom Sheet 有两种使用方式在 Vue 模板中作为组件或者作为全局可用方法插件形式。安装与引入Bottom Sheet 是 Quasar 官方插件通过 ui/src/plugins.js 导出export { default as BottomSheet } from ./plugins/bottom-sheet/BottomSheet.js在quasar.config.js中启用插件无需额外安装 npm 包随 Quasar 框架一起提供// quasar.config.js framework: { plugins: [BottomSheet] }安装后Quasar 会在全局注入$q.bottomSheet方法。其底层实现非常精简见 ui/src/plugins/bottom-sheet/BottomSheet.jsimport BottomSheet from ./component/BottomSheetComponent.js import { createDialog } from ../../utils/private.dialog/create-dialog.js export default { install({ $q, parentApp }) { $q.bottomSheet this.create createDialog(BottomSheet, false, parentApp) } }可以看到插件安装时把BottomSheet.create与$q.bottomSheet绑定为同一个函数引用二者等价。createDialog(BottomSheet, false, parentApp)中的第二个参数false表示该插件不支持自定义组件对比 Dialog 插件始终渲染内置的BottomSheetComponent。提示在模板中使用组件形式时对应的组件类名为BottomSheetComponent内部名称官方推荐的公开使用方式仍是插件方法因为插件方法会自动挂载到全局 DOM 节点并管理生命周期。基本用法编程式调用在 Vue 文件之外例如纯 JS 模块、路由守卫、Store 中使用BottomSheet.create在 Vue 文件内部使用useQuasar()注入的$q.bottomSheet。二者返回同一个 Promise 风格的链式对象。// 在 Vue 文件之外 import { BottomSheet } from quasar BottomSheet.create({ ... }) // 返回 Object链式 API // 在 Vue 文件内部 import { useQuasar } from quasar setup () { const $q useQuasar() $q.bottomSheet({ ... }) // 返回 Object链式 API }官方文档给出的完整实战示例对应 docs/src/examples/BottomSheet/Basic.vue如下script setup import { useQuasar } from quasar const $q useQuasar() function show(grid) { $q.bottomSheet({ message: Bottom Sheet message, grid, actions: [ { label: Drive, img: https://cdn.quasar.dev/img/logo_drive_128px.png, id: drive }, { label: Keep, img: https://cdn.quasar.dev/img/logo_keep_128px.png, id: keep }, { label: Google Hangouts, img: https://cdn.quasar.dev/img/logo_hangouts_128px.png, id: calendar }, { label: Calendar, img: https://cdn.quasar.dev/img/logo_calendar_128px.png, id: calendar }, {}, // 空对象 在列表/网格中渲染为分隔符Separator { label: Share, icon: share, id: share }, { label: Upload, icon: cloud_upload, color: primary, id: upload }, {}, // 分隔符 { label: John, avatar: https://cdn.quasar.dev/img/boy-avatar.png, id: john } ] }) .onOk(action { console.log(Action chosen:, action.id) }) .onCancel(reason { // reasonQuasar v2.28取值backdrop、escape 或 programmatic console.log(Dismissed:, reason) }) .onDismiss(() { console.log(I am triggered on both OK and Cancel) }) } /script示例中值得注意的两个细节空对象{}作为分隔符当某个 action 对象没有label时源码 BottomSheetComponent.js 会将其渲染为QSeparator组件在列表模式中渲染QSeparator带间距在网格模式中渲染为占满整行的col-all分隔条action 支持任意自定义属性如示例中的idonOk回调会把整个 action 对象原样回传因此自定义字段如id、业务数据可以在回调中直接使用。链式回调 APIcreate()/$q.bottomSheet()返回的链式对象来自 create-dialog.js支持以下方法均可链式调用方法触发时机回调参数onOk(fn)用户点击某个动作被点击的整个 action 对象onCancel(fn)面板被取消关闭未选择任何动作关闭原因backdrop/escape/programmaticonDismiss(fn)无论确认还是取消只要面板关闭都会触发若未选动作则传关闭原因否则传 action 对象hide()主动关闭面板—update(props)热更新面板的配置如标题、actions、dark 等—实现细节onDismiss本质上是同时注册ok与cancel两套回调create-dialog.jshide()与update()通过遍历组件树查找show/hide方法并调用兼容script setup中组件可能被异步包装的情况create-dialog.js。当面板关闭且未触发 OK 时onHide会把 dismiss reason 传给所有 cancel 回调create-dialog.js。此外在 SSR服务端渲染环境下create返回一个安全的空实现 API所有方法均为空操作并返回自身避免服务端直接操作 DOMcreate-dialog.js。完整参数说明API 全解依据官方 API 定义文件 ui/src/plugins/bottom-sheet/BottomSheet.jsonBottomSheet.create(opts)接受以下顶层选项参数类型默认值说明titleString—面板标题messageString—面板说明文字actionsArray—动作数组每个元素是一个对象gridBooleanfalsetrue时以网格展示否则为列表darkBoolean—强制应用暗色模式默认跟随全局seamlessBooleanfalse无缝模式不使用遮罩用户可与页面其余部分交互persistentBooleanfalse持久模式点击外部、按 ESC 均无法关闭路由变化也不会关闭它classes即classString/Array/Object—应用于面板卡片QCard的 CSS 类styleString/Array/Object—应用于面板卡片的内联样式提示class与style在传入插件时会被内部转换为cardClass/cardStylecreate-dialog.js最终作用于 BottomSheetComponent.js 中的QCard上。actions 数组中每个动作对象的字段字段类型说明labelString / Number动作的文本标签缺省时该对象被渲染为分隔符iconString图标名称需配合已安装的图标集使用colorString图标颜色透传给 QIcon 的colorpropimgString动作图片路径支持public 目录路径如img/something.png、相对路径如:srcrequire(./my_img.jpg)、远程 URLavatarString头像图片路径与img支持相同格式渲染为圆形头像样式q-bottom-sheet__avatarclassesString/Array/Object该动作元素的 CSS 类styleString/Array/Object该动作元素的内联样式...Any任意其他自定义属性会在onOk回调中原样返回优先级规则见 BottomSheetComponent.js 的getGrid/getListicon优先于img/avatar——若配置了icon则渲染QIcon否则才尝试渲染img或avatar图片。关闭行为与关闭原因Dismissal Reason官方文档明确了两条平台行为在Cordova 应用中用户点击手机/平板系统的返回键Bottom Sheet 会自动关闭在桌面浏览器中按下ESCAPE键同样会关闭。此外从Quasar v2.28 开始onCancel回调以及未选择任何动作时的onDismiss会接收到关闭原因的字符串取值有三种取值含义backdrop用户点击了面板外部的半透明遮罩区域escape用户按下了 ESC 键programmatic通过代码主动关闭调用hide()也包括应用发生路由跳转导致的自动关闭该原因字符串由 dismiss-reason.js 生成逻辑非常直白export function getDismissReason(evt) { return evt void 0 ? programmatic : evt.type.indexOf(key) 0 ? escape : backdrop }即无事件对象 →programmatic键盘事件keydown/keyup→escape其余鼠标/触摸点击遮罩→backdrop。测试用例 BottomSheet.test.js 中有专门的dismissal reason测试分组验证这三种原因的分发逻辑。背后的组件实现一切基于 QDialog从源码结构看Bottom Sheet 并没有另起炉灶而是复用 Quasar 的 QDialog 组件作为容器BottomSheetComponent的根节点就是一个QDialog并固定设置position: bottomBottomSheetComponent.js。QDialog 的position为bottom时会应用fixed-bottom justify-center定位类并使用slide-up显示/slide-down隐藏的默认过渡动画QDialog.js这正是从底部滑出效果的来源。底层关闭行为与参数的关系QDialog.jsconst hideOnRouteChange computed( () !props.persistent !props.noRouteDismiss !props.seamless )点击遮罩关闭仅当非persistent、非noBackdropDismiss时生效QDialog.jsESC 关闭仅当非seamless、非persistent、非noEscDismiss时生效QDialog.js路由变化关闭由上述hideOnRouteChange计算属性控制。因此seamless: true时连遮罩都不渲染useBackdrop为false外层类切换为q-dialog--seamless见 QDialog.js用户可以直接与页面交互persistent: true时遮罩、ESC、路由跳转三种关闭途径全部被禁用只能通过点击动作或代码hide()关闭。强制暗色模式Force dark mode官方文档第二个示例展示如何在 Bottom Sheet 上强制应用暗色模式对应 docs/src/examples/BottomSheet/Dark.vue只需传入dark: true$q.bottomSheet({ dark: true, message: Bottom Sheet message, grid, actions: [ /* ... */ ] })源码中dark来自useDarkProps混入BottomSheetComponent.js通过useDark(props, useQuasar())计算最终是否处于暗色状态。当为暗色时面板容器类追加q-bottom-sheet--dark q-darkBottomSheetComponent.js列表项QItem与分隔符QSeparator均传入dark: isDark()保证子元素配色统一若未传dark则自动跟随全局暗色主题。源码级原理小结一次调用的完整生命周期综合插件层、组件层与调度层源码一次$q.bottomSheet({...})调用的完整链路如下插件层$q.bottomSheet即createDialog(BottomSheet, false, parentApp)返回的工厂函数BottomSheet.js调度层createDialog在 SSR 下返回空实现浏览器端解析传入的 optionsclass/style转换为cardClass/cardStyle通过createChildApp创建名为QGlobalDialog的挂载子应用并插入到全局 DOM 节点create-dialog.js组件层BottomSheetComponent依据title/message/actions/grid/dark构建卡片内容——列表模式用QItemQItemSection网格模式用div.row布局无label的项渲染为QSeparatorBottomSheetComponent.js交互层点击动作触发onOk(action)并关闭点击遮罩 / 按 ESC / 路由跳转 / 代码hide()则触发onHide(getDismissReason(evt))将关闭原因分发给onCancel/onDismiss回调dismiss-reason.js、create-dialog.js清理层面板隐藏后卸载子应用、移除全局 DOM 节点避免内存泄漏create-dialog.js。单元测试 ui/src/plugins/bottom-sheet/BottomSheet.test.js 验证了$q.bottomSheet注入正确性、create()可调用且返回对象 API、网格模式正确渲染.q-bottom-sheet--grid节点、动作标签文本出现在 DOM 中、hide()后面板节点被移除以及三种 dismissal reason 的分发组件级测试 ui/src/plugins/bottom-sheet/component/BottomSheetComponent.test.js 则覆盖了列表/网格渲染与分隔符行为。总结Bottom Sheet 是 Quasar 中处理底部动作选择的标准答案一行$q.bottomSheet({ actions, grid, dark })即可获得带遮罩、动画、键盘/返回键支持的动作面板配合onOk/onCancel/onDismiss链式回调可以精细控制业务流转。其内部复用 QDialog 与全局子应用挂载机制seamless、persistent两个开关分别对应可交互页面与不可被外部关闭两种极端场景dark参数则可与全局主题无缝协同。完整的选项清单以官方 API 文档 ui/src/plugins/bottom-sheet/BottomSheet.json 为准仓库内的 Basic.vue 与 Dark.vue 是两个可以直接复制运行的最小示例。【免费下载链接】quasarQuasar Framework - Build high-performance VueJS user interfaces in record time项目地址: https://gitcode.com/gh_mirrors/qu/quasar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

华为4A架构方法论:四层视图打通业务与IT
华为4A架构方法论:四层视图打通业务与IT

简介:面向企业架构师、IT规划人员与数字化转型项目负责人,这份演示文稿系统呈现华为4A企业架构设计方法论及落地实例,涵盖业务架构、应用架构、数据架构、技术架构四个维度。内容以企业架构总体框架为基线,融合国际主流架构方法&a… · 2026/9/20 23:42:10

DeepSeek Harness 会话持久化兼容层:react-loop 重构前 v0 会话日志的加载与恢复实战
DeepSeek Harness 会话持久化兼容层:react-loop 重构前 v0 会话日志的加载与恢复实战

人工智能AI AgentAgent 框架DeepSeek 【免费下载链接】deepseek-harness DeepSeek Harness: Everything is a Plugin. 项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness 点击查看 免费下载 本文基于 .agents/notes/implemented/bug-fix/2026-08-04-l… · 2026/9/20 23:41:10

三步免费备份QQ空间全部历史说说:GetQzonehistory完整使用指南
三步免费备份QQ空间全部历史说说:GetQzonehistory完整使用指南

三步免费备份QQ空间全部历史说说:GetQzonehistory完整使用指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory QQ空间十年了,那些深夜写下的文字、随手拍下的照片… · 2026/9/20 23:41:10

一个服务器上有两个网站要备案两次吗速查手册
一个服务器上有两个网站要备案两次吗速查手册

一个服务器上有两个网站要备案两次吗速查手册 改个需求建站公司拖一周,这种憋屈事儿我见得太多了。作为湖北创业团队的负责人,我最怕的就是因为搞不清技术细节,让外包团队有借口拖延进度。其实,很多所谓的“技术难题”,往往只是信息不对称造成的误解。今天我就把这份关于 一个服务器上有两个网站要备案两次吗 的… · 2026/9/21 9:32:45

单位网络建设的设计方案全流程解析避坑指南
单位网络建设的设计方案全流程解析避坑指南

单位网络建设的设计方案全流程解析避坑指南 改个需求建站公司拖一周,这种痛谁懂?很多单位搞网络建设,前期方案写得漂漂亮亮,后期落地全是坑。别急着怪供应商,大概率是你们的【单位网络建设的设计方案】里,把【完整流程】搞丢了,或者干脆没搞。… · 2026/9/21 9:17:55

3个实战案例教你挑对软件下载网站哪个好防挂马
3个实战案例教你挑对软件下载网站哪个好防挂马

3个实战案例教你挑对软件下载网站哪个好防挂马 上周帮客户复盘,发现官网弹窗全是博彩广告,后台日志被清空,这种被黑挂马的恐惧,很多站长都经历过。 别慌,选对底层架构的下载站,比事后打补丁重要十倍。 结合3个被黑过的实战案例,我拆解一下“软件下载网站哪个好”的评判标准。 设计原则与信任感构建… · 2026/9/21 9:02:23

网站标识代码怎么加实操详解及对比评测避坑指南
网站标识代码怎么加实操详解及对比评测避坑指南

网站标识代码怎么加实操详解及对比评测避坑指南 备案流程一头雾水,是很多中小企业在上线官网时最容易卡壳的环节。很多老板以为只要把网站做出来,挂上域名就能收流量,结果发现没ICP备案根本打不开,或者加了备案代码位置不对导致审核不通过。这时候,一份清晰的网站标识代码怎么加的操作指南,加上不同服务商方案的对… · 2026/9/21 8:45:49

别被网页制作模板中文坑了,懂建站报价才不亏
别被网页制作模板中文坑了,懂建站报价才不亏

别被网页制作模板中文坑了,懂建站报价才不亏 网站做好了没人访问,这钱白花得冤不冤?很多老板找外包,问完建站报价,对方甩给你一个“网页制作模板中文”链接,说这是高端定制。你一看,哦,是套壳的。更坑的是,有些模板连基础的SEO结构都没做好,上线三个月,百度搜不到你公司名字。… · 2026/9/21 8:31:34

2026最新微信小程序连接wordpress:解决域名服务器搞不懂的实战指南
2026最新微信小程序连接wordpress:解决域名服务器搞不懂的实战指南

2026最新微信小程序连接wordpress:解决域名服务器搞不懂的实战指南 域名解析指向不对,服务器端口没开放,SSL证书配置报错——这三座大山,劝退了一半想用微信小程序展示WordPress内容的开发者。别急,2026最新的连接方案早已绕开了传统Web服务器配置的深坑,核心逻辑是:… · 2026/9/21 8:17:36

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化
Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡… · 2026/9/21 0:02:39

Word表格编号全攻略:从列表编号到题注交叉引用
Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技… · 2026/9/21 0:02:39

从第一个站到第二个站:独立开发者的静态网站选型与落地实践
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&… · 2026/9/20 0:00:41

Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行
Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 0:00:18

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程
agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and … · 2026/9/21 0:00:18

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,… · 2026/9/21 0:00:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码