vlambda博客
学习文章列表

3-13:介绍一下 Vue3 函数式组件及 使用场景?

函数式组件是自身没有任何状态的组件的另一种形式。它们在渲染过程中不会创建组件实例,并跳过常规的组件生命周期。

我们使用的是一个简单函数,而不是一个选项对象,来创建函数式组件。该函数实际上就是该组件的 render 函数。而因为函数式组件里没有 this 引用,Vue 会把 props 当作第一个参数传入:

const FunctionalComponent = (props, context) => { // ...}
第二个参数  context  包含三个 property: attrs emit  和  slots 。它们分别相当于实例的  $attrs $emit  和  $slots  这几个 property。
大多数常规组件的配置选项在函数式组件中都不可用。然而我们还是可以把  props  和  emits  作为 property 加入,以达到定义它们的目的:
FunctionalComponent.props = ['value']FunctionalComponent.emits = ['click']

如果这个 props 选项没有被定义,那么被传入函数的 props 对象就会像 attrs 一样会包含所有 attribute。除非指定了 props 选项,否则每个 prop 的名字将不会基于驼峰命名法被一般化处理。

函数式组件可以像普通组件一样被注册和消费。如果你将一个函数作为第一个参数传入  h,它将会被当作一个函数式组件来对待。
import { h } from 'vue'; const DynamicHeading = (props, context) => { return h(`h${props.level}`, context.attrs, context.slots);} DynamicHeading.props = ['level']; export default DynamicHeading;

业务场景

在 Vue 3 中,常规组件的性能有了很大提升,相比之下,这时的函数式组件在性能上失去了以往的优势。另外,现在的常规组件也支持返回多个根节点了。因此,函数式组件仅剩的唯一用途就是用来实现简单组件了,比如一个动态生成不同标题的组件。