美文网首页
函数式组件技巧

函数式组件技巧

作者: HTAO濤 | 来源:发表于2021-02-01 08:48 被阅读0次

Functional components

第一个技巧,函数式组件

优化前的组件代码如下:

<template>

  <div class="cell">

    <div v-if="value" class="on"></div>

    <section v-else class="off"></section>

  </div>

</template>

<script>

export default {

  props: ['value'],

}

</script>

优化后的组件代码如下:

<template functional>

  <div class="cell">

    <div v-if="props.value" class="on"></div>

    <section v-else class="off"></section>

  </div>

</template>

然后我们在父组件各渲染优化前后的组件 800 个,并在每一帧内部通过修改数据来触发组件的更新,开启 Chrome 的 Performance 面板记录它们的性能,得到如下结果。

优化前:

优化后:

对比这两张图我们可以看到优化前执行 script 的时间要多于优化后的,而我们知道 JS 引擎是单线程的运行机制,JS 线程会阻塞 UI 线程,所以当脚本执行时间过长,就会阻塞渲染,导致页面卡顿。而优化后的 script 执行时间短,所以它的性能更好。

那么,为什么用函数式组件 JS 的执行时间就变短了呢?这要从函数式组件的实现原理说起了,你可以把它理解成一个函数,它可以根据你传递的上下文数据渲染生成一片 DOM。

函数式组件和普通的对象类型的组件不同,它不会被看作成一个真正的组件,我们知道在 patch 过程中,如果遇到一个节点是组件 vnode,会递归执行子组件的初始化过程;而函数式组件的 render 生成的是普通的 vnode,不会有递归子组件的过程,因此渲染开销会低很多。

因此,函数式组件也不会有状态,不会有响应式数据,生命周期钩子函数这些东西。你可以把它当成把普通组件模板中的一部分 DOM 剥离出来,通过函数的方式渲染出来,是一种在 DOM 层面的复用。

相关文章

  • 函数式组件技巧

    Functional components 第一个技巧,函数式组件 优化前的组件代码如下: