首页 / 资讯中心 / 文章详情

Open Pencil Vue SDK 实战:用 useVariablesDialogState 打造自定义变量编辑对话框

Open Pencil Vue SDK 实战:用 useVariablesDialogState 打造自定义变量编辑对话框 ★ FEATURED ARTICLE
前端桌面应用AI 应用MCP 服务【免费下载链接】open-pencilAI-native design editor. Open-source Figma alternative.项目地址https://gitcode.com/gh_mirrors/op/open-pencil点击查看免费下载useVariablesDialogState()是 Open Pencil Vue SDK 中面向「变量Variables」领域的三层 composable 架构里的中间层它在底层useVariables()返回的集合、模式、变量 CRUD 能力之上追加了「集合重命名」与「输入框焦点管理」这类对话框专属编辑状态。当你需要构建一个自定义变量对话框而不是引入整合了 TanStack Table 表格的完整useVariablesEditor()时这个 composable 是最贴合的选择。读完本文你将掌握它的完整 API 表面、底层实现原理以及如何用最小成本在 Vue 组件中落地一个可重命名集合、支持回车提交与 Esc 取消的自定义变量对话框。一、定位三层变量 composable 架构中的中间层Open Pencil 的 Vue SDK 为「变量」领域设计了三层由低到高的组合式 API理解这层关系是正确选型的前提层级API职责底层useVariables()直接读写集合collections、模式modes、变量variables与变量值含搜索、筛选与全套 CRUD中间层useVariablesDialogState()在底层之上叠加对话框专属状态集合重命名与焦点管理高层useVariablesEditor()组合对话框状态、表格列定义与 TanStack Vue Table一次接入完整编辑器从源码结构可以确认这一点高层 composable useVariablesEditor() 内部第一行就是const ctx useVariablesDialogState()再通过useVariablesTable()注入列定义、用useVueTable组装表格而中间层 useVariablesDialogState() 则通过useVariables()拿到底层能力并用useInlineRename()构建重命名状态机。因此选型原则很清晰只需要「改名 焦点」这类轻量交互就选useVariablesDialogState()需要完整表格编辑体验则直接用useVariablesEditor()而需要完全掌控 CRUD 与筛选逻辑时可以裸用useVariables()自行拼装。二、快速上手按官方参考文档useVariablesDialogState()从open-pencil/vue包导出调用方式与普通 Vue composable 一致import { useVariablesDialogState } from open-pencil/vue const variablesDialog useVariablesDialogState()由于 Vue 的 setup 作用域机制该 composable 只能在组件setup或script setup上下文中调用它会经由useEditor()读取当前编辑器上下文因此使用前需确保组件处于provide-editor所建立的作用域内参见 useVariables() 底层实现 中const editor useEditor()的调用方式。三、在 useVariables() 基础上新增的 API参考文档明确列出了useVariablesDialogState()在useVariables()返回值之上追加的四个成员editingCollectionId—— 当前处于重命名状态的集合 id非编辑态时为nullsetCollectionInputRef()—— 注册/切换重命名输入框的 ref并负责聚焦与全选文本startRenameCollection()—— 传入集合 id将该集合切入重命名状态commitRenameCollection()—— 提交改名将输入框的新值写入集合这四个 API 构成了一个典型的「开始编辑 → 注入输入框 → 提交/取消」闭环。需要提醒的是当前仓库源码中的实现方式与文档命名存在对应关系源码 dialog/use.ts 实际返回的是collectionRename与modeRename两个useInlineRename状态对象外加startRenameCollection/startRenameMode两个便捷方法。其中文档中的editingCollectionId对应collectionRename.editingId文档中的setCollectionInputRef()对应collectionRename.focusInput文档中的commitRenameCollection()对应collectionRename.commit两者只是同一状态机的不同命名视角文档命名更贴近语义源码命名则直接复用通用的内联重命名基础设施。除了集合源码还额外支持模式mode重命名startRenameMode(modeId)会在当前活动集合的模式列表中查找目标模式并切入编辑态见 dialog/use.ts这一点在官方文档的成员清单中未展开属于实现层补充能力。四、底层实现剖析4.1 状态机来自通用 useInlineRename对话框状态的核心是 useInlineRename()这是一个与变量领域无关的通用内联重命名状态机其完整契约如下export interface InlineRenameStateT extends string { editingId: RefT | null start: (id: T, currentName: string) void focusInput: (input: HTMLInputElement | null) Promisevoid commit: (id: T, eventOrInput: Event | HTMLInputElement) void cancel: () void onKeydown: (e: KeyboardEvent) void }其内部行为值得关注三点焦点管理focusInput用vueuse/core的onClickOutside绑定输入框点击外部自动触发blur()随后nextTick后执行focus()与select()实现进入编辑态即全选当前名称的交互inline-rename/use.ts。提交语义commit会先trim()输入值仅当新值非空且与原名不同时才回调提交避免空名与无变化提交inline-rename/use.ts。键盘协议onKeydown中Enter触发 blur从而走提交路径Escape直接取消编辑inline-rename/use.ts。4.2 提交时如何落到编辑器useVariablesDialogState()构造了两个内联重命名状态机并把提交动作桥接到底层变量 APIconst collectionRename useInlineRename((id, newName) { variables.renameCollection(id, newName) }) const modeRename useInlineRename((modeId, newName) { variables.renameMode(modeId, newName) })而variables.renameCollection/renameMode最终由 variables/helpers.ts 中的createVariableCollectionActions转发到编辑器命令层editor.renameCollection(id, newName)与editor.renameMode(colId, modeId, newName)。也就是说一次重命名的完整调用链是组件交互 → useInlineRename.commit → useVariablesDialogState 的 onCommit 回调 → useVariables().renameCollection → createVariableCollectionActions → editor.renameCollection → 场景图数据变更4.3 与 useVariables() 的展开关系useVariablesDialogState()通过{ ...variables }把底层全部能力原样透传dialog/use.ts因此你依然可以拿到底层 composable 的完整成员包括集合与模式collections、activeCollectionId、activeCollection、activeModes变量与搜索variables、searchTerm、setSearchTerm()CRUD 与格式化addCollection()、renameCollection()、addVariable()、removeVariable()、renameVariable()、updateVariableValue()、formatModeValue()、parseVariableValue()、shortName()其中collections/variables均为useSceneComputed驱动的响应式计算值见 use.ts会随场景图变更自动刷新activeCollectionId默认取首个集合并在集合列表变化时自动兜底。五、实战搭建一个自定义变量集合对话框下面用collectionRename源码级 API实现一个支持「双击改名、回车提交、Esc 取消、点击外部退出编辑」的最小集合列表对话框script setup langts import { useVariablesDialogState } from open-pencil/vue const dialog useVariablesDialogState() function commitFromEvent(e: Event) { const target e.target as HTMLInputElement if (dialog.collectionRename.editingId.value) { dialog.collectionRename.commit(dialog.collectionRename.editingId.value, target) } } /script template ul li v-forcol in dialog.collections.value :keycol.id template v-ifdialog.collectionRename.editingId.value col.id input :ref(el) dialog.collectionRename.focusInput(el as HTMLInputElement | null) :default-valuecol.name keydowndialog.collectionRename.onKeydown blurcommitFromEvent / /template span v-else dblclickdialog.startRenameCollection(col.id) {{ col.name }} /span /li /ul /template几个关键细节进入编辑态startRenameCollection(col.id)内部会到collections中查表并用当前名称初始化originalName所以即便用户不修改直接回车也不会产生冗余提交。自动聚焦与全选focusInput会在输入框挂载后自动focus()select()配合nextTick保证 DOM 已渲染。提交路径Enter触发onKeydown→blurTarget→ 输入框 blur →blur里调用commit点击外部则由onClickOutside触发 blur 走同一路径Escape则直接cancel()不留脏状态。如果不需要逐项绑定键盘事件也可以直接用文档命名风格调用dialog.startRenameCollection(id)后通过dialog.setCollectionInputRef(el)注入输入框、dialog.commitRenameCollection(e)提交效果等价。六、何时选用它三种方案的决策路径自定义对话框、只做集合重命名与焦点管理→ 选useVariablesDialogState()拿到底层全部 CRUD同时免去手写内联编辑逻辑。需要完整表格编辑体验→ 选useVariablesEditor()它在内部先调用useVariablesDialogState()再拼接columns与table并提供hasCollections空态判断见 editor/use.ts适合做「无集合时展示引导、有集合时展示表格」的完整界面。需要完全掌控数据读写与筛选→ 裸用useVariables()自行管理搜索、激活集合与 CRUD。一句话总结useVariablesDialogState()是「不要表格、只要轻量改名交互」时的开箱即用中间件它把内联重命名状态机、焦点管理与底层变量 CRUD 打包成单一返回值让自定义变量对话框的实现成本降到最低。相关 APIuseVariables底层变量读写 composable本 API 的基座useVariablesEditor高层整合方案内部组合对话框状态与表格useVariablesTable表格列定义相关 APISDK API 总览源码参考variables/dialog/use.ts、variables/use.ts、editor/inline-rename/use.ts、variables/editor/use.ts赞分享前端桌面应用AI 应用MCP 服务【免费下载链接】open-pencilAI-native design editor. Open-source Figma alternative.项目地址https://gitcode.com/gh_mirrors/op/open-pencil点击查看免费下载相关推荐Open Pencil:使用 useVariablesDialogState 构建自定义变量对话框的完整指南Open Pencil:使用 useVariablesDialogState 构建自定义变量对话框的完整指南 useVariablesDialogState 是前端桌面应用AI 应用MCP 服务Open-Pencil 变量对话框状态管理useVariablesDialogState 组合式 API 深度解析Open Pencil 变量对话框状态管理useVariablesDialogState 组合式 API 深度解析 useVariablesDialogSta前端桌面应用AI 应用MCP 服务Open Pencil SDK用 useVariables 组合式函数构建自定义变量编辑 UIOpen Pencil SDK用 useVariables 组合式函数构建自定义变量编辑 UI useVariables 是 Open Pencil Vue前端桌面应用AI 应用MCP 服务上一篇显卡驱动残留深度清理指南从问题诊断到长期维护的完整解决方案下一篇Loop5大创新功能重塑你的Mac窗口管理体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站