news 2026/9/18 1:58:11

ctx.router 编程式导航完全指南:在 NocoBase RunJS 中实现页面跳转、历史控制与数据传递

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ctx.router 编程式导航完全指南:在 NocoBase RunJS 中实现页面跳转、历史控制与数据传递

ctx.router 编程式导航完全指南:在 NocoBase RunJS 中实现页面跳转、历史控制与数据传递

【免费下载链接】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

ctx.router 是 NocoBase RunJS 运行环境中基于 React Router 封装的路由实例,用于在 JS 区块(JSBlock)、JS 字段(JSField)、JS 操作(JSAction)、联动规则与事件流等场景中通过代码完成页面跳转、后退、刷新与历史记录控制。本文完整讲解ctx.router.navigate()的签名、参数与典型用法,并结合ctx.routectx.locationctx.urlSearchParams梳理「导航动作」与「路由状态」的分工,最后给出源码层面的实现依据,帮助你写出可复制、可维护的编程式导航代码。

适用场景

ctx.router解决的是「用代码而不是点击链接来改变页面」的问题,在 NocoBase 的低代码页面里非常常见:

场景说明
JSBlock / JSField按钮点击后跳转到详情页、列表页或外部链接
联动规则 / 事件流提交成功后navigate到列表或详情,或传递 state 到目标页
JSAction / 事件处理在表单提交、链接点击等逻辑中执行路由跳转
视图导航内部视图栈切换时通过navigate更新 URL

注意:ctx.router仅在存在路由上下文的 RunJS 环境中可用(如页面内的 JSBlock、Flow 页面、事件流等);在纯后端或无路由的上下文(如工作流)中可能为空。

类型定义

router: Router

Router来自@remix-run/router,在 RunJS 中通过ctx.router.navigate()实现跳转、后退、刷新等导航操作。

从源码结构看,客户端路由由 RouterManager 负责创建:它支持hashbrowsermemory三种路由类型(对应createHashRoutercreateBrowserRoutercreateMemoryRouter),并把RouterBridgeCustomRouterContextProviderVariablesProvider等能力挂载到路由树外层。这意味着ctx.routerctx.routectx.location共享同一个路由实例,navigate()之后这些状态会自动同步更新。

方法

ctx.router.navigate()

跳转到目标路径,或执行后退/刷新。

签名:

navigate(to: string | number | null, options?: RouterNavigateOptions): Promise<void>

参数:

  • to:目标路径(string)、相对历史位置(number,如-1表示后退)或null(刷新当前页)
  • options:可选配置
    • replace?: boolean:是否替换当前历史记录(默认false,即 push 新记录)
    • state?: any:传递给目标路由的 state。该数据不会出现在 URL 中,可在目标页通过ctx.location.state访问,适用于敏感信息、临时数据或不宜放在 URL 中的信息

示例

基础跳转

// 跳转到用户列表(push 新历史,可后退) ctx.router.navigate('/admin/users'); // 跳转到详情页 ctx.router.navigate(`/admin/users/${recordId}`);

字符串形式的to可以直接拼接动态参数。NocoBase 管理后台的页面路径一般以/admin为前缀,recordId可来自ctx.route.paramsctx.location.search或表单当前记录。

替换历史(无新增记录)

// 登录后重定向到首页,用户后退不会回到登录页 ctx.router.navigate('/admin', { replace: true }); // 表单提交成功后替换当前页为详情页 ctx.router.navigate(`/admin/users/${newId}`, { replace: true });

replace: true会替换当前历史记录而不新增,适合「不允许用户后退回到上一页」的流程,例如登录重定向、表单提交成功跳转等。

传递 state

// 跳转时携带数据,目标页通过 ctx.location.state 获取 ctx.router.navigate('/admin/users/123', { state: { from: 'dashboard', tab: 'profile' } });

state适合传递敏感信息或临时数据,因为它不会出现在 URL 中。需要注意的是,state会保存在浏览器历史中,前进/后退时仍可访问,但刷新页面后会丢失。

后退与刷新

// 后退一页 ctx.router.navigate(-1); // 后退两页 ctx.router.navigate(-2); // 刷新当前页 ctx.router.navigate(null);

数字形式的to表示相对历史位置,负数即后退;null表示重新加载当前路由(等价于刷新)。

与 ctx.route、ctx.location 的关系

在 NocoBase RunJS 中,路由上下文由三个对象配合使用:

用途推荐用法
导航跳转ctx.router.navigate(path)
读取当前路径ctx.route.pathnamectx.location.pathname
读取跳转时传递的 statectx.location.state
读取路由参数ctx.route.params

ctx.router负责「导航动作」,ctx.routectx.location负责「当前路由状态」。

三者对应的文档为:

  • ctx.route:当前路由匹配信息(pathname、params 等)。其params从路由模板(如/admin/:name)中解析动态参数,pathnamectx.location.pathname一致;
  • ctx.location:当前 URL 位置(pathname、search、hash、state),跳转后state在此读取。Location来自react-router-dom,与 React Router 的useLocation()返回值一致;
  • ctx.urlSearchParams:由ctx.location.search解析而来的查询参数对象,读取 query 比手动new URLSearchParams()更便捷。

综合实战:提交成功后跳转并携带状态

把以上能力组合起来,即可实现一个典型的「表单提交 → 跳转详情页 → 目标页根据来源展示提示」完整链路:

// 源页面(表单提交成功后) const newId = ctx.route.params?.id; // 或来自表单数据 ctx.router.navigate(`/admin/users/${newId}`, { replace: true, state: { from: 'form', message: '创建成功' } });
// 目标页面(详情页 JSBlock 中读取) const prevState = ctx.location.state; if (prevState?.from === 'form') { ctx.message.success(prevState.message); }

注意

  • navigate(path)默认会 push 新历史记录,用户可通过浏览器后退返回
  • replace: true会替换当前历史记录而不新增,适用于登录后重定向、提交成功跳转等场景
  • 关于state参数
    • 通过state传递的数据不会出现在 URL 中,适合敏感或临时数据
    • 在目标页可通过ctx.location.state访问
    • state会保存在浏览器历史中,前进/后退时仍可访问
    • 刷新页面后state会丢失

相关

  • ctx.route:当前路由匹配信息(pathname、params 等)
  • ctx.location:当前 URL 位置(pathname、search、hash、state),跳转后state在此读取
  • RunJS 概述:RunJS 的执行环境、顶层 await、模块导入与容器渲染能力
  • RouterManager 实现:客户端路由的创建与三种路由类型配置

【免费下载链接】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),仅供参考

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

跨平台桌面应用开发:从Electron到Tauri,用Rust+Vue打造轻量级工具

上个月给客户交付一个内部设备调试工具&#xff0c;我盯着安装目录里那个 224MB 的产物愣了很久。界面就三个 Tab&#xff0c;功能主要是串口读写和参数配置&#xff0c;用 Electron 包了一层&#xff0c;最后体积比用户电脑上半个浏览器还大。用户吐槽更直白&#xff1a;这工具…

作者头像 李华
网站建设 2026/9/18 1:55:29

线性模型与非线性模型怎么分:从函数定义到参数判断

/* 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 1:54:24

慢性阻塞性肺病病历.doc结构化:从格式解析到临床数据抽取

简介&#xff1a;《慢性阻塞性肺病病历.doc》是一份临床医学教学用标准病历文档&#xff0c;适合医学生、规培医师及临床带教老师参考&#xff0c;完整记录了一例63岁土家族女性COPD患者的入院诊疗过程。资源共1个doc文件&#xff0c;压缩包仅55KB&#xff0c;内容包含主诉、现…

作者头像 李华
网站建设 2026/9/18 1:53:54

Chrome设备模拟调试移动端页面的完整指南

1. 为什么要在Chrome里调试特定机型的屏幕效果做前端的人大概都撞过这类场景&#xff1a;设计稿明明切得完美无缺&#xff0c;代码在电脑上怎么看都正常&#xff0c;结果测试或者客户甩过来一张截图&#xff0c;说在某某安卓机上页面错乱了&#xff0c;文字溢出、按钮错位、背景…

作者头像 李华
网站建设 2026/9/18 1:53:47

Chrome视频加速全攻略:从控制台到扩展,彻底告别播放器倍速限制

平时刷视频最烦什么&#xff1f;在线课程老师讲话太慢&#xff0c;明明会了还要等进度条&#xff1b;纪录片铺垫太长&#xff0c;就想看个关键结论&#xff1b;回看比赛集锦&#xff0c;前摇后摇都是广告。你可能会说&#xff0c;网站自带倍速播放啊&#xff0c;可很多平台的倍…

作者头像 李华
网站建设 2026/9/18 1:49:42

VimWiki Markdown语法配置:让.md文件直接成为Wiki页面

VimWiki Markdown语法配置&#xff1a;让.md文件直接成为Wiki页面 【免费下载链接】vimwiki Personal Wiki for Vim 项目地址: https://gitcode.com/GitHub_Trending/vi/vimwiki VimWiki 是 Vim 里的一款个人 Wiki 插件&#xff0c;而它的 Markdown 语法配置 功能&#…

作者头像 李华