uni-app 横竖屏频繁切换 页面卡死

uni-app 横竖屏频繁切换 页面卡死

开发环境 版本号 项目创建方式
Windows 11 HBuilderX

示例代码:

if (uni.$u.sys().deviceType == 'phone') {  
    plus.screen.unlockOrientation();  
    plus.screen.lockOrientation('landscape-primary'); // 强制横屏  
};  
uni.navigateTo({  
    url: url,  
    success() {  
        this.loading = false;  
        this.ble.initBleRssi(device.address);  
    }  
});

操作步骤:

我的流程是在a页面先旋转,然后navigateTo到b页面,在b页面会偶发性卡死,现象是在b页面想点击跳转c页面,但是会自动返回b页面。

预期结果:

不卡死

实际结果:

卡死

bug描述


更多关于uni-app 横竖屏频繁切换 页面卡死的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

有人懂么

我在测试了一下,可以正常横屏下调整转,能否提供提供一下问题工程

从游客登录后,在首页点设备进入设备页,就会出现我说的情况,是极个别情况会出现

这个是安装包

不是提供安装包,希望提供的是一个能复现问题的简单demo

uni-app 中,频繁切换横竖屏可能会导致页面卡死的问题,这通常与页面布局、样式或 JavaScript 执行逻辑有关。以下是一些可能的原因和解决方案:


1. 页面布局问题

频繁切换横竖屏可能导致页面布局重新计算,如果布局过于复杂或存在性能问题,可能会导致页面卡顿甚至卡死。

解决方案:

  • 使用 flex 布局或 grid 布局,减少复杂的布局计算。
  • 避免在页面中使用过多的 position: absoluteposition: fixed,这些属性在屏幕尺寸变化时可能会导致性能问题。
  • 使用 uni-app 提供的 onResize 事件监听屏幕尺寸变化,动态调整布局。
onLoad() {
  uni.onWindowResize((res) => {
    console.log('屏幕尺寸变化', res);
    // 动态调整布局
  });
}

2. 样式重绘问题

频繁切换横竖屏会导致页面样式重绘,如果样式过于复杂或存在性能问题,可能会导致页面卡顿。

解决方案:

  • 减少不必要的样式计算,例如避免使用 calc()transform 等复杂样式。
  • 使用 will-change 属性优化样式重绘性能。
.container {
  will-change: transform;
}

3. JavaScript 执行逻辑问题

在横竖屏切换时,可能会触发某些 JavaScript 逻辑(例如重新计算布局、重新渲染数据等),如果这些逻辑执行时间过长,可能会导致页面卡死。

解决方案:

  • 优化 JavaScript 逻辑,避免在横竖屏切换时执行复杂的计算或渲染操作。
  • 使用 debouncethrottle 限制频繁触发的逻辑。
import { debounce } from 'lodash';

onLoad() {
  uni.onWindowResize(debounce((res) => {
    console.log('屏幕尺寸变化', res);
    // 执行逻辑
  }, 300));
}

4. 页面生命周期问题

在横竖屏切换时,uni-app 可能会触发页面的生命周期函数(例如 onShowonHide 等),如果这些函数中存在性能问题,可能会导致页面卡死。

解决方案:

  • 检查页面生命周期函数中的逻辑,确保其执行效率。
  • 避免在生命周期函数中执行耗时操作。

5. 硬件加速问题

在某些设备上,频繁切换横竖屏可能会导致硬件加速失效,从而引发页面卡顿。

解决方案:

  • 尝试启用硬件加速,例如使用 transform: translateZ(0)will-change 属性。
.container {
  transform: translateZ(0);
}

6. 调试与定位问题

如果以上方法无法解决问题,可以通过以下方式进一步调试:

  • 使用 uni-app 的调试工具(如 HBuilderX 的调试功能)检查页面性能。
  • 在横竖屏切换时,打印日志或使用性能分析工具(如 Chrome DevTools)定位性能瓶颈。

7. 其他建议

  • 如果横竖屏切换不是必须的,可以尝试锁定屏幕方向,避免频繁切换。
  • manifest.json 中配置屏幕方向:
{
  "app-plus": {
    "screenOrientation": ["portrait-primary", "landscape-primary"]
  }
}
回到顶部