uni-app 虚拟滚动出现白屏希望通过 renderjs 解决这个问题

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

uni-app 虚拟滚动出现白屏希望通过 renderjs 解决这个问题

1 回复

在 uni-app 中使用虚拟滚动时遇到白屏问题,通常是由于滚动容器的渲染性能瓶颈或数据更新导致视图未正确渲染。使用 renderjs 可以帮助提升渲染性能,因为它允许在视图层直接操作 DOM,从而绕过一些框架层面的性能开销。以下是一个使用 renderjs 解决虚拟滚动白屏问题的示例代码。

首先,确保你已经在项目中启用了 renderjs。这通常需要在 manifest.json 中配置:

{
  "mp-weixin": {
    "usingComponents": true,
    "renderjs": true
  }
}

然后,在你的页面或组件中,可以如下使用 renderjs

  1. 页面模板 (*.vue 文件):
<template>
  <view>
    <scroll-view scroll-y="true" :scroll-top="scrollTop" style="height: 100vh;">
      <view class="virtual-list" id="virtualList">
        <!-- 虚拟列表项将在这里动态生成 -->
      </view>
    </scroll-view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      scrollTop: 0,
      items: Array.from({ length: 1000 }, (_, i) => `Item ${i + 1}`)
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.initVirtualList();
    });
  },
  methods: {
    initVirtualList() {
      // 在 renderjs 中初始化虚拟列表
      this.$mp.page.callMethod({
        name: 'initVirtualList',
        args: {
          items: this.items,
          height: this.$refs.virtualList.offsetHeight,
          itemHeight: 50
        }
      });
    }
  }
};
</script>

<render-js>
export default {
  mounted() {
    this.initVirtualList = (opts) => {
      const list = document.getElementById('virtualList');
      const fragment = document.createDocumentFragment();

      opts.items.forEach((item, index) => {
        const top = index * opts.itemHeight;
        if (top >= -opts.height && top < opts.height) {
          const div = document.createElement('div');
          div.style.position = 'absolute';
          div.style.top = `${top}px`;
          div.style.height = `${opts.itemHeight}px`;
          div.innerText = item;
          fragment.appendChild(div);
        }
      });

      list.appendChild(fragment);
      window.addEventListener('scroll', this.onScroll);
    };

    this.onScroll = () => {
      // 更新 scrollTop,可以在 Vue 实例中监听并更新
    };
  }
};
</render-js>

在这个示例中,renderjs 部分负责直接操作 DOM,根据滚动位置动态生成和更新列表项。注意,这只是一个基本的示例,实际应用中可能需要更复杂的逻辑来处理边界情况、优化性能等。同时,确保在 Vue 实例和 renderjs 之间正确同步数据和方法调用。

回到顶部