104 lines
3.1 KiB
JavaScript
104 lines
3.1 KiB
JavaScript
// utils/navigator.js
|
||
export default {
|
||
/**
|
||
* 导航到指定页面
|
||
* @param {string} url - 页面路径
|
||
* @param {object} params - 传递的参数
|
||
* @param {object} options - 导航选项
|
||
* @param {boolean} options.relaunch - 是否使用relaunch方式导航
|
||
* @param {boolean} options.redirect - 是否使用redirect方式导航
|
||
* @param {boolean} options.switchTab - 是否使用switchTab方式导航
|
||
* @returns {Promise} - 导航成功/失败的Promise
|
||
*/
|
||
to(url, params = {}, options = {}) {
|
||
// 处理参数
|
||
const queryString = this._serializeParams(params);
|
||
const fullUrl = queryString ? `${url}?${queryString}` : url;
|
||
|
||
// 根据不同的导航方式调用对应的API
|
||
if (options.relaunch) {
|
||
return this._navigate(uni.reLaunch, fullUrl);
|
||
} else if (options.redirect) {
|
||
return this._navigate(uni.redirectTo, fullUrl);
|
||
} else if (options.switchTab) {
|
||
return this._navigate(uni.switchTab, fullUrl);
|
||
} else {
|
||
return this._navigate(uni.navigateTo, fullUrl);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 返回上一页
|
||
* @param {number} delta - 返回的页面数
|
||
* @returns {Promise} - 导航成功/失败的Promise
|
||
*/
|
||
back(delta = 1) {
|
||
return new Promise((resolve, reject) => {
|
||
uni.navigateBack({
|
||
delta,
|
||
success: resolve,
|
||
fail: reject
|
||
});
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 序列化参数对象为查询字符串
|
||
* @param {object} params - 参数对象
|
||
* @returns {string} - 序列化后的查询字符串
|
||
*/
|
||
_serializeParams(params) {
|
||
return Object.keys(params)
|
||
.filter(key => params[key] !== undefined && params[key] !== null)
|
||
.map(key => {
|
||
const value = params[key];
|
||
// 特殊处理对象类型的参数,先JSON.stringify再encodeURIComponent
|
||
const encodedValue = typeof value === 'object'
|
||
? encodeURIComponent(JSON.stringify(value))
|
||
: encodeURIComponent(value);
|
||
return `${key}=${encodedValue}`;
|
||
})
|
||
.join('&');
|
||
},
|
||
|
||
/**
|
||
* 统一的导航方法,处理Promise包装和错误捕获
|
||
* @param {Function} navApi - uni-app的导航API
|
||
* @param {string} url - 导航URL
|
||
* @returns {Promise} - 导航成功/失败的Promise
|
||
*/
|
||
_navigate(navApi, url) {
|
||
return new Promise((resolve, reject) => {
|
||
navApi({
|
||
url,
|
||
success: (res) => {
|
||
// console.log(`导航成功: ${url}`, res);
|
||
resolve(res);
|
||
},
|
||
fail: (err) => {
|
||
console.error(`导航失败: ${url}`, err);
|
||
reject(err);
|
||
}
|
||
});
|
||
});
|
||
},
|
||
|
||
/**
|
||
* 获取页面参数(处理复杂参数的反序列化)
|
||
* @param {object} options - 页面的onLoad options参数
|
||
* @returns {object} - 解析后的参数对象
|
||
*/
|
||
getParams(options) {
|
||
const params = { ...options };
|
||
Object.keys(params).forEach(key => {
|
||
try {
|
||
// 尝试解析JSON格式的参数
|
||
params[key] = JSON.parse(decodeURIComponent(params[key]));
|
||
} catch (e) {
|
||
// 如果解析失败,使用原始值
|
||
params[key] = decodeURIComponent(params[key]);
|
||
}
|
||
});
|
||
return params;
|
||
}
|
||
}; |