news 2026/10/12 5:47:12

Openblocks Drawer 抽屉组件实战:布局定位、尺寸控制与 openDrawer/closeDrawer 事件触发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Openblocks Drawer 抽屉组件实战:布局定位、尺寸控制与 openDrawer/closeDrawer 事件触发
  • 低代码
  • 后端
  • 前端
  • 开发工具

【免费下载链接】openblocks

🔥 🔥 🔥 The Open Source Retool Alternative

项目地址:https://gitcode.com/gh_mirrors/op/openblocks
点击查看免费下载

Drawer(抽屉)是 Openblocks 中用于在应用主界面上方弹出侧边浮层的组件,它可以在不打断主窗口工作流的前提下展示信息或完成操作,典型场景如购物车、筛选面板、设置面板等。本文以官方组件指南 docs/build-apps/component-guides/drawer.md 为核心脉络,结合仓库内 Drawer 组件源码(drawerComp.tsx),系统讲解 Drawer 的布局与编辑规则、放置方向、宽度/高度定制边界,以及如何通过事件处理器与 JS 代码调用openDrawer/closeDrawer方法完成打开与关闭控制。读完本文,你将能够在一个应用内独立搭建并完整控制自己的 Drawer 抽屉。

认识 Drawer:不打断主流程的浮层侧栏

在 Openblocks 中,Drawer是一个叠加式侧边栏(overlay sidebar),用于在主窗口之上展示信息或执行操作,而不中断主窗口正在进行的工作流。它特别适合承载"临时上下文"型的内容,例如电商应用中的购物车:用户在主页面浏览商品,点击按钮后购物车从侧边滑出,查看完毕后再收回,全程无需离开当前页面。

下图演示了官方文档中使用 Drawer 构建的在线购物购物车示例:

从源码结构看,Drawer 在 Openblocks 中是一种"hook 组件"(非 UI 画布组件),它在 hookCompTypes.tsx 中被归类为category: "ui"且允许非单例(singleton: false),并在 hookComp.tsx 的HookMap中以drawer: DrawerComp注册。这意味着一个应用可以存在多个 Drawer 实例,它们与 Modal 一样挂在应用的全局层级之上。

Layout:拖拽插入与编辑模式下的隔离

通过拖拽操作插入后,Drawer默认浮动在主窗口的右侧,你可以按需继续往 Drawer 上添加各类组件(按钮、列表、表格等),把它当作一个独立的"容器画布"来布局。

编辑模式下的组件隔离

在 Drawer 的编辑模式下,画布上的其他组件不可编辑。这一行为在源码中由 hookComp.tsx 的SelectHookView逻辑保障:当从左侧面板或"新增组件"来源选中 Drawer(及其子组件)时,会通过changeChildAction("value", true)自动将visible置为true以进入编辑态;而当选中画布上的其他组件时,若 Drawer 当前可见,则会自动将visible置为false。也就是说,编辑状态下 Drawer 与主画布是互斥聚焦的,避免了两边组件同时被误操作。

关闭后如何重新打开

提示:当 Drawer 被关闭后,你可以在左侧面板的Modals标签页中点击对应的标签重新打开它。

左侧面板的 Modals 标签在 LeftContent.tsx 中实现:modalsCollapse通过getTreeUI(TreeUIKey.Modals)渲染所有 Modal / Drawer 组件树,并展示在BaseSection name={trans("leftPanel.modals")}区块中。点击其中的 Drawer 标签即会触发上文所述的visible置位逻辑,将抽屉重新拉出到编辑视图中。

Position:四种放置方向

在Properties(属性)标签页中,可以设置 Drawer 的位置(placement),默认位置是主窗口的右侧。

源码中位置选项定义在 drawerComp.tsx 的PlacementOptions常量中,共支持四个方向:

选项属性面板文案说明
topTop / 顶部从主窗口顶部滑出,此时可配置高度(height)
rightRight / 右侧默认值,从右侧滑出,此时可配置宽度(width)
bottomBottom / 底部从底部滑出,此时可配置高度(height)
leftLeft / 左侧从左侧滑出,此时可配置宽度(width)

位置属性在属性面板中以单选按钮(radioButton: true)形式呈现。放置方向还决定了后续"尺寸控制"中到底调整宽度还是高度——这是理解 Drawer 尺寸配置的关键前提。

Resize:宽度与高度的定制边界

在Properties标签页中,你可以以像素或百分比为单位设置 Drawer 的宽度。需要特别注意的是:Drawer 的高度默认与主窗口一致,且不可自定义(这一约束仅针对左右滑出方向;顶部/底部滑出时则可配置高度)。

从源码实现(drawerComp.tsx)可以进一步确认尺寸机制:

  • 默认宽度 378px:常量DEFAULT_SIZE = 378,当宽度未填时生效;
  • 数字与百分比兼容:transToPxSize函数对纯数字自动补px后缀,非数字则按原样传入(例如520会变为520px,而60%保持百分比形式)。属性面板的 tooltip 文案也明确标注为 "Number or percentage, e.g. 520, 60%"(见 en.ts);
  • 左右方向:只展示width输入框,高度由主窗口决定(height传空字符串);
  • 上下方向:top/bottom时高度可调,且增加AutoHeight(自动高度)开关;当关闭自动高度时,会额外显示height输入框(默认同样为 378px,tooltip 示例为378);
  • 运行时缩放:非用户视图模式下,Drawer 可通过拖拽边缘实时调整大小,onResizeStop回调会根据方向把新尺寸写回width或height状态(drawerComp.tsx)。

引用 Drawer 的两种方式

你可以在应用中的任何位置通过 JS 代码引用 Drawer,也可以通过Properties > Interaction > Event handlers中的Control component(控制组件)动作来调用它。

方式一:JS 代码直接引用

Drawer 对外暴露了状态与方法(由withMethodExposing/withExposingConfigs包装,见 drawerComp.tsx):

暴露项类型说明
drawer.visible布尔状态当前是否可见,可读写,也可在 JS 中直接赋值控制
drawer.openDrawer()方法打开抽屉(无参数),等价于把visible置为true
drawer.closeDrawer()方法关闭抽屉(无参数),等价于把visible置为false

因此可以在任意 JS 代码(按钮的onClick、查询的预处理脚本、定时器等)中写:

// 打开购物车抽屉 cart.openDrawer(); // 关闭购物车抽屉 cart.closeDrawer(); // 或者直接操作可见性状态 cart.visible = true;

方式二:Control component 动作的底层机制

在事件处理器中选择Control component作为动作时,其实是在使用executeCompAction机制(executeCompAction.tsx)。其实现原理为:从editorState.getAllUICompMap()中收集所有暴露了方法的组件及其exposingInfo().methods,在属性面板中以下拉框选择目标组件与方法名;运行时通过routeByNameAction配合customAction({ type: "execute", methodName, params })定位到具体组件实例并执行对应方法。这也解释了为何属性面板中"组件"和"方法"是两个联动下拉框——方法列表由所选组件动态决定。

实战:通过按钮打开与关闭购物车抽屉

以下步骤来自官方文档中"在线购物"示例的购物车场景,实现了"点击按钮弹出购物车、点击继续购物收回购物车"的完整闭环。

触发 openDrawer

  1. 添加一个按钮(Button),并将其重命名为gotoCart;
  2. 为按钮设置事件处理器(Event handlers):在Action下拉框中选择Control component,然后选择组件cart、方法openDrawer。所有设置会自动保存。

  1. 点击gotoCart按钮,绑定的cart抽屉即被打开。

触发 closeDrawer

触发closeDrawer的方式与触发openDrawer完全类似,区别仅在于方法选择为closeDrawer:

  1. 添加一个按钮并重命名为gobackShopping(例如显示为"Continue Shopping / 继续购物");
  2. 为该按钮设置事件处理器:Action选择Control component,选择组件cart、方法closeDrawer,设置自动保存;
  3. 点击"继续购物"按钮,绑定的cart抽屉即被关闭。

由于openDrawer/closeDrawer均为无参方法(params: []),在上述动作配置中不需要填写任何参数,这也是它们适合作为事件动作直接调用的原因。

补充配置:遮罩、层级与样式

除位置和尺寸外,Drawer 在属性面板的基础(Basic)区块中还有几项实用配置,同样可在源码 drawerComp.tsx 中确认:

  • 点击遮罩关闭(Mask closable):默认开启(maskClosable: withDefault(BoolControl, true))。开启后用户点击抽屉外的半透明遮罩即可关闭抽屉;
  • 显示遮罩(Show mask):默认开启(showMask: withDefault(BoolControl, true))。关闭后遮罩不渲染,抽屉浮层不会阻挡底层交互;
  • 层级:Drawer 的zIndex为常量Layers.drawer = 950(见 Layers.ts),高于普通画布组件,确保浮层始终位于上层;
  • 样式:Drawer 支持背景色设置,DrawerStyle定义为[getBackground()](见 styleControlConstants.tsx),并且内部内容区域通过BackgroundColorContext将背景色传递给子组件;容器内边距为固定 16px(DEFAULT_PADDING = 16)。

配合位置、尺寸与遮罩行为,即可把 Drawer 从"默认的右侧窄条"调整成符合业务需要的任意形态——例如从底部弹出的筛选面板,或从左侧滑出的导航抽屉。

小结

本文基于官方组件指南并对照源码,完整梳理了 Openblocks Drawer 组件的使用要点:它默认悬浮于主窗口右侧、支持上下左右四种放置方向;宽度支持像素与百分比两种写法,高度在左右方向与主窗口一致、在上下方向可自定义并支持自动高度;编辑模式下与画布组件互斥聚焦,关闭后可从左侧Modals标签重新打开。在事件控制层面,既可在任意 JS 代码中通过drawer.visible、drawer.openDrawer()、drawer.closeDrawer()直接操作,也可在事件处理器中借助Control component动作无参数调用,从而轻松实现"按钮打开抽屉、按钮关闭抽屉"的完整交互闭环。

  • 低代码
  • 后端
  • 前端
  • 开发工具

【免费下载链接】openblocks

🔥 🔥 🔥 The Open Source Retool Alternative

项目地址:https://gitcode.com/gh_mirrors/op/openblocks
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 5:46:47

Windows上Codex沙箱初始化失败?WSL2虚拟磁盘膨胀排查与修复

这周二(2026年10月8日)上午,我原本计划用Codex把那个长期搁置的模块重构收尾,结果刚跑到第二轮任务,工作流就卡死了。窗口里先是弹出沙箱初始化失败的报错,然后整个Codex会话直接中断,重试、重启…

作者头像 李华
网站建设 2026/10/12 5:46:26

bert-base-uncased文本分类微调实战:原理、参数与避坑指南

简介:面向需要在本地项目中加载BERT模型的自然语言处理开发者,这里提供的是bert-base-uncased预训练模型的完整离线包,专门解决运行中提示‘Can‘t load tokenizer for bert-base-uncased’的报错问题。压缩包共4个文件,包含词表文…

作者头像 李华
网站建设 2026/10/12 5:44:32

GitHub日榜全解析:看懂榜单机制,掌握项目筛选与避坑方法

每天早上打开 GitHub 的 Trending 页面,已经成了我干了十几年开发之后唯一坚持下来的“信息早课”。2026年10月4日这期日榜,我前后刷了两遍,第一遍看热闹,第二遍逐个项目点进去看 star 增长曲线、Issues 区讨论和提交频率。看完之…

作者头像 李华
网站建设 2026/10/12 5:44:32

MFC迷宫游戏实战:递归回溯生成、双缓冲绘图与键盘控制

简介:一个基于MFC类库的简单迷宫游戏完整源码包,面向C初学者和需要课程设计参考的开发者,展示了MFC对Windows API的封装在窗口、控件、绘图与消息处理中的实际应用。项目使用二维网格表示迷宫地图,利用二维数组存储墙与通道状态&a…

作者头像 李华
网站建设 2026/10/12 5:42:43

zotero使用指南 zotero功能详解与实用技巧汇总

构建一个高质量的国外参考文献库,听起来很宏大,但其实就是把“找、管、用”这三件事做对。整个过程最关键的一步,是选对一个能陪你走完全程的“智能伙伴”。我强烈推荐 切问学术,它能让这件事从杂乱无序变得井井有条。 第一步&am…

作者头像 李华
网站建设 2026/10/12 5:42:03

知网AIGC检测原理与四款降AI率工具实测,附完整避坑指南

最近几个月,身边好几个学生和同行都拿着打印出来的检测报告找我,一脸无奈地问:明明是自己一个字一个字敲出来的稿子,怎么知网AIGC检测一跑,标红标黄一片“疑似AI生成”?这类问题放到2026年的今天&#xff0…

作者头像 李华