一个处理参数的简单问题,目前查询出来的帖子居然要钱,简直可笑~
确实是只需要修改urlQuery.js即可,改动实际很小。
1. 首先对方法queryGet进行修改:
增加代码 query = { query: JSON.stringify(query) };
直接给原query参数进行重新赋值操作,以确保decode方法无误。因为decode里是对参数内的query键值名做处理的。
queryGet(query) {
// 直接给原query参数进行重新赋值操作,以确保decode方法无误
query = { query: JSON.stringify(query) };
const { encodeURI } = Global.Router.CONFIG; // 获取到路由配置
let [decode, historyObj, strQuery] = [query, query, ''];
switch (encodeURI) {
case true: { // 加密模式
decode = this.decode(query);
strQuery = this.encode(decode);
historyObj = {
query: encodeURIComponent(JSON.stringify(decode)),
};
break;
}
case false: { // 不加密模式
strQuery = this.stringify(query);
break;
}
default: {
err('未知参数模式,请检查 \'encodeURI\'', true);
}
}
return { strQuery, historyObj, decode };
}
2. 再对encode方法进行修改:
我们对它return前的那一行进行变动,也就是formatQuery +=这里,uni.$u.queryParams是uview提供的方法,你可以自定实现功能函数。
console.log(uni.$u.queryParams({name: lisa, age: 20}));
// 结果为:?name=lisa&age=20
所以params的第一行query: encodeURIComponent(strQuery)是对原逻辑的保留,第二行的...query就是实际真正的路径参数了。
结尾的substring(1),是为了去除对象转URL参数后的第一位的?,如果你自己的方法没有这么反,则不需要。
encode(query, intact = true) {
let [strQuery, formatQuery] = ['', ''];
if (query == null) {
warn('加密参数没有传递,你知道?', true);
return '';
}
if (query.constructor === String) { // 字符串 尝试 转成 对象
strQuery = JSON.stringify(this.parse(query));
} else if (query.constructor === Object) { // 直接转成字符串对象即可
if (Object.keys(query).length === 0) {
warn('当前参数不满足加密规范!');
return '';
}
strQuery = JSON.stringify(query);
}
if (intact) {
formatQuery = '?';
}
// 保留query的原逻辑赋值,使用substring去除第一位的?
formatQuery += uni.$u.queryParams({
query: encodeURIComponent(strQuery),
...query,
}).substring(1);
return formatQuery;
}

2266

被折叠的 条评论
为什么被折叠?



