长列表优化

更新时间:

本节会系统的介绍长列表的性能优化方法。

当列表长度超长时,必定会影响页面的性能,下面的一系列措施会让您的长列表渲染和更新更加快速。

for 指令中不使用表达式

表达式会频繁触发 js 引擎执行,长列表中的表达式,可以改写成属性读取。

推荐级别:强烈

反例

<template>
  <div>
    <div for="{{foodList}}">
      <text>{{$item.vegetarian ? 'Vegetarian' : 'Non-Vegetarian'}}</text>
      <text>{{$item.name}}</text>
      <text>{{$item.category}}</text>
    </div>
  </div>
</template>
<script>
  export default {
    data: {
      foodList: [
        { name: 'Apple', category: 'Fruit', vegetarian: true },
        { name: 'Chicken', category: 'Meat', vegetarian: false },
        { name: 'Broccoli', category: 'Vegetable', vegetarian: true },
        { name: 'Pizza', category: 'Fast Food', vegetarian: false },
        { name: 'Yogurt', category: 'Dairy', vegetarian: true },
      ],
    },
  }
</script>
复制代码

正例

<template>
  <div>
    <div for="{{foodList}}">
      <text>{{$item.vegetarianStatus}}</text>
      <text>{{$item.name}}</text>
      <text>{{$item.category}}</text>
    </div>
  </div>
</template>
<script>
  export default {
    data: {
      foodList: [
        { name: 'Apple', category: 'Fruit', vegetarianStatus: 'Vegetarian' },
        { name: 'Chicken', category: 'Meat', vegetarianStatus: 'Non-Vegetarian' },
        { name: 'Broccoli', category: 'Vegetable', vegetarianStatus: 'Vegetarian' },
        { name: 'Pizza', category: 'Fast Food', vegetarianStatus: 'Non-Vegetarian' },
        { name: 'Yogurt', category: 'Dairy', vegetarianStatus: 'Vegetarian' },
      ],
    },
  }
</script>
复制代码

for 指令中避免使用自定义组件

推荐级别:强烈

自定义组件中会创建 vm,频繁而密集的 vm 创建对性能和内存都是很大的压力。

for 指令中只使用 item 的数据

推荐级别:强烈

在 for 中不使用不属于列表本身的数据,否则会产生不必须的数据响应。

反例

<div for="{{list}}">
  <text class="{{$item.num > count ? 'red' : 'blue'}}">{{$item.num}}</text>
</div>
<script>
  export default {
    data: {
      count: 10,
    },
  }
</script>
复制代码

正例

<div for="{{list}}">
  <text class="{{$item.className}}">{{$item.num}}</text>
</div>
复制代码

分段懒加载

推荐级别:强烈

注意:下例子仅做懒加载方式参考,实际上还要加上其他优化方法。

正例

<template>
  <div>
    <div for="{{list}}">
      <text>{{$item}}</text>
    </div>
  </div>
</template>
<script>
  const listData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
  export default {
    data: {
      list: [],
    },
    onInit() {
      this.list = listData.slice(0, 6)
    },
    onShow() {
      this.list = listData
    },
  }
</script>
复制代码

关注 onInit 的执行时间

推荐级别:建议

因为长列表数据比较多,所以在应用代码中也需要格外注意,使用 trace 关注 onInit 的执行时间。

以上内容对您是否有帮助?
  • 毫无帮助
  • 帮助不大
  • 一般
  • 很好
  • 非常好
意见反馈