uniapp实际开发遇到过的问题(持续更新中....)

1. 在ios模拟器上会出现底部留白的情况

解决方案: 在manifest.json文件,找到开源码视图配置,添加如下:

"app-plus" : {
   	"safearea":{
			"bottom":{
			"offset" : "none"  // 底部安全区域偏移,"none"表示不空出安全区域
     }
	},
}

2.  想对uni-icon绑定阻止冒泡事件,一直不生效

解决方案:因为uni-icon上拿不到event事件,所以使用.stop 不生效,可以在将uni-icon包裹一层,在它父级上进行组上冒泡绑定

4762a14e98f9453db5e340eb26bce17d.png

3. 使用uni-collapse的时候,当内容过多的时候,超过的内容不显示

解决方案: 对uni-collapse-item里面的内容用个view 包裹起来,动态计算这个这高度来改变

d315010062154a7bacb73f158cac7fea.png

 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
  };
}

### 关于 `uni.showModal` 在鸿蒙 Next 上的兼容性 #### 兼容性概述 在鸿蒙 Next 平台上,`uni.showModal` 的基本功能得到了支持。然而,在某些特定场景下可能会遇到一些兼容性和性能方面的问题。为了确保最佳用户体验,建议开发者关注以下几个方面[^1]。 #### 参数配置注意事项 当使用 `uni.showModal` 时,部分参数可能不会按照预期工作或存在差异。例如: - **编辑模式 (`editable`)** 如果希望在模态框中加入输入框,则需特别注意不同平台对于此特性的实现方式可能存在区别。虽然官方文档指出可以通过设置 `editable=true` 来启用输入框,但在实际开发过程中发现该属性的效果依赖具体环境的支持程度[^2]。 - **样式自定义** 对话框的颜色、字体大小等视觉效果也可能因平台而异。特别是颜色相关的选项如 `cancelColor`, 开发者应测试这些设置是否能在目标平台上正常生效,并考虑提供默认值以应对潜在不一致的情况[^4]。 #### 解决方案与优化措施 针对可能出现的问题,以下是几种推荐的做法: - 使用回调处理逻辑 考虑到 `uni.showModal` 是一个异步过程,应当合理利用其提供的成功/失败回调机制来管理状态更新和数据交互。这有助于避免由于上下文丢失而导致的功能失效问题[^3]。 - 测试驱动开发 (TDD) 构建全面的单元测试案例集,覆盖各种边界条件下的行为验证。特别是在多端适配项目中,持续集成工具可以帮助快速定位跨平台间的细微差别并及时修复它们。 ```javascript // 示例代码展示如何正确调用 uni.showModal 及其回调函数 uni.showModal({ title: '提示', content: '这是一个示例消息。', success(res) { if (res.confirm) { console.log('用户点击了确认'); } else if (res.cancel){ console.log('用户点击了取消'); } }, fail(err) => {console.error("showModal failed", err)} }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值