📌
该文章由丸子引导AI辅助制作生成,如有改进意见,欢迎评论区留言。
这是一次探索记录:通过线上实测与运行时源码把「隐式传参」机制彻底摸清,并利用它的写入逻辑,突破了官方对目标地址类型的限制。
结论先行
在 e-builder 设计器给按钮配「打开页面」事件、传参方式选 隐式传参 时:
- 参数不拼在 URL 上,而是以目标链接地址为 key,写入
sessionStorage.jumplinkParams; - URL 上只带一个
?jumplinkParamKey=<目标地址URL编码>,它只是「取数钥匙」; - 目标页是 e-builder 页面 → 平台运行时自动消费参数,无需写代码;
- 目标页是 e-code 自定义页面(
/sp/custom/...)→ 官方说不支持,但写入端不分目标类型,手动读 sessionStorage 即可突破限制(见第六节)。
一句话:URL 是钥匙,sessionStorage 是保险箱。
一、先读平台原文
「隐式传参」这个选项自带三条官方说明,很多结论其实都写在里面:
- URL 链接地址后面不会拼接参数,所以没有参数长度限制;
- 当打开页面链接地址非 EB 内部地址(包括页面、布局、报表、视图、多级填报等)时不支持隐式传参,只能以 URL 方式传参;
- 如果手动输入的 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(): 按目标地址把参数写入 sessionStoragefunction 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 内部地址。
我验证的链路也印证了这一点:
demo-page1是 e-code 页面,加载的是 ecodesdk 运行时,脚本列表里没有 ebdcoms / ebdpage;- 它的源码(
DemoPage.js/DataList.js/entry.js)是纯展示页,没有任何读 URL 或 sessionStorage 的代码; - 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=123123123131231 | location.search / useSearchParams 直接读 | 明文可见 | 受 URL 长度限制 |
| 隐式传参 | 仅 ?jumplinkParamKey=... | 读 sessionStorage.jumplinkParams(见第六节) | 不可见,相对更安全 | 无限制(原文第 1 条) |
- 参数不想暴露在 URL、不想被分享链接带出 → 用隐式传参;
- 参数特别长(如大段文本)→ 用隐式传参,没有 URL 长度限制;
- 要简单直接、支持分享链接、目标可能是任意页面 → 用 URL 传参。
八、注意事项
- 会话内有效:参数存在
sessionStorage,同一浏览器会话内的跳转都能读到,新窗口/新标签页打开也没问题(我实测过); - 按 key 覆盖:多次跳转同一地址会覆盖该地址下的参数;不同地址互不影响。
- key 精确匹配:
jumplinkParamKey的值 = 目标链接地址(encodeURIComponent 编码),读取时优先按原值匹配,兼容decodeURIComponent后再匹配(上面工具函数已处理)。 - 混用优先级:URL 传参 + 隐式传参同时存在时,URL 上会同时有普通 query 和
jumplinkParamKey,两者参数合并,普通 query 优先——这正是原文第 3 条说的:URL 上自定义拼接的参数优先级高于参数设置。
如果你在别的 E10 版本上行为有差异,或者有更优雅的解法,欢迎评论区交流。