uni-app nvue 频繁渲染数组后导致程序闪退

uni-app nvue 频繁渲染数组后导致程序闪退

操作步骤:

  • 直接运行demo 等待一段时间即可复现

预期结果:

  • 程序正常运行 不会闪退

实际结果:

  • 运行一段时间后闪退

bug描述:

最近程序频繁闪退 删除完其他代码后 最终定位到渲染数组这边的问题。 正常流程的话 用户是一个个添加商品 然后渲染到购物车上 但是渲染数次后 就会导致程序闪退 然后我们这边在代码中使用了定时器去模拟用户操作 下方是程序简单的demo

demo.rar

信息类别 信息内容
产品分类 uniapp/App
PC开发环境 Windows
PC操作系统版本 win10
HBuilderX类型 正式
HBuilderX版本 3.3.5
手机系统 Android
手机系统版本 Android 7.1.1
手机厂商 模拟器也可复现
手机机型 收银机平板
页面类型 nvue
Vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

更多关于uni-app nvue 频繁渲染数组后导致程序闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html

13 回复

默认基座可以复现问题吗 猜测可能是系统兼容性问题。你可以修改manifest.json配置targetSdkVersion 为26再试下

更多关于uni-app nvue 频繁渲染数组后导致程序闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html


你好 我们这边用默认基座试了一下 还是会出现闪退的情况 还是得麻烦看下这个问题。

回复 Zzz1012: 你可以修改manifest.json配置targetSdkVersion 为26 然后云打包再试下

回复 DCloud_Android_ST: 云打包后还是会出现同样的问题。

回复 Zzz1012: 你说模拟器可以复现 是哪个款 我用雷电模拟器 7.1系统目前虽然不报错但是会卡死不动。你云打包的appid发下我测试下

回复 DCloud_Android_ST: 之前我们使用的是夜神模拟器 appid是 _UNI_52D20B4

卡死一段时间后应该也会提示程序无响应

回复 DCloud_Android_ST: 你好 请问有什么结果了吗?

回复 Zzz1012: 我这查看你的打包记录 你并没有按我说的将targetSdkVersion改为26

回复 DCloud_Android_ST: 你好 我这边确定已经修改为了26 但是不太清除为什么打包记录上没有显示 https://img.fp1123.com/group1/M00/00/11/CgAFBmJ2E9aAE98dAABi2gdLE_I538.png

回复 Zzz1012: 私信发下QQ吧

回复 DCloud_Android_ST: 已私信

在使用 uni-app 的 nvue 页面时,频繁渲染数组可能导致程序闪退,这通常是由于内存管理不当或渲染性能问题引起的。以下是一些可能的原因和解决方案:

1. 内存泄漏

频繁渲染数组可能导致内存泄漏,尤其是在数组数据量较大时。如果内存占用过高,可能会导致程序崩溃。

解决方案:

  • 优化数据结构:尽量减少数组的大小,或者使用更高效的数据结构。
  • 及时释放内存:在不再需要数组时,手动将其置空或清空,以释放内存。
  • 使用 key 属性:在渲染列表时,为每个列表项添加唯一的 key 属性,以帮助 Vue 更高效地更新 DOM。

2. 渲染性能问题

频繁渲染大量数据会导致页面卡顿甚至闪退,尤其是在 nvue 页面中,渲染性能可能不如 vue 页面。

解决方案:

  • 分页加载:将数据分页加载,避免一次性渲染大量数据。
  • 虚拟列表:使用虚拟列表技术,只渲染当前可见区域的数据,减少 DOM 操作。
  • 减少不必要的渲染:使用 v-ifv-show 控制组件的渲染,避免不必要的 DOM 更新。

3. 频繁触发 setData

nvue 页面中,频繁调用 setData 方法更新数据可能会导致性能问题。

解决方案:

  • 合并更新:将多次 setData 调用合并为一次,减少更新频率。
  • 使用 this.$nextTick:在数据更新后,使用 this.$nextTick 确保在下一次 DOM 更新周期中进行渲染。

4. 使用 nvuerecycle-list 组件

nvue 提供了 recycle-list 组件,专门用于优化长列表的渲染性能。

解决方案:

  • 使用 recycle-list:将长列表替换为 recycle-list 组件,以提高渲染性能。

5. 检查代码逻辑

确保代码逻辑没有错误,例如无限循环、重复渲染等。

解决方案:

  • 调试代码:使用调试工具检查代码逻辑,确保没有不必要的渲染或数据更新。

6. 升级 uni-app 版本

有时,闪退问题可能是由于 uni-app 的某些版本存在 bug。升级到最新版本可能会解决这些问题。

解决方案:

  • 升级 uni-app:确保使用的是最新版本的 uni-app,以获得最新的性能优化和 bug 修复。

7. 使用原生组件

在某些情况下,使用原生组件(如 scroll-view)可能比使用 nvue 的组件更高效。

解决方案:

  • 使用原生组件:尝试使用原生组件来替代 nvue 组件,以提高性能。

8. 监控内存使用

使用工具监控应用的内存使用情况,及时发现内存泄漏或内存占用过高的问题。

解决方案:

  • 使用工具监控:使用 Chrome DevTools 或其他工具监控应用的内存使用情况,及时发现并解决问题。

示例代码

以下是一个优化后的示例代码,展示了如何使用 recycle-listkey 属性来优化渲染性能:

<template>
  <recycle-list :list-data="dataList" :item-size="100">
    <template v-slot:default="{ item }">
      <view :key="item.id">
        <text>{{ item.name }}</text>
      </view>
    </template>
  </recycle-list>
</template>

<script>
export default {
  data() {
    return {
      dataList: []
    };
  },
  mounted() {
    this.loadData();
  },
  methods: {
    loadData() {
      // 模拟加载数据
      this.dataList = Array.from({ length: 1000 }, (_, i) => ({
        id: i,
        name: `Item ${i}`
      }));
    }
  }
};
</script>
回到顶部