1. 在ios模拟器上会出现底部留白的情况
解决方案: 在manifest.json文件,找到开源码视图配置,添加如下:
"app-plus" : {
"safearea":{
"bottom":{
"offset" : "none" // 底部安全区域偏移,"none"表示不空出安全区域
}
},
}
2. 想对uni-icon绑定阻止冒泡事件,一直不生效
解决方案:因为uni-icon上拿不到event事件,所以使用.stop 不生效,可以在将uni-icon包裹一层,在它父级上进行组上冒泡绑定
3. 使用uni-collapse的时候,当内容过多的时候,超过的内容不显示
解决方案: 对uni-collapse-item里面的内容用个view 包裹起来,动态计算这个这高度来改变
const getContentHeight = (imageCount: number) => {
const baseHeight = 190 // 基础高度
const increment = 210 // 多一张整加高度
const pairs = Math.ceil(imageCount / 2) // 计算图片对数
return `${baseHeight + (pairs - 1) * increment}rpx`
}
4. 使用uni-popup 组件发现底部会出现空白如图:
解决办法 : 查官网发现是因为设置了安全距离的问题,设置个背景色就可以解决
5. 从A页面跳转到B页面 ,再返回A页面时 A页面重新加载
开始使用onShow 这个钩子方法,发现会一直掉接口
解决办法: 使用uni.reLaunch
uni.reLaunch({
url: '/pages/driver/home/index'
});
6. 自定义导航高度问题
7. 使用uni-swipe-action组件实现右滑删除,出现从下面删除正常,从上面(第一个或者中间删除)出现如图问题:
解决方案: 使用SwipeAcitonItem的show属性
一开始的时设置show:none,当右滑操作的时候@click事件的时候,先设置show:right,确定删除的时候在把show:none
8. app 每天打包有5次限制,测试也不想每次都安装新的apk
解决办法:
进行wgt打包(每次打包要修改manifest.json里的版本号,要比上一次高),热更新(强制更新和非强制),每次只更新修改的部分,需要后台写个接口,根据版本号来判断是否进行更新了
例如写一个useUpdateApp.ts
import { showToast } from '@/utils/index';
import { getAppVersion } from '@/api/other';
export function useUpdateApp() {
const appData = ref(null);
// 检测新版本
async function checkAppVersion() {
try {
const data = await getAppVersion();
appData.value = data;
const widgetInfo = await getWidgetInfo();
const currentVersion = widgetInfo.version;
console.log('currentVersion:', currentVersion);
if (appData.value && semverGt(appData.value.showVersionNumber, currentVersion)) {
await startUpdate(appData.value.mandatoryUpdate);
}
} catch (err) {
console.error('检查更新失败:', err);
showToast('检查更新失败,请稍后再试', 'none');
}
}
// 开始更新
async function startUpdate(isForce) {
uni.showModal({
title: '检测到新版本' + (isForce ? ',必须升级才可以使用' : ''),
content: `${appData.value.versionDesc || '有新版本可用,请更新以获得最佳体验'}`,
showCancel: !isForce,
mask: true,
confirmText: '立即更新',
success: async function (res) {
if (res.confirm) {
try {
const downloadTask = plus.downloader.createDownload(
appData.value.downloadUrl,
{},
(download, status) => {
if (status === 200) {
installPackage(download.filename);
} else {
console.error('下载中发生错误:', status);
handleError('下载失败,请稍后再试');
}
}
);
downloadTask.start();
} catch (error) {
console.error('启动更新失败:', error);
handleError('启动更新失败,请稍后再试');
}
} else if (res.cancel && !isForce) {
console.log('用户选择稍后更新');
uni.hideLoading(); // 如果不是强制更新,则允许用户取消并隐藏加载提示
}
},
fail(error) {
console.error('出错了', error);
handleError('更新失败,请稍后再试');
}
});
}
// 处理错误
function handleError(message) {
showToast(message, 'none');
uni.hideLoading(); // 确保加载提示被隐藏
}
// 获取应用信息
function getWidgetInfo() {
return new Promise((resolve, reject) => {
plus.runtime.getProperty(plus.runtime.appid, resolve, reject);
});
}
// 安装新版本
async function installPackage(filePath) {
try {
uni.showModal({
title: '正在安装新版本...',
content: '更新过程中,请勿进行其它操作。\n\n更新成功后,将退出应用,请手动重启应用。',
mask: true,
confirmText: '',
showCancel: false
});
plus.runtime.install(filePath, { force: true }, () => {
setTimeout(() => plus.runtime.quit(), 2000); // 退出应用以触发重启
}, (error) => {
handleError('安装失败,请稍后再试');
console.error('安装失败:', error);
});
} catch (error) {
console.error('安装失败:', error);
handleError('更新失败,请稍后再试');
}
}
function semverGt(v1, v2) {
const v1Parts = v1.split('.').map(Number);
const v2Parts = v2.split('.').map(Number);
for (let i = 0; i < 3; i++) {
if (v1Parts[i] !== v2Parts[i]) return v1Parts[i] > v2Parts[i];
}
return false;
}
return {
checkAppVersion
};
}