美文网首页
Vue.js 2函数式组件学习

Vue.js 2函数式组件学习

作者: microkof | 来源:发表于2020-10-17 16:13 被阅读0次

什么是函数式组件?

函数式组件就是函数是组件,组件是函数,它的特征是没有内部状态、没有生命周期钩子函数、没有this(不需要实例化的组件)。

在日常开发中,我们经常会开发一些纯展示性的业务组件,比如一些详情页面,列表界面等,它们有一个共同的特点是:

  • 只要你传入数据,我就进行展现。

  • 不需要有内部状态,不需要在生命周期钩子函数里面做处理。

这时候你就可以用函数式组件。

本文只以2.6版本为例说明。

官方文档

https://cn.vuejs.org/v2/guide/render-function.html#函数式组件

官方手册写的跟屎一样。网上的大部分相关教程只是把手册抄一遍,也跟屎一样。所以我要写下这篇。

为什么要用它

  • 函数式组件不需要实例化,无状态,没有生命周期,所以渲染性能要好于普通组件

  • 函数式组件结构更简单,代码结构更清晰

函数式组件与普通组件的区别

  1. 函数式组件需要在声明组件是指定functional

  2. 函数式组件不需要实例化,所以没有thisthis通过render函数的第二个参数来代替。

  3. 函数式组件没有生命周期钩子函数,不能使用计算属性,watch等等。

  4. 函数式组件不能通过$emit对外暴露事件,调用事件只能通过context.listeners.click的方式调用外部传入的事件。

  5. 因为函数式组件是没有实例化的,所以在外部通过ref去引用组件时,实际引用的是HTMLElement

  6. 函数式组件的props可以只声明一部分或者全都不声明,所有没有在props里面声明的属性都会被自动隐式解析为prop,而普通组件所有未声明的属性都被解析到$attrs里面,并自动挂载到组件根元素上面(可以通过inheritAttrs属性禁止)。

使用场景

上面已经反复强调,凡是不需要实例化,无状态,没有生命周期的组件,除了props之外没有别的配置项,都可以改写成函数式组件。

函数式组件写法一:模板语法写法

父组件:

<template>
  <div>
    <func text="aaaaaaaa" />
  </div>
</template>
<script>
import func from '@/components/func.vue';
export default {
  components: {
    func
  }
};
</script>

func.vue:

<template functional>
  <p>{{props.text ? props.text : '哈哈'}}</p>
</template>

注意,没有<script>...</script>部分。是不是很简单?

函数式组件写法二:JSX写法

<script>
export default {
  functional: true,
  props: {
    text: {
      type: String
    }
  },
  /**
   * 渲染函数
   * @param {*} h
   * @param {*} context 函数式组件没有this, props, slots等都在context上面挂着
   */
  render(h, context) {
    console.log(context);
    const { props } = context
    if (props.text) {
      return <p>{props.text}</p>
    }
    return <p>哈哈嗝</p>
  }
}
</script>

注意,没有<template functional>...</template>部分。

由于函数式组件没有this,所以propsslots等都在context上面挂着,可以打印一下context看看。

JSX需要另外的学习成本,如果你愿意的话可以搜索相关资料学习一下。

相关文章

  • Vue.js 2函数式组件学习

    什么是函数式组件? 函数式组件就是函数是组件,组件是函数,它的特征是没有内部状态、没有生命周期钩子函数、没有thi...

  • 1-5 函数式组件

    demo1 - 函数式组件 demo2 - 类组件 demo3 - 函数式组件传参 组件里面套组件 - 复合组件 ...

  • 11.更灵活的组件:Render 函数与 Functional

    更灵活的组件:Render 函数与 Functional Render Vue.js 2.x 与 Vue.js 1...

  • 函数式组件 Functional Components

    在Vue 2中,函数式组件主要有两个用途: 性能优化,函数式组件初始化速度远远快于状态式组件( stateful ...

  • React 组件

    函数式组件类组件 1 . 函数式组件 一般用于静态界面 2 . 类组件 一般有交互的组件,有数据的操作 3 . 复...

  • React 函数式组件

    简单函数式组件 使用 hook 的函数式组件

  • React入门(二)

    组件 1.函数式组件 什么是函数式组件创建一个函数,只要函数中返回一个新的JSX元素,则为函数式组件 调用组件可以...

  • React - 类组件创建

    React创建组件有两种方式 函数式组件 类组件函数式组件已经学过,现在看下类组件怎么写。 函数式组件和类组件区别...

  • React 面向组件编程

    函数式组件// 创建函数式组件function MyComponent() {console.log(this)/...

  • vue 代码分离和懒加载

    基础概念 异步组件 vue.js允许将组件定义为一个工厂函数,异步的解析组件的定义。vue.js只在组件需要渲染时...

网友评论

      本文标题:Vue.js 2函数式组件学习

      本文链接:https://www.haomeiwen.com/subject/comqyctx.html