减少运行时开销

更新时间:

本节介绍的内容可以使得您的页面更加快速的更新。

不在 css 中使用 id 选择器

推荐级别:强烈

当我们需要使用 js 操作组件时,需要给组件注册 id。 如果只需要在 css 中给组件添加样式,建议使用 class 选择器。

反例 1

<template>
  <div id="red"></div>
</template>
<style>
  #red {
    color: red;
  }
</style>
复制代码

正例 1

<template>
  <div class="red"></div>
</template>
<style>
  .red {
    color: red;
  }
</style>
复制代码

反例 2

<!-- 定义了id="root"但未使用 -->
<template>
  <div id="root"></div>
</template>
复制代码

正例 2

<template>
  <div id="root"></div>
</template>
<script>
  export default {
    onInit() {
      this.$element('root').animate()
    },
  }
</script>
复制代码

避免 for 和 if 同时使用

推荐级别:建议

如果需要在 for 循环中使用条件判断,建议在 js 中将数据组织好再渲染。

反例

<template>
  <div>
    <div for="{{foodList}}" if="{{$item.vegetarian}}">
      <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="{{vegetarianFoods}}">
      <text>{{$item.name}}</text>
      <text>{{$item.category}}</text>
    </div>
  </div>
</template>
<script>
  export default {
    data: {
      vegetarianFoods: [],
    },
    onInit() {
      this.vegetarianFoods = [
        { 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 },
      ].filter((food) => food.vegetarian === true)
    },
  }
</script>
复制代码

区分 show 指令和 if 指令

推荐级别:建议

当使用条件渲染将元素隐藏时,if 指令会将组件从 DOM 中移除,而 show 仅仅是渲染是不可见。

所以 if 指令会有更高的切换开销,而 show 指令会有更高的初始化开销。

在实践,如果需要频繁切换显示/隐藏的元素使用 show 指令,反之用 if 指令。

反例 1

<!-- 下面示例中使用 show 元素依旧会被首屏渲染,分段加载失去意义 -->
<template>
  <div>
    <div>分段加载的上半部分</div>
    <div show="{{display}}">分段加载的下半部分</div>
  </div>
</template>
<script>
  export default {
    data: {
      display: false,
    },
    onShow() {
      this.display = true
    },
  }
</script>
复制代码

正例 1

<template>
  <div>
    <div>分段加载的上半部分</div>
    <div if="{{display}}">分段加载的下半部分</div>
  </div>
</template>
<script>
  export default {
    data: {
      display: false,
    },
    onShow() {
      this.display = true
    },
  }
</script>
复制代码

反例 2

<!-- 下面示例中用户会频繁切换A和B两个区域,使用 if 不是一个好的选择。 -->
<template>
  <div>
    <text @click="changeShow('A')">showA</text>
    <text @click="changeShow('B')">showB</text>
    <div if="{{status == 'A'}}">part A</div>
    <div elif="{{status == 'B'}}">part B</div>
  </div>
</template>
<script>
  export default {
    data: {
      status: 'A',
    },
    changeShow(status) {
      this.status = status
    },
  }
</script>
复制代码

正例 2

<template>
  <div>
    <text @click="changeShow('A')">showA</text>
    <text @click="changeShow('B')">showB</text>
    <div show="{{status == 'A'}}">part A</div>
    <div show="{{status == 'B'}}">part B</div>
  </div>
</template>
<script>
  export default {
    data: {
      status: 'A',
    },
    changeShow(status) {
      this.status = status
    },
  }
</script>
复制代码

减少无效的组件嵌套

推荐级别:建议

在页面布局中,尽量减少组件的嵌套,比如 list-item 本身可以作为容器,不需在其内部要额外的 div 嵌套。

反例

<template>
  <list>
    <list-item>
      <div>
        <text>hello</text>
        <image src="a.png"></image>
      </div>
    </list-item>
  </list>
</template>
复制代码

正例

<template>
  <list>
    <list-item>
      <text>hello</text>
      <image src="a.png"></image>
    </list-item>
  </list>
</template>
复制代码

减少非必要的组件抽象

推荐级别:鼓励

不要过度依赖自定义组件, 一个页面引入的自定义组件控制在 1~2 个是比较合理的。需要注意的是,自定义组件不管内容多少,相比于普通组件有经过 js 多走一层创建 vm 的开销,所以对过于简单的组合,也不建议为了通用性而多封装一个自定义组件。与此同时也要避免自定义组件的多层次且套。

反例 1

<import src="./components/heartRateBlock.ux" name="heartRate"></import>
<import src="./components/calorieBlock.ux" name="calorie"></import>

<template>
  <div>
    <heartRate></heartRate>
    <calorie></calorie>
  </div>
</template>
复制代码

反例 2

<import src="./components/heartRate.ux" name="heartRate"></import>

<template>
  <heartRate></heartRate>
</template>
复制代码

减少页面复用

推荐级别:鼓励

设计应用的时候,尽可能拆成多个页面去实现。不要使用 if 的方式,将页面的多个状态全写进一个页面文件里通过参数传递控制。

反例

<template>
  <div if="{{status === 1}}">
    <div>A功能的展示区域</div>
    ...
  </div>
  <div if="{{status === 2}}">
    <div>B功能的展示区域</div>
    ...
  </div>
  <div if="{{status === 3}}">
    <div>C功能的展示区域</div>
    ...
  </div>
</template>

<script>
  export default {
    data: {
      status: 1,
    },
  }
</script>
复制代码

正例

//创建A页面 pageA.ux
<template>
  <div>A功能的展示区域</div>
</template>

//创建B页面 pageB.ux
<template>
  <div>B功能的展示区域</div>
</template>

//创建C页面 pageC.ux
<template>
  <div>C功能的展示区域</div>
</template>
复制代码

for 指令中指定 tid

推荐级别:鼓励

使用 for 指令的列表,存在删除 item 或者改变 item 顺序的情况,可以选择指定唯一的 tid。

正例

<template>
  <text for="{{sportList}}" tid="id">{{$item.id}} {{$item.name}}</text>
</template>

<script>
  export default {
    data: {
      sportList: [
        { id: 'No.1', name: '游泳' },
        { id: 'No.2', name: '跑步' },
        { id: 'No.3', name: '登山' },
      ],
    },
  }
</script>
复制代码
以上内容对您是否有帮助?
  • 毫无帮助
  • 帮助不大
  • 一般
  • 很好
  • 非常好
意见反馈