vue组件实现,vue 组件开发的几种方式

  vue组件实现,vue 组件开发的几种方式

  Vue提供了一种叫做功能组件的组件类型,用来定义那些没有响应数据,不需要任何生命周期的场景。它只接受一些道具来展示组件。以下文章主要介绍Vue高级组件的功能组件的使用场景和源代码分析。有需要的可以参考一下。

  

目录

  使用场景源代码分析的介绍和总结

  

介绍

  Vue提供了一个功能组件,可以使一个组件成为无状态的和实例化的。一般的子组件原则上会经历实例化的过程,而简单的功能组件则没有这个过程。可以简单理解为只处理数据不创建实例的中间层。也正是因为这种行为,它的渲染开销会低很多。在实际应用场景中,当我们需要在多个组件中选择一个进行渲染,或者在传递孩子、道具、数据等数据之前对数据进行处理时。对于子组件,我们都可以使用功能组件,功能组件本质上是组件的外部包装器。

  

使用场景

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

  var test1={

  道具:[msg],

  render: function (createElement,context) {

  返回createElement(h1 ,this.msg)

  }

  }

  var test2={

  道具:[msg],

  render: function (createElement,context) {

  返回createElement(h2 ,this.msg)

  }

  }

  定义一个功能组件,它会根据计算结果选择其中一个组件。

  Vue.component(test3 ,{

  //将功能组件的标志functional设置为真

  功能性:真的,

  道具:[msg],

  render: function (createElement,context) {

  var get=function() {

  返回测试1

  }

  返回createElement(get(),context)

  }

  })

  功能组件的使用

  test3 :msg=msg id=test

  /test3

  新Vue({

  埃尔: #app ,

  数据:{

  消息:“测试”

  }

  })

  最终的渲染结果是:

  h2测试/h2

  

源码分析

  功能组件会在组件的对象定义中将功能属性设置为true,这是区别普通组件和功能组件的关键。同样,当它遇到子组件占位符时,它将输入createComponent来创建子组件Vnode。由于functional property的存在,代码会进入functional component的分支,返回createFunctionalComponent调用的结果。注意,createFunctionalComponent执行后,后续创建子vnode的逻辑将不会被执行,这也是为什么在创建真实节点的过程中不会有子vnode实例化子组件的原因。(无示例)

  函数createComponent(){

  if(is true(ctor . options . functional)){

  返回createFunctionalComponent(Ctor,propsData,Data,context,children)

  }

  }

  CreateFunctionalComponent方法将检测并合并传入的数据,实例化FunctionalRenderContext,最后调用功能组件定义的render方法执行渲染过程。

  函数createFunctionalComponent(

  Ctor,//功能组件生成器

  PropsData,//传入组件的props

  占位符组件传入的Data,//attr属性

  上下文,//vue实例

  子//子节点

  ){

  //数据检测和合并

  var options=Ctor.options

  var props={ };

  var propOptions=options.props

  if (isDef(propOptions)) {

  for(比例中的变量键){

  props[key]=validateProp(key,propOptions,props data empty object);

  }

  }否则{

  //合并属性

  if(isDef(data . attrs)){ merge props(props,data . attrs);}

  //合并道具

  if(isDef(data . props)){ merge props(props,data . props);}

  }

  var render context=new functional render context(data,props,children,contextVm,Ctor);

  //调用功能组件中的自定义渲染函数

  var vnode=options . render . call(null,renderContext。_c,renderContext)

  }

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

  函数FunctionalRenderContext() {

  //省略其他逻辑

  这个。_c=function (a,b,c,d){ return createElement(context VM,a,b,c,d,need normalization);};

  }

  在执行render函数的过程中,会递归调用createElement的方法。此时,元件已经是真正的元件,正常的元件安装过程开始。

  问:为什么功能组件需要定义不同的createElement方法?createElement这个功能组件和过去唯一的区别就是最后一个参数不一样。如前一章所述,createElement将根据最后一个参数决定是否展平子Vnode。一般孩子的编译结果都是Vnode类型的。只有函数组件是特殊的,它可以返回一个数组。这个时候拍打是必要的。让我们看看下面的例子:

  Vue.component(测试,{

  功能性:真的,

  render: function (createElement,context) {

  返回context.slots()。系统默认值

  }

  })

  试验

  pslot1/p

  pslot/p

  /测试

  此时,功能组件测试的render函数返回two slot的Vnode,以数组的形式存在,这就是需要扁平化的场景。

  总结一下功能组件,从源代码可以看出,功能组件不像普通组件一样有实例化组件的过程,所以没有包括组件的生命周期和组件的数据管理在内的过程。它只接收完整传递给组件进行处理的数据,并呈现所需的内容。所以作为一个纯函数,渲染的成本也可以大大降低。

  

总结

  关于Vue高级组件的功能组件的使用场景和源代码分析这篇文章到此为止。有关Vue高级组件的功能组件的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: