layui.router()仅解析location.hash中#后的路由,按/分割路径、/key=value提取search参数,不处理?查询字符串;iframe中不可用,参数值含/、=需手动编码解码。

layui.router() 只解析 location.hash 中的路由结构
它不处理 window.location.search(问号后的查询参数),只盯着 #/ 后面那部分。比如当前 URL 是 http://localhost:8080/#/user/list?id=123&tab=info,layui.router() 解析的是 /user/list?id=123&tab=info 这一段,不是整个 URL。
它的底层逻辑是:先截掉 #,再按 / 拆路径,再把末尾形如 key=value 的片段转成对象。所以 id=123&tab=info 会被识别为 search 参数,而不会被当成路径的一部分。
- 如果哈希是
#/user/detail/uid=1001/status=active,path是['user', 'detail'],search是{uid: '1001', status: 'active'} - 如果哈希是
#/system/log?level=error&from=2026-01-01,search会是空对象 —— 因为?不是 layui 路由约定的分隔符,它只认/key=value形式 -
href字段返回的是去掉#后的完整哈希字符串(不含#),hash字段是锚点本身(如xxx),仅当 URL 带#xxx且在/参数之后时才有效
在 iframe 子页面里调用 layui.router() 会失败
子页面没加载主框架的 layui 全局实例,layui.router 根本不存在。直接调用会报 Cannot read property 'router' of undefined,或者返回空对象。这不是配置问题,是作用域和初始化机制决定的 —— router 模块只在主页面的 layui.use 回调中挂载,且依赖主页面的路由上下文。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 不要在 iframe 里写
layui.use(['router'], ...):router 不是独立可加载模块,它不导出解析能力 - 也不要试图让子页也引入 layui.js:即使成功,
layui.router()解析的仍是子页自己的location.hash,而子页通常没有 hash 路由,结果仍是空 - 正确做法是:子页面直接用
new URLSearchParams(window.location.search)或手动解析window.location.search,这才是可靠、无依赖的方式
参数值里的 / 和 = 会导致解析错乱
layui.router() 的解析器不支持对参数值做 URI 编码还原,它用的是简单字符串分割:split('/') 找路径段,再对每个段 split('=') 提取键值。所以如果你传了 name=a/b=c,它会误判成两个参数 name=a 和 b=c,甚至破坏 path 结构。
- 避免在参数值中直接使用
/、=、&等符号;必须传时,应提前encodeURIComponent()编码,比如name=encodeURIComponent('a/b=c') - 但注意:
layui.router().search不会自动decodeURIComponent(),你得自己对每个值做解码,否则拿到的是a%2Fb%3Dc - 更稳妥的做法是改用标准的
URLSearchParams(支持自动编解码),尤其当你控制不了参数来源时
动态模板中嵌入路由参数要小心执行时机
在 lay-url 或 lay-data 属性里写 {{ layui.router().search.xxx }},模板渲染时 layui.router() 必须已就绪。如果模板加载早于 layui 初始化(比如放在 <body> 顶部未包裹 layui.use),表达式会报错或返回 undefined。
- 确保模板所在的容器在
layui.use回调内渲染,或至少等layui全局对象可用后再执行 -
lay-data中的 JSON 字符串需用单引号包裹键名,双引号包裹值,且值必须是字符串字面量,不能是表达式:正确写法是lay-data="{uid:'{{ layui.router().search.uid }}'}",错误写法是lay-data="{uid: {{ layui.router().search.uid }}}" - 若参数为空或未定义,后端可能收到
uid=undefined,建议加默认值判断,例如{{ layui.router().search.uid || 0 }}
layui.router,强行调用只会让控制台变红。该用原生 API 的地方,别迷信框架封装。


















