uni-app #插件讨论# uni-collapse 折叠面板 - DCloud前端团队 大数组渲染问题

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app #插件讨论# uni-collapse 折叠面板 - DCloud前端团队 大数组渲染问题

问题描述

有一个大的数组,200多条记录,一次显示在折叠面板上,会出现这种现象:先显示线框背景,等几秒后,再在线框上显示内容。如何优化呢?

1 回复

在处理uni-app中的uni-collapse折叠面板组件与大数组渲染问题时,通常会遇到性能瓶颈和内存占用过高的问题。为了优化这一场景,我们可以采取以下几种策略,并通过代码示例来展示如何实现。

1. 使用虚拟滚动(Virtual Scrolling)

虚拟滚动技术可以显著减少渲染的DOM节点数量,从而提升性能。在uni-app中,可以使用第三方库如better-scroll来实现虚拟滚动。

<template>
  <view>
    <better-scroll :data="list" :height="height" class="scroll-wrapper">
      <view v-for="(item, index) in visibleItems" :key="index" class="scroll-item">
        <uni-collapse :key="item.id" v-model="item.open">
          <uni-collapse-item>
            {{ item.content }}
          </uni-collapse-item>
        </uni-collapse>
      </view>
    </better-scroll>
  </view>
</template>

<script>
import BetterScroll from 'better-scroll';

export default {
  data() {
    return {
      list: [], // 假设这是一个大数组
      height: 300, // 滚动容器的高度
      visibleItems: [], // 当前可视区域的数据
    };
  },
  mounted() {
    this.initScroll();
  },
  methods: {
    initScroll() {
      this.scroll = new BetterScroll(this.$refs.scrollWrapper, {
        probeType: 3,
        data: this.list,
        height: this.height,
        onScroll: (pos) => {
          // 根据滚动位置计算当前可视区域的数据
          this.updateVisibleItems(pos);
        },
      });
    },
    updateVisibleItems(pos) {
      // 实现根据滚动位置更新visibleItems的逻辑
      // ...
    },
  },
};
</script>

2. 分页加载(Pagination)

如果数据非常大,可以考虑分页加载,每次只加载用户当前需要查看的部分数据。

// 示例:通过API分页加载数据
methods: {
  async loadPage(page) {
    const response = await fetch(`/api/data?page=${page}`);
    const data = await response.json();
    this.list = this.list.concat(data.items); // 合并到现有列表中
  },
  // 在组件挂载时加载第一页
  mounted() {
    this.loadPage(1);
  },
  // 监听滚动到底部事件以加载下一页
  onReachBottom() {
    const currentPage = Math.ceil(this.list.length / PAGE_SIZE); // 计算当前页码
    this.loadPage(currentPage + 1);
  },
}

3. 使用v-lazy指令

对于图片等需要懒加载的内容,可以使用uni-app提供的v-lazy指令,以减少初始渲染时的加载时间。

<uni-collapse-item>
  <image v-lazy="item.imageUrl" />
</uni-collapse-item>

通过上述方法,可以显著提升uni-collapse折叠面板在处理大数组渲染时的性能表现。

回到顶部