Kwin Huang

不会搞艺术的程序员不是好设计师.

vue函数式组件

2019-10-23

什么是函数式组件

函数组件(不要与 Vue 的 render 函数混淆)是一个不包含状态和实例的组件

简单的说,就是组件不支持响应式,并且不能通过 this 关键字引用自己。

函数式组件的特点

  • 没有管理任何状态
  • 没有监听任何传递给它的状态
  • 没有生命周期方法
  • 它只是接收一些prop的函数

访问组件属性

没有状态或实例,你可能会好奇如何引用数据或方法,Vue为底层的 render 函数提供一个 context 参数对象。

这个 context 参数对象具有下列属性:

props: 所有的 props 对象 children: VNode 子节点数组 scopedSlots: (vue2.6.0+) 暴露传入作用域插槽的对象。将普通插槽作为函数暴露出去 data: 全部的数据对象,作为 createElement 函数的第二个参数传递给组件 parent: 对父组件的引用 listeners: (vue2.3.0+) 包含父级注册的事件侦听器的对象。也是 data.on 的别名 injections: (v2.3.0+) 如果使用了 inject 选项,则该对象包含了应当被注入的属性

访问这个 context 参数非常简单,例如,我们想使用 props,可以这样做:

  1. 在 Template 中访问组件的 context:

template

  1. 在 render 函数中访问组件的 context

render

函数式组件的优点

速度

因为函数式组件没有状态,所以它们不需要像Vue的响应式系统一样需要经过额外的初始化。

函数式组件仍然会对相应的变化做出响应式改变,比如新传入新的 props,但是在组件本身中,它无法知道数据何时发生了更改,因为它不维护自己的状态。

我做了一个基准测试,渲染1000个列表(<li>),有状态组件和函数式组件,有状态组件耗时110 ~ 120ms,函数式组件耗时20 ~ 30ms。

对于大型应用程序,在使用函数式组件之后,你会看到DOM的渲染、更新会有重大改进。