fix(util): 修复跳转链接参数合并与重复拼接问题
1. 重构resolveLinkUrl方法,合并wap_url自带query与page_params,且page_params优先级更高 2. 提取wap_url中的path部分,避免后续跳转重复附加query参数 3. 修复diyRedirectTo中重复解码wap_url和错误传递冗余参数的问题
This commit is contained in:
@@ -353,13 +353,45 @@ export const isPageInRouteList = (currentRoute, routeList) => {
|
||||
|
||||
/**
|
||||
* 解析 link 对象得到最终可跳转的 URL
|
||||
* 优先级: page_key → wap_url → null
|
||||
* 同时把 wap_url 自带的 query 参数与 page_params 合并, 写入 link.page_params;
|
||||
* 并把 link.wap_url 改为不含 query 的 path, 避免后续 redirectTo 重复附加
|
||||
* 优先级: page_params > wap_url query (新机制优先)
|
||||
* @param {Object} link
|
||||
* @returns {string|null}
|
||||
*/
|
||||
export const resolveLinkUrl = (link) => {
|
||||
if (!link) return null;
|
||||
// 优先使用 page_key(新机制)
|
||||
// 0. 把 wap_url 中的 query 合并到 page_params
|
||||
// - 拆分 wap_url 的 query, 与 link.page_params 合并
|
||||
// - page_params 优先 (新机制, 显式声明的参数覆盖 wap_url query)
|
||||
// - 把 link.wap_url 改为不含 query 的 path, 避免后续 redirectTo 二次编码
|
||||
if (link.wap_url) {
|
||||
const decodedWap = decodeEntity(link.wap_url);
|
||||
const queryIdx = decodedWap.indexOf('?');
|
||||
if (queryIdx !== -1) {
|
||||
const path = decodedWap.substring(0, queryIdx);
|
||||
const queryStr = decodedWap.substring(queryIdx + 1);
|
||||
const urlParams = {};
|
||||
queryStr.split('&').forEach(kv => {
|
||||
if (!kv) return;
|
||||
const eqIdx = kv.indexOf('=');
|
||||
const k = eqIdx === -1 ? kv : kv.substring(0, eqIdx);
|
||||
const v = eqIdx === -1 ? '' : kv.substring(eqIdx + 1);
|
||||
if (k) urlParams[k] = v;
|
||||
});
|
||||
// 解析 page_params (可能是字符串或对象)
|
||||
let pageParams = link.page_params;
|
||||
if (typeof pageParams === 'string' && pageParams) {
|
||||
try { pageParams = JSON.parse(pageParams); } catch (e) { pageParams = {}; }
|
||||
}
|
||||
pageParams = pageParams || {};
|
||||
// 合并: page_params 覆盖 urlParams (新机制优先)
|
||||
link.page_params = Object.assign({}, urlParams, pageParams);
|
||||
// 把 link.wap_url 改为不含 query 的 path
|
||||
link.wap_url = path;
|
||||
}
|
||||
}
|
||||
// 1. 优先使用 page_key(新机制)
|
||||
if (link.page_key) {
|
||||
let params = link.page_params;
|
||||
if (typeof params === 'string' && params) {
|
||||
@@ -368,9 +400,9 @@ export const resolveLinkUrl = (link) => {
|
||||
const url = resolvePageUrl(link.page_key, params || {});
|
||||
if (url) return url;
|
||||
}
|
||||
// 回退:旧的 wap_url
|
||||
// 2. 回退:旧的 wap_url(已被处理为不含 query 的 path)
|
||||
if (link.wap_url) {
|
||||
return decodeEntity(link.wap_url);
|
||||
return link.wap_url;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
@@ -1175,7 +1207,7 @@ export default {
|
||||
* @param {Object} link
|
||||
*/
|
||||
diyRedirectTo(link) {
|
||||
console.log(`-----> diyRedirectTo`, link);
|
||||
console.log(`-----> diyRedirectTo`, JSON.stringify(link));
|
||||
//if (link == null || Object.keys(link).length == 1) return;
|
||||
if (link.wap_url) {
|
||||
link.wap_url = decodeEntity(link.wap_url);
|
||||
@@ -1292,7 +1324,10 @@ export default {
|
||||
}
|
||||
|
||||
} else if (link.wap_url) { // 微页面/内部页面
|
||||
this.redirectTo(link.wap_url, {...link});
|
||||
// resolveLinkUrl 已把 wap_url 中的 query 合并到 link.page_params
|
||||
// 这里过滤掉 link 元数据字段, 避免 wap_url/name/parent/title 等被错误附加到目标 URL
|
||||
const { wap_url, name, parent, title, enable_set_title, type, appid, page, mobile, image, ...navParams } = link;
|
||||
this.redirectTo(link.wap_url, { ...navParams, ...(link.page_params || {}) });
|
||||
}
|
||||
},
|
||||
/**
|
||||
|
||||
16
docs/TODO.md
16
docs/TODO.md
@@ -3,3 +3,19 @@
|
||||
- [x] 滚动的文章组件, 应该允许用户介入手动滚动。
|
||||
- [x] 文章列表中图文+文混合模式也需要和滚动的文章组件一样能够处理
|
||||
- [x] 从 TabBar 触发的页面,要重新梳理一下。让TabBar被激活的状态符合逻辑
|
||||
- [x] 切换语言的代码在 `components\hover-nav\hover-nav.vue` 中
|
||||
- [x] `components\hover-nav\hover-nav.vue` 切换语言的按钮,要在所有页面显示一致。现在是主页不显示,会员中心显示了
|
||||
- [x] 隐私弹窗,“不同意”、“同意并继续” 按钮,点击两次,弹窗才消失。
|
||||
- [x] 隐私弹窗在微信小程序环境没有显示,需要处理
|
||||
|
||||
- [x] `components\hover-nav\hover-nav.vue`浮动按钮组的样式,没有缓存的场景,第一次全新启动的时候,没有被设置正确;
|
||||
- [x] 国际化数据请求失败后,会使用缓存数据吗?
|
||||
|
||||
- [x] 由于VR页面,不显示底部的TabBar,进入VR页面,无法回退,也不能进入其他页面。
|
||||
|
||||
## 鸿蒙元服务
|
||||
|
||||
- [x] 鸿蒙元服务暂时使用 H5 隐私弹窗及注册登录机制, 但是始终无法弹出
|
||||
- [x] 商品分类页面没有显示搜索,这是错误的,要和H5、微信小程序环境一样
|
||||
- [x] 会员中心页面(/pages_tool/member/index),点击“登录/注册”, 无法打开登录注册页面
|
||||
- [x] 鸿蒙元服务环境,从其他Tab页面,点击TabBar中的"首页",页面无法跳转。(微信小程序、H5环境都是正常的)
|
||||
Reference in New Issue
Block a user