Vue 函数式组件,如何使用? 为什么要用?什么时候用?

https://juejin.cn/post/6844903887787278349

什么是函数式组件

组件没有管理任何状态,也没有监听任何传递给它的状态,也没有生命周期方法时,可以将组件标记为functional ,这意味它无状态 (没有响应式数据),也没有实例 (没有 this 上下文)。
在这里插入图片描述

如何使用

src\components\render\heading-functional.vue

<script>
export default {
    
    
  functional: true, // 函数式组件
  props: ["level", "title"],
  // heading组件
  // <heading :level="1" :title="title" icon="cart">{
    
    {title}}</heading>
  // <h2 title=""></h2>
  render(h, context) {
    
    
    // 子节点数组
    let children = [];
    // 没有this,同样也没有$slot.default
    // 默认插槽,默认子元素的写法有所更改
    children = children.concat(context.children);

    const {
    
     title, level } = context.props;
    return h(
      "h" + level, // 参数1,tagname
      {
    
     attrs: {
    
     title } }, // 参数2:{。。。}
      children // 虚拟子节点VNode不能再使用$slot.default
    );
  },
};
</script>

<style lang="scss" scoped>
</style>

src\view\test\test2.vue

<template>
  <div>
    <h2>函数式组件</h2>
    <heading-functional :level="3" title="函数式组件">
      这是一个函数式组件
    </heading-functional>
  </div>
</template>

<script>
import HeadingFunctional from "../../components/render/heading-functional.vue";
export default {
  components: { HeadingFunctional },
};
</script>

<style lang="scss" scoped>
</style>

效果:
在这里插入图片描述

为什么要使用函数式组件

函数式组件可能会给我们使用组件带来更多的复杂性,但为什么还是需要呢?

速度

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

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

对于那些喜欢看数字说话的人,该博主做了一个基准测试,渲染1000个列表,有状态组件和函数式组件,有状态组件耗时140ms,函数式组件耗时40ms。

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

什么时候使用函数式组件

函数式组件可能不适用于许多情况。毕竟,使用 JavaScript 框架的目的是构建响应式的应用程序。在 Vue 中,如果没有响应式,就无法做到这一点。

然而,有些场景就很适合函数式组件的使用:

  • 一个简单的展示组件,也就是所谓的 dumb 组件。例如, buttons, pills, tags, cards,甚至整个页面都是静态文本,比如 About 页面。
  • “高阶组件”——用于接收一个组件作为参数,返回一个被包装过的组件
  • v-for 循环中的每项通常都是很好的候选项

猜你喜欢

转载自blog.csdn.net/weixin_45844049/article/details/114402181
今日推荐