NocoBase RunJS 视图上下文 `ctx.view` 完全指南:弹窗、抽屉与内嵌视图的控制核心
NocoBase RunJS 视图上下文ctx.view完全指南弹窗、抽屉与内嵌视图的控制核心【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase在 NocoBase 的 RunJS 执行环境中ctx.view是当前激活视图弹窗、抽屉、气泡层、嵌入式区域等的控制器它既是视图级信息的读取入口视图类型、打开参数也是视图级操作的执行入口关闭、更新、渲染头部与底部、页面内 Tab 导航。本指南将围绕ctx.view的类型定义、常用属性方法、inputArgs参数体系、与ctx.viewer/ctx.openView的分工关系展开讲解并结合packages/core/flow-engine的源码实现帮助你在弹窗表单、关联选择器、JSBlock、事件流等场景中熟练操控视图生命周期。什么是ctx.viewctx.view代表「当前所在」的视图实例它由FlowViewContext提供仅在通过ctx.viewer或ctx.openView打开的视图内容中可用。从源码看ctx.view的注入位置位于packages/core/flow-engine/src/views/useDialog.tsx与packages/core/flow-engine/src/views/useDrawer.tsx当调用dialog()/drawer()打开视图时会创建一个独立的作用域引擎createViewScopedEngine随后通过ctx.defineProperty(view, { get: () currentDialog })把当前视图实例挂到上下文中再用FlowViewContextProvider包住视图内容FlowContextProvider.tsx。// useDialog.tsx / useDrawer.tsx 中的核心装配逻辑简化 const scopedEngine createViewScopedEngine(flowContext.engine); ctx.defineProperty(view, { get: () currentDialog }); return ( FlowEngineProvider engine{scopedEngine} FlowViewContextProvider context{ctx} DialogWithContext / /FlowViewContextProvider /FlowEngineProvider );对应的 React Hooks 封装位于 FlowContextProvider.tsxexport function useFlowViewContextT FlowEngineContext() { return useContext(FlowViewContext) as T; } export function useFlowView() { const ctx useFlowContext(); return ctx.view as FlowView; }也就是说在 JSX 渲染的视图内容中你可以用useFlowViewContext()拿到完整上下文再访问ctx.view在 RunJS 脚本中则直接使用ctx.view。注意ctx.view仅在有视图上下文的 RunJS 环境中可用如ctx.viewer.dialog()的 content 内、弹窗表单、关联选择器内部在普通页面或后端上下文中为undefined使用时建议做可选链判断ctx.view?.close?.()。适用场景场景说明弹窗/抽屉内容在content中通过ctx.view.close()关闭当前视图或使用Header、Footer渲染标题和底部表单提交后提交成功后调用ctx.view.close(result)关闭并回传结果JSBlock / Action根据ctx.view.type判断当前视图类型或读取ctx.view.inputArgs中的打开参数关联选择、子表格读取inputArgs中的collectionName、filterByTk、parentId等做数据加载类型定义ctx.view的完整类型定义可在源码 FlowView.tsx 中找到与文档中的描述一一对应type FlowView { type: drawer | popover | dialog | embed; inputArgs: Recordstring, any; Header: React.FC{ title?: React.ReactNode; extra?: React.ReactNode } | null; Footer: React.FC{ children?: React.ReactNode } | null; close: (result?: any, force?: boolean) void; update: (newConfig: any) void; navigation?: ViewNavigation; destroy?: () void; submit?: () Promiseany; // 流配置视图中可用 };从源码实现看还有两个文档未列出的可选成员值得注意beforeClose?: FlowViewBeforeCloseHandler关闭前的钩子函数返回false可阻止关闭具体逻辑见 runViewBeforeClose.tspreventClose?: boolean由打开配置传入为true时close()默认返回false不关闭除非显式传force true。其中close的完整签名在源码中为(result?: any, force?: boolean) Promiseboolean | void | boolean | void即它可能返回一个布尔值表示是否真正关闭当beforeClose拦截或preventClose生效时返回false。视图类型type类型说明drawer抽屉从侧边滑出适合编辑类操作popover气泡层轻量浮层dialog居中弹窗Modal适合详情/确认类操作embed嵌入式区域不遮挡页面主体无独立 zIndex在 FlowView.tsx 中可以看到一个细节embed类型不会设置过高的zIndex以避免遮挡菜单折叠按钮图标其余类型会按打开的先后顺序递增zIndex。常用属性和方法属性/方法类型说明typedrawer \| popover \| dialog \| embed当前视图类型inputArgsRecordstring, any打开视图时传入的参数见下方HeaderReact.FC \| null头部组件用于渲染标题、操作区FooterReact.FC \| null底部组件用于渲染按钮等close(result?, force?)void关闭当前视图可传result回传给调用方update(newConfig)void更新视图配置如宽度、标题navigationViewNavigation \| undefined页面内视图导航含 Tab 切换等目前仅dialog和drawer支持Header和Footer。Header / Footer 的实现原理Header与Footer并非普通渲染组件而是「插槽」组件它们在视图内部被渲染时通过useEffect把children/title/extra同步到视图容器的头部与底部区域自身渲染null见 useDialog.tsx。// useDialog.tsx 中的 Footer 组件简化 const FooterComponent: React.FC{ children?: React.ReactNode } ({ children }) { React.useEffect(() { currentFooter children; dialogRef.current?.setFooter(children); return () { currentFooter null; dialogRef.current?.setFooter(null); }; }, [children]); return null; // Footer 组件本身不渲染内容 };这意味着你可以在视图内容的任意位置声明Header title... /与Footer.../Footer它们会自动「上浮」到弹窗/抽屉的标题栏和底部按钮栏。close 的完整流程close(result?, force?)的执行路径以 dialog 为例见 useDialog.tsx若preventClose !force直接返回false不关闭调用runViewBeforeClose(currentDialog, { result, force })执行beforeClose钩子若钩子返回false则不关闭runViewBeforeClose.ts若视图由路由触发且存在navigation.back则交由路由系统销毁视图并清理 URL否则调用destroy(result)销毁 DOM 元素、执行onClose回调、resolvePromise(result)并通过事件通知上层视图恢复激活状态VIEW_ACTIVATED_EVENT。其中resolvePromise(result)意味着close(result)的result会传递给ctx.viewer.open()返回的 Promise调用方可以在await ctx.viewer.dialog({...})之后拿到关闭时回传的结果。navigation页面内视图导航ctx.view.navigation是ViewNavigation实例实现位于 ViewNavigation.ts它维护一个不可变的viewStack视图栈提供changeTo(viewParam)替换栈顶视图参数并用replace方式导航如切换 TabnavigateTo(viewParam, opts?)向栈中压入新视图并用push方式导航back()弹出栈顶视图并导航回上一级。URL 由generatePathnameFromViewParams生成例如[{ viewUid: xxx }, { viewUid: yyy }]会得到/admin/xxx/view/yyy其中filterByTk、sourceId、tabUid都会被编码进路径段因此视图状态是可刷新保持的。inputArgs 常见字段不同打开场景下inputArgs字段不同常见包括字段说明viewUid视图 UIDcollectionName数据表名filterByTk主键筛选单条详情parentId父级 ID关联场景sourceId来源记录 IDparentItem父项数据scene场景如create、edit、selectonChange选择/变更后的回调tabUid当前 Tab UID页面内inputArgs直接来自打开时的配置config.inputArgs || {}并在视图中保持响应式。通过ctx.getVar(ctx.view.inputArgs.xxx)或ctx.view.inputArgs.xxx访问。值得说明的是inputArgs中还有一个特殊的hidden字段形如{ value: boolean }用于「先渲染但暂不显示」的视图场景见 useDialog.tsx首次挂载时若hidden.value为真视图内容会先返回null。示例关闭当前视图// 提交成功后关闭弹窗 await ctx.resource.runAction(create, { data: formData }); ctx.view?.close(); // 关闭并回传结果 ctx.view?.close({ id: newRecord.id, name: newRecord.name });结合上文源码可以知道第二个示例中{ id, name }会成为ctx.viewer.open()返回 Promise 的 resolve 值方便调用方在打开处继续处理。在 content 中使用 Header / Footerfunction DialogContent() { const ctx useFlowViewContext(); const { Header, Footer, close } ctx.view; return ( div Header title编辑 extra{Button sizesmall帮助/Button} / div表单内容.../div Footer Button onClick{() close()}取消/Button Button typeprimary onClick{handleSubmit}确定/Button /Footer /div ); }注意Header/Footer只在dialog与drawer中有效popover/embed中它们为null需要先做判空或按视图类型分支。根据视图类型或 inputArgs 做分支if (ctx.view?.type embed) { // 嵌入式视图中隐藏头部 ctx.model.setProps(headerStyle, { display: none }); } const collectionName ctx.view?.inputArgs?.collectionName; if (collectionName users) { // 用户选择器场景 }这种分支写法在关联字段选择器、子表格编辑等「同一组件被多种视图复用」的场景中非常实用。仓库中packages/core/client-v2/src/flow/models/fields/AssociationFieldModel/RecordSelectFieldModel.tsx等文件就大量使用了useFlowViewContext与ctx.view来感知当前所在视图并读取打开参数。与 ctx.viewer、ctx.openView 的关系用途推荐用法打开新视图ctx.viewer.dialog()/ctx.viewer.drawer()或ctx.openView()操作当前视图ctx.view.close()、ctx.view.update()获取打开参数ctx.view.inputArgsctx.viewer负责「打开」视图ctx.view表示「当前」所在视图实例ctx.openView用于打开已配置的流程视图。三个 API 的分工可以从源码层面进一步确认ctx.viewer是FlowViewer类的实例FlowView.tsx提供dialog()、drawer()、popover()、embed()四个方法统一走open()方法分配递增的zIndex并挂载视图其 content 可以是任意 React 内容字符串内容会经DOMPurify.sanitize净化后渲染ctx.view是FlowViewer.open()返回对象的一部分Object.assign(promise, currentDialog)因此你甚至可以直接拿到返回对象调用close()/update()而不必等视图内部自己关闭ctx.openView(uid, options)打开的是 FlowPageChildPageModel内部渲染完整流程页面若 uid 对应的模型不存在会自动创建 PopupActionModel 并持久化。更详细的行为与参数可参考 ctx.openView() 文档。另外与轻量级弹窗相关的ctx.modal信息、确认等可在 ctx.modal 文档 中查看。注意事项ctx.view仅在视图内部可用普通页面中为undefined使用可选链ctx.view?.close?.()避免在无视图上下文时报错close(result)的result会传递给ctx.viewer.open()返回的 Promise若视图配置了preventClose普通close()会被拒绝需要传force true强制关闭Header/Footer目前仅在dialog和drawer中生效destroy具备幂等保护源码中的destroyed标志多次调用不会重复销毁因此路由清理与手动关闭可以安全叠加相关ctx.openView()打开已配置的流程视图ctx.modal轻量级弹窗信息、确认等FlowView.tsxFlowView类型与FlowViewer类源码useDialog.tsx / useDrawer.tsx视图生命周期与上下文装配实现FlowContextProvider.tsxFlowViewContext与useFlowViewContext/useFlowView/useFlowViewer定义ctx.viewer提供dialog()、drawer()、popover()、embed()等方法打开视图其打开的content内可访问ctx.view。【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

微电网电能共享的非对称纳什谈判Matlab实现

微电网电能共享的非对称纳什谈判Matlab实现

## 1. 项目背景与核心价值微电网作为分布式能源的重要载体,其电能共享机制直接影响着可再生能源的消纳效率和运营经济性。传统集中式调度模式难以适应多微网系统的高度自治特性,而非对称纳什谈判理论恰好为解决这一矛盾提供了数学工具。我在参与某工业园…

2026/9/18 9:10:57 阅读更多 →
opbase aclnn 张量元数据接口解析:aclGetFormat 获取 aclTensor 数据布局格式的原理与实践

opbase aclnn 张量元数据接口解析:aclGetFormat 获取 aclTensor 数据布局格式的原理与实践

opbase aclnn 张量元数据接口解析:aclGetFormat 获取 aclTensor 数据布局格式的原理与实践 【免费下载链接】opbase 本项目是CANN算子库的基础框架库,为算子提供公共依赖文件和基础调度能力。 项目地址: https://gitcode.com/cann/opbase 本篇围绕…

2026/9/18 9:09:56 阅读更多 →
Windows更改电脑用户名:C:\Users中文路径修复与账户迁移指南

Windows更改电脑用户名:C:\Users中文路径修复与账户迁移指南

上周帮同事远程处理一台装不上 PyTorch 的机器,报错信息里那串OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败后面跟着的路径,我一眼就看出病根了——C:\Users\24303\.conda\envs\pytorch\lib\site-packages\torch\lib\c10.dll。那个24303是拿…

2026/9/18 9:09:56 阅读更多 →

最新新闻

Visual Studio 2022从安装到跑通C/C++项目:全流程配置指南

Visual Studio 2022从安装到跑通C/C++项目:全流程配置指南

做开发这么多年,我几乎每年都要在新电脑、新虚拟机、新工作环境里把Visual Studio 2022从头到尾装一遍。说实话,VS2022的安装界面第一次看确实有点唬人——工作负载、单个组件、安装位置、缓存目录,一堆选项摆在那里,像是在配置什…

2026/9/18 10:47:12 阅读更多 →
基于AT89C52与ADC0832的一氧化碳检测报警器设计

基于AT89C52与ADC0832的一氧化碳检测报警器设计

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

2026/9/18 10:47:12 阅读更多 →
ModelScope 命令行完整指南:下载模型、管理仓库、清理缓存一步到位

ModelScope 命令行完整指南:下载模型、管理仓库、清理缓存一步到位

ModelScope 命令行完整指南:下载模型、管理仓库、清理缓存一步到位 【免费下载链接】modelscope ModelScope: bring the notion of Model-as-a-Service to life. 项目地址: https://gitcode.com/GitHub_Trending/mo/modelscope ModelScope 是阿里巴巴开源的模…

2026/9/18 10:47:12 阅读更多 →
Cloudflare Workers 兼容性标志 `cache_no_cache_enabled` 全解析:在 `fetch()` 中启用标准 `cache: no-cache`

Cloudflare Workers 兼容性标志 `cache_no_cache_enabled` 全解析:在 `fetch()` 中启用标准 `cache: no-cache`

Cloudflare Workers 兼容性标志 cache_no_cache_enabled 全解析:在 fetch() 中启用标准 cache: no-cache 【免费下载链接】cloudflare-docs Cloudflare’s documentation 项目地址: https://gitcode.com/GitHub_Trending/cl/cloudflare-docs cache_no_cache_…

2026/9/18 10:47:12 阅读更多 →
5分钟把PC游戏串流到电视和平板:Sunshine 游戏串流服务器上手

5分钟把PC游戏串流到电视和平板:Sunshine 游戏串流服务器上手

5分钟把PC游戏串流到电视和平板:Sunshine 游戏串流服务器上手 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine 是一个开源的自托管游戏串流服务器。把它装在自…

2026/9/18 10:47:12 阅读更多 →
GitHub Pro 申请指南:学生包、免费替代与避坑

GitHub Pro 申请指南:学生包、免费替代与避坑

说 GitHub Pro 申请,先得把一个误会掰正:官方从来就没有一个叫"Pro 申请"的按钮。你在网上刷到的那些教程,本质上讲的是三件完全不同的事——在校学生走 GitHub Education 免费拿 Pro 权益、教师或开源维护者身份获得的免费授权、以…

2026/9/18 10:46:11 阅读更多 →

日新闻

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

很多朋友第一次看到"逻辑回归"这四个字,第一反应就是——这玩意儿是个回归模型吧?我当年也是在Matlab里跑完一段代码,看着输出的0.73、0.86这种概率值,才回过神来:这家伙其实是披着回归外衣的分类神器&#…

2026/9/18 0:00:28 阅读更多 →
高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

简介:这份报告是2023-2028年高值医用耗材行业调研及发展前景趋势预测报告,面向医疗器械企业管理者、投资机构、行业研究人员及关注政策变化的从业者,用于把握行业监管动向、市场格局与未来趋势。报告以PDF格式呈现,共1个文件、整体…

2026/9/18 0:00:28 阅读更多 →
三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

先把我自己的背景交代一下:我之前在搞具身智能和机器人导航相关的项目,很长一段时间里都被“环境表示”这件事卡着。传统做法是用点云或者网格做几何建模,语义信息另外再跑分割模型,两套东西各管各的,时间一长就会发现…

2026/9/18 0:00:28 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →