iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue高级组件之函数式组件的使用场景与源码分析
  • 470
分享到

Vue高级组件之函数式组件的使用场景与源码分析

2024-04-02 19:04:59 470人浏览 薄情痞子
摘要

目录介绍使用场景源码分析总结介绍 Vue提供了一种可以让组件变为无状态、无实例的函数化组件。从原理上说,一般子组件都会经过实例化的过程,而单纯的函数组件并没有这个过程,它可以简单理

介绍

Vue提供了一种可以让组件变为无状态、无实例的函数化组件。从原理上说,一般子组件都会经过实例化的过程,而单纯的函数组件并没有这个过程,它可以简单理解为一个中间层,只处理数据,不创建实例,也是由于这个行为,它的渲染开销会低很多。实际的应用场景是,当我们需要在多个组件中选择一个来代为渲染,或者在将children,props,data等数据传递给子组件前进行数据处理时,我们都可以用函数式组件来完成,它本质上也是对组件的一个外部包装。

使用场景

定义两个组件对象,test1,test2


var test1 = {
props: ['msg'],
render: function (createElement, context) {
  return createElement('h1', this.msg)
}
}
var test2 = {
props: ['msg'],
render: function (createElement, context) {
  return createElement('h2', this.msg)
}
}

定义一个函数式组件,它会根据计算结果选择其中一个组件进行选项


Vue.component('test3', {
// 函数式组件的标志 functional设置为true
functional: true,
props: ['msg'],
render: function (createElement, context) {
  var get = function() {
    return test1
  }
  return createElement(get(), context)
}
})

函数式组件的使用


<test3 :msg="msg" id="test">
</test3>
new Vue({
el: '#app',
data: {
  msg: 'test'
}
})

最终渲染的结果为:


<h2>test</h2>

源码分析

函数式组件会在组件的对象定义中,将functional属性设置为true,这个属性是区别普通组件和函数式组件的关键。同样的在遇到子组件占位符时,会进入createComponent进行子组件Vnode的创建。由于functional属性的存在,代码会进入函数式组件的分支中,并返回createFunctionalComponent调用的结果。 注意,执行完createFunctionalComponent后,后续创建子Vnode的逻辑不会执行,这也是之后在创建真实节点过程中不会有子Vnode去实例化子组件的原因。(无实例)


function createComponent(){
  ···
  if (isTrue(Ctor.options.functional)) {
    return createFunctionalComponent(Ctor, propsData, data, context, children)
  }
}

createFunctionalComponent方法会对传入的数据进行检测和合并,实例化FunctionalRenderContext,最终调用函数式组件自定义的render方法执行渲染过程。


function createFunctionalComponent(
  Ctor, // 函数式组件构造器
  propsData, // 传入组件的props
  data, // 占位符组件传入的attr属性
  context, // vue实例
  children// 子节点
){
  // 数据检测合并
  var options = Ctor.options;
  var props = {};
  var propOptions = options.props;
  if (isDef(propOptions)) {
    for (var key in propOptions) {
      props[key] = validateProp(key, propOptions, propsData || emptyObject);
    }
  } else {
    // 合并attrs
    if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
    // 合并props
    if (isDef(data.props)) { mergeProps(props, data.props); }
  }
  var renderContext = new FunctionalRenderContext(data,props,children,contextVm,Ctor);
  // 调用函数式组件中自定的render函数
  var vnode = options.render.call(null, renderContext._c, renderContext)
}

而FunctionalRenderContext这个类最终的目的是定义一个和真实组件渲染不同的render方法。


function FunctionalRenderContext() {
  // 省略其他逻辑
  this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNORMalization); };
}

执行render函数的过程,又会递归调用createElement的方法,这时的组件已经是真实的组件,开始执行正常的组件挂载流程。

问题:为什么函数式组件需要定义一个不同的createElement方法?- 函数式组件createElement和以往唯一的不同是,最后一个参数的不同,之前章节有说到,createElement会根据最后一个参数决定是否对子Vnode进行拍平,一般情况下,children编译生成结果都是Vnode类型,只有函数式组件比较特殊,它可以返回一个数组,这时候拍平就是有必要的。我们看下面的例子:


Vue.component('test', {  
  functional: true,  
  render: function (createElement, context) {  
    return context.slots().default  
  }  
}) 

<test> 
     <p>slot1</p> 
     <p>slot</p> 
</test>

此时函数式组件test的render函数返回的是两个slot的Vnode,它是以数组的形式存在的,这就是需要拍平的场景。

简单总结一下函数式组件,从源码中可以看出,函数式组件并不会像普通组件那样有实例化组件的过程,因此包括组件的生命周期,组件的数据管理这些过程都没有,它只会原封不动的接收传递给组件的数据做处理,并渲染需要的内容。因此作为纯粹的函数可以也大大降低渲染的开销。

总结

到此这篇关于Vue高级组件之函数式组件的使用场景与源码分析的文章就介绍到这了,更多相关Vue高级组件之函数式组件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue高级组件之函数式组件的使用场景与源码分析

本文链接: https://www.lsjlt.com/news/156863.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue高级组件之函数式组件的使用场景与源码分析
    目录介绍使用场景源码分析总结介绍 Vue提供了一种可以让组件变为无状态、无实例的函数化组件。从原理上说,一般子组件都会经过实例化的过程,而单纯的函数组件并没有这个过程,它可以简单理...
    99+
    2024-04-02
  • Vue函数式组件的示例分析
    这篇文章将为大家详细讲解有关Vue函数式组件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。函数式组件特点:没有管理任何状态没有监听任何传递给它的状态没有生命周期...
    99+
    2024-04-02
  • vue高级组件之provide与inject使用及说明
    目录vue provide与inject使用及说明vue中不同组件通信方式如下缺点vue3中父子组件传值(provide/inject)具体操作总结vue provide与injec...
    99+
    2023-05-17
    vue高级组件 vue provide vue inject
  • vue在组件中使用v-model的场景
    目录一、使用场景二、V-Model的本质三、关键步骤1. props 的使用2. $emit 的使用3. 关键的 model四、不使...
    99+
    2024-04-02
  • 源码解析AndroidJetpack组件之ViewModel的使用
    目录前言依赖版本基础使用定义Activity 中获取Fragment 中获取前置知识onSaveInstanceState、onRestoreInstanceStateonRetai...
    99+
    2023-05-17
    Android Jetpack组件ViewModel的使用 Android Jetpack ViewModel使用 Android Jetpack ViewModel
  • Vue函数式组件专篇深入分析
    函数式组件的实现相对容易。一个函数式组件本质上就是一个普通函数,该函数的返回值是虚拟DOM。 在用户接口层面,一个函数式组件就是一个返回虚拟DOM的函数,如下面的代码所示: func...
    99+
    2023-01-05
    Vue函数式组件样式 Vue函数式组件 Vue函数式组件使用场景
  • Vue组件中的自定义事件源码分析
    这篇文章主要介绍“Vue组件中的自定义事件源码分析”,在日常操作中,相信很多人在Vue组件中的自定义事件源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue组件中的自定义事件源码分析”的疑惑有所帮助!...
    99+
    2023-06-29
  • VUE 单文件组件的高级使用技巧
    1. 混合式模板 SFC 允许您将 HTML、CSS 和 JavaScript 组合到一个文件中。通过使用包含 name 属性的 <template> 部分,您可以指定外部 HTML 模板文件。这可以使您将模板逻辑与组件的其他...
    99+
    2024-04-02
  • vue组件与复用的示例分析
    这篇文章给大家分享的是有关vue组件与复用的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是组件组件 (Component) 是 Vue.js 最强大的功能之一。...
    99+
    2024-04-02
  • Vue中函数化组件的示例分析
    这篇文章将为大家详细讲解有关Vue中函数化组件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。介绍之前创建的锚点标题组件是比较简单,没有管理或者监听任何传递给他的...
    99+
    2024-04-02
  • VUE如何实现无状态的组件用函数式组件
    这篇文章将为大家详细讲解有关VUE如何实现无状态的组件用函数式组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。无状态的组件用函数式组件对于一些纯展示,没有响应式数据,没有状态管理,也不用生命周期钩子函数...
    99+
    2023-06-26
  • Vue浅析讲解动态组件与缓存组件及异步组件的使用
    目录1.什么是动态组件2.如何实现动态组件渲染3.如何实现缓存组件4.异步组件1.什么是动态组件 当我们希望页面中的某个地方,在不同组件之间进行动态切换,这时候除了条件渲染,还可以使...
    99+
    2024-04-02
  • vue组件之间数据传递的示例分析
    小编给大家分享一下vue组件之间数据传递的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!(1)props属性:在父组件中,可以通过子组件标签属性的形式将数据或者函数传给子组件,子组...
    99+
    2024-04-02
  • Vue组件之作用域插槽的示例分析
    小编给大家分享一下Vue组件之作用域插槽的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!写作用域插槽之前,先介绍一下Vue中的slot内容分发:如果<child-compon...
    99+
    2024-04-02
  • Vue递归组件使用技巧实例代码分析
    这篇文章主要介绍“Vue递归组件使用技巧实例代码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue递归组件使用技巧实例代码分析”文章能帮助大家解决问题。痛点引出在平时的开发当中,渲染侧边栏导航...
    99+
    2023-07-05
  • vue之ele多级联组件的使用方法详解
    本文实例为大家分享了vue之ele多级联组件的使用具体代码,供大家参考,具体内容如下 多级联组件的使用 html <el-cascader         ref="casc...
    99+
    2024-04-02
  • Netty分布式编码器及写数据事件处理使用场景的示例分析
    这篇文章主要介绍Netty分布式编码器及写数据事件处理使用场景的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!编码器第一节: writeAndFlush的事件传播我们之前在学习pipeline的时候...
    99+
    2023-06-29
  • Vue中子组件与数据传递的示例分析
    小编给大家分享一下Vue中子组件与数据传递的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如何传递父组件向子组件在进行传...
    99+
    2024-04-02
  • golang中cache组件的使用及groupcache源码解析
    groupcache 简介 在软件系统中使用缓存,可以降低系统响应时间,提高用户体验,降低某些系统模块的压力. groupcache是一款开源的缓存组件.与memcache与red...
    99+
    2024-04-02
  • 正则表达式高级用法之分组的使用教程
    目录分组的使用场景分组的使用方法捕获组分组的使用实例javascript 获取分组内容java 获取分组内容小结补充:正则表达式分组及常见的方法总结分组的使用场景 在书写正则表达式时...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作