本文摘要
泛微 E10 e-builder 设计器里按钮配置「打开页面」并选择隐式传参时,参数不会拼到 URL 上,而是以目标链接地址为 key 写入 sessionStorage.jumplinkParams,URL 只带一个 jumplinkParamKey。文章先给出平台「隐式传参」选项的三条官方原文(URL 不拼参数、非 EB 内部地址不支持隐式传参、URL 自定义拼接参数优先级高于参数设置),再基于线上实测与运行时 JS 源码验证拆解写入端与读取端逻辑。关键突破:尽管官方称目标地址非 EB 内部地址(页面、布局、报表、视图、多级填报等)时不支持隐式传参,但写入端并不区分目标类型,e-code 自定义页面(/sp/custom/...)可通过手动读取 sessionStorage 突破该限制,附可直接复用的读取工具函数与 URL 传参对比。

📌

该文章由丸子引导AI辅助制作生成,如有改进意见,欢迎评论区留言。

这是一次探索记录:通过线上实测与运行时源码把「隐式传参」机制彻底摸清,并利用它的写入逻辑,突破了官方对目标地址类型的限制。

结论先行

在 e-builder 设计器给按钮配「打开页面」事件、传参方式选 隐式传参 时:

  1. 参数不拼在 URL 上,而是以目标链接地址为 key,写入 sessionStorage.jumplinkParams;
  2. URL 上只带一个 ?jumplinkParamKey=<目标地址URL编码>,它只是「取数钥匙」;
  3. 目标页是 e-builder 页面 → 平台运行时自动消费参数,无需写代码;
  4. 目标页是 e-code 自定义页面(/sp/custom/...)→ 官方说不支持,但写入端不分目标类型,手动读 sessionStorage 即可突破限制(见第六节)。

一句话:URL 是钥匙,sessionStorage 是保险箱。

一、先读平台原文

「隐式传参」这个选项自带三条官方说明,很多结论其实都写在里面:

  1. URL 链接地址后面不会拼接参数,所以没有参数长度限制;
  2. 当打开页面链接地址非 EB 内部地址(包括页面、布局、报表、视图、多级填报等)时不支持隐式传参,只能以 URL 方式传参;
  3. 如果手动输入的 URL 链接地址上自定义拼接的参数和参数设置中重名,URL 自定义拼接的参数优先级高于参数设置。

第 2 条是全文最重要的背景:目标地址必须是 EB 内部地址,隐式传参才成立。后文的实测与突破,本质就是围绕第 2 条展开的。

二、场景

设计器(ebddesigner)里给按钮配置了「单击 → 打开页面」事件:

  • 链接地址:/sp/custom/demo-page1/dashboard(自定义链接,当前页打开)
  • 参数:testaaaaaaaaaa = 123123123131231
  • 传参方式:隐式传参(勾选)

问题来了:跳过去之后,这个参数到底传给目标页没有?目标页怎么拿?

三、点击后实际发生了什么(实测)

发布页上点按钮,跳转后的 URL:

/sp/custom/demo-page1/dashboard?jumplinkParamKey=%2Fsp%2Fcustom%2Fdemo-page1%2Fdashboard
  • URL 上只有 jumplinkParamKey,值是目标链接地址的 URL 编码;
  • 找不到 testaaaaaaaaaa——它根本没上 URL(对应原文第 1 条:URL 后面不拼参数,自然也没有参数长度限制)。

参数在这里,sessionStorage:

// sessionStorage["jumplinkParams"]
{
"/sp/custom/demo-page1/dashboard": {
"testaaaaaaaaaa": "123123123131231"
}
}

结构很清楚:外层 key 是目标链接地址,内层才是真正的参数对象。

四、运行时是怎么实现的

从 e-builder 运行时 JS(ebdcoms/lib_b8bdedbc.js)里扒出来的核心逻辑,逻辑很朴素:

写入端(跳转源页面触发):

// se(): 按目标地址把参数写入 sessionStorage
function se(e, t) {
var n = JSON.parse(sessionStorage.getItem("jumplinkParams") || "{}");
n[e] = t; // e = 目标链接地址, t = 参数对象
sessionStorage.setItem("jumplinkParams", JSON.stringify(n));
}
// 隐式传参时:URL 只拼 jumplinkParamKey,参数不进 URL
// Fe = Q ? `${目标地址}?jumplinkParamKey=${encodeURIComponent(be)}` : ...;
// se(be, 参数对象);

读取端(目标 e-builder 页面加载时执行):

var f = (function (e) {
var t = JSON.parse(sessionStorage.getItem("jumplinkParams") || "{}");
var n = t[e] || t[decodeURIComponent(e)] || {};
var i = {};
Object.keys(n).forEach(function (k) {
i[decodeURIComponent(k)] = decodeURIComponent(n[k]); // 平台写入时做了编码,这里统一解码
});
return i;
})(qs.parse(location.search).jumplinkParamKey);
// 最终合并进页面参数:{...页面变量默认值, ...隐式参数, ...urlParams, ...URL query}

ebdpage 运行时还暴露了配套 API:getImplicitParams()(读)和 setImplicitParams(addr, params)(写)。e-builder 目标页的自动消费就是走的这套逻辑。

五、官方限制:e-code 页面收不到

官方原文第 2 条说得明白:目标地址非 EB 内部地址(页面、布局、报表、视图、多级填报等)时不支持隐式传参,只能 URL 传参。/sp/custom/... 的 e-code 页面正好不属于 EB 内部地址。

我验证的链路也印证了这一点:

  1. demo-page1 是 e-code 页面,加载的是 ecodesdk 运行时,脚本列表里没有 ebdcoms / ebdpage;
  2. 它的源码(DemoPage.js / DataList.js / entry.js)是纯展示页,没有任何读 URL 或 sessionStorage 的代码;
  3. e-code 的 init.js、ecodesdk/lib.js、utils/lib.js 里都搜不到 jumplink / getImplicitParams。

所以「官方不支持」是事实:参数写进了 sessionStorage(写入端正常),但 e-code 目标页不会自动消费,默认也没人手动读,参数实际不生效。

六、突破官方限制:e-code 页面手动读

官方限制说的是「自动传参不支持」,但写入端并不区分目标类型——不管目标是 e-builder 还是 e-code,跳转时参数都会照写进 sessionStorage.jumplinkParams,URL 也照带 jumplinkParamKey。

突破口就在这里:e-code 页面只要自己在代码里按 jumplinkParamKey 去 sessionStorage 取数,隐式传参在非 EB 内部地址上照样能跑通,等于绕过了官方第 2 条的限制。

把下面两个函数放进你的工具文件(如 utils/implicitParams.js),任何 e-code 项目都能直接用:

/**
* 读取当前页面 URL 上 jumplinkParamKey 对应的隐式传参
* @returns {object} 参数对象;无参数或解析失败时返回 {}
*/
export function getImplicitLinkParams() {
const key = new URLSearchParams(window.location.search).get('jumplinkParamKey');
if (!key) return {};
try {
const all = JSON.parse(sessionStorage.getItem('jumplinkParams') || '{}');
const params = all[key] || all[decodeURIComponent(key)] || {};
// 平台写入时会对 key/value 做 encodeURIComponent,这里统一解码
const result = {};
Object.keys(params).forEach((k) => {
result[decodeURIComponent(k)] = decodeURIComponent(params[k]);
});
return result;
} catch (e) {
return {};
}
}
/**
* 读取指定 key 的隐式参数值
* @param {string} name 参数名
* @param {*} defaultVal 默认值
*/
export function getImplicitLinkParam(name, defaultVal) {
const params = getImplicitLinkParams();
return params[name] !== undefined ? params[name] : defaultVal;
}

组件里直接用:

import { getImplicitLinkParams, getImplicitLinkParam } from './utils/implicitParams';
const params = getImplicitLinkParams();
console.log(params.testaaaaaaaaaa); // "123123123131231"
const val = getImplicitLinkParam('testaaaaaaaaaa', '默认值');

七、URL 传参 vs 隐式传参,怎么选

传参方式URL 表现e-code 页面获取方式参数可见性参数长度
URL 传参?testaaaaaaaaaa=123123123131231location.search / useSearchParams 直接读明文可见受 URL 长度限制
隐式传参仅 ?jumplinkParamKey=...读 sessionStorage.jumplinkParams(见第六节)不可见,相对更安全无限制(原文第 1 条)
  • 参数不想暴露在 URL、不想被分享链接带出 → 用隐式传参;
  • 参数特别长(如大段文本)→ 用隐式传参,没有 URL 长度限制;
  • 要简单直接、支持分享链接、目标可能是任意页面 → 用 URL 传参。

八、注意事项

  1. 会话内有效:参数存在 sessionStorage,同一浏览器会话内的跳转都能读到,新窗口/新标签页打开也没问题(我实测过);
  2. 按 key 覆盖:多次跳转同一地址会覆盖该地址下的参数;不同地址互不影响。
  3. key 精确匹配:jumplinkParamKey 的值 = 目标链接地址(encodeURIComponent 编码),读取时优先按原值匹配,兼容 decodeURIComponent 后再匹配(上面工具函数已处理)。
  4. 混用优先级:URL 传参 + 隐式传参同时存在时,URL 上会同时有普通 query 和 jumplinkParamKey,两者参数合并,普通 query 优先——这正是原文第 3 条说的:URL 上自定义拼接的参数优先级高于参数设置。

如果你在别的 E10 版本上行为有差异,或者有更优雅的解法,欢迎评论区交流。