Vue 函数组件 和 抽象组件的区别

在Vue.js中,函数组件和抽象组件是两种不同的组件概念,它们各自有不同的用途和特点:

函数组件 (Functional Components)

函数组件是一种没有状态和实例的简单组件。它们类似于React中的无状态组件,主要用于展示和渲染,不包含生命周期钩子或内部状态。函数组件在Vue 2.5+中被引入,并且是Vue 3中的推荐组件形式,因为它们更轻量、更快,并且更容易进行树摇(tree-shaking)优化。

函数组件的特点:

  • 没有datacomputedwatchmethods等选项。
  • 没有实例(this)的概念。
  • 通常只接受propschildren作为参数。
  • 可以包含一个返回模板的单一渲染函数。

JS 示例:

1
2
3
4
5
6
7
8
// 函数组件
export default {
functional: true,
props: ['name'],
render(h, { props }) {
return h('div', `Hello ${props.name}!`);
}
}

Vue 示例:

1
2
3
<template functional>
<div>{{ props.msg }}</div>
</template>

抽象组件 (Abstract Components)

抽象组件是一种特殊的组件,它们不直接渲染一个DOM元素,而是作为一个占位符来使用。抽象组件通常用于定义组件的“形状”,但并不直接渲染任何内容。它们通常与插槽(slots)一起使用,允许子组件填充抽象组件的内部结构。

抽象组件的特点:

  • 抽象组件是Vue中的一种特殊组件,它并不渲染成真实的DOM元素,而是作为功能性的插槽容器存在。
  • 主要用于包裹其它组件或作为特定功能的容器,例如等组件就是抽象组件的例子。
  • 抽象组件本身不会被渲染成DOM元素,它的作用是管理子组件的状态和行为,通过Vue的特定机制来实现功能,例如缓存组件状态、添加过渡效果等。

示例:

1
2
3
4
5
6
7
8
9
// 抽象组件
Vue.component('my-abstract', {
abstract: true,
slots: {
default: 'Default slot content',
header: 'Header slot content',
footer: 'Footer slot content'
}
});

使用抽象组件的方式:

1
2
3
<keep-alive>
<component :is="currentTabComponent"></component>
</keep-alive>

总结:

  • 函数组件是轻量级的,没有状态和实例,主要用于渲染。
  • 抽象组件是定义组件结构的占位符,通常与插槽结合使用。

在实际开发中,根据组件的职责和需求选择合适的组件类型。函数组件适合用于简单展示,而抽象组件适合用于定义更复杂的组件结构。