vue deno,vueisnotdefined

  vue deno,vueisnotdefined

  本文主要介绍Vue.js的VNode的使用方法,通过示例代码非常详细的介绍,对于大家的学习或者工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。

  

什么是VNode

  vue.js中有一个vnode类,可以用来实例化不同类型的vnode实例,不同类型的VNode实例各自代表不同类型的DOM元素。

  例如,DOM元素包括元素节点、文本节点、注释节点等。和vnode实例也对应于元素节点、文本节点和注释节点。

  VNode类代码如下:

  导出默认类VNode {

  构造函数(标记、数据、子元素、文本、elm、上下文、componentOptions、asyncFactory) {

  this.tag=标签

  this.data=数据

  this.children=儿童

  this.text=text

  this.elm=榆树

  this.ns=未定义

  this.context=上下文

  this . functional context=undefined

  this.functionalOptions=未定义

  this.functionalScopeId=未定义

  this.key=data data.key

  this . component options=component options

  this . component instance=undefined

  this.parent=undefined

  this.raw=false

  this.isStatic=false

  this.isRootInsert=true

  this.isComment=false

  this.isCloned=false

  this.isOnce=false

  this.asyncFactory=异步工厂

  this.asyncMeta=undefined

  this.isAsyncPlaceholder=false

  }

  get child() {

  返回this.componentInstance

  }

  }

  从上面的代码可以看出,VNode只是一个名字。本质上,它是从vnode类实例化的普通JavaScript对象。如果我们用这个JavaScript对象来描述一个真实的DOM元素,那么DOM元素上的所有属性在VNode对象上都有对应的属性。

  简单来说,vnode可以理解为一个节点描述对象,描述如何创建真正的DOM节点。

  例如,tag表示元素节点的名称,text表示文本节点的文本,children表示子节点。Vnode表示一个真实的DOM元素,所有真实的DOM节点都是用vnode创建的,并被插入到页面中。

  VNode创建DOM并将其插入到视图中

  该图展示了用vnode创建一个真实的DOM并将其呈现给视图的过程。可以知道,vnode和view是一一对应的。我们可以把vnode理解为JavaScript对象版本的DOM元素。

  渲染视图的过程是先创建vnode,然后用vnode生成真正的DOM元素,最后插入页面渲染视图。

  

VNode的作用

  因为每次渲染视图的时候都是先创建一个vnode,然后把它创建的真实DOM插入到页面中,这样就可以缓存上次视图渲染时创建的vnode了。然后,每当需要重新渲染视图时,就将新创建的vnode与上次缓存的vnode进行比较,看看它们之间有什么不同,找出不同之处,并基于它们修改真实的DOM。

  目前,Vue.js采用中等粒度的状态检测策略。当状态改变时,只通知组件级,然后在组件中使用虚拟DOM来呈现视图。

  如下图所示,当某个状态发生变化时,只有使用该状态的组件会得到通知。也就是说,只要组件使用的许多状态中的一个发生变化,整个组件就会被重新渲染。

  如果组件只有一个节点发生了变化,那么重新渲染整个组件的所有节点显然会造成性能的极大浪费。因此,唤醒vnode缓存并将最后一个缓存与当前创建的vnode进行比较非常重要,以便只更新有差异的节点。这也是vnode最重要的功能。

  

VNode的类型

  有许多不同类型的vnode,包括以下几种:

  注释节点

  文本节点

  元素节点

  组件节点

  功能节点

  克隆节点

  前面介绍过vnode是一个JavaScript对象,不同类型的vnode其实有不同的属性,准确的说是不同的有效属性。因为使用vnode类创建VNode时,通过参数为实例设置属性时,无效属性默认会设置为undefined或false。只需忽略vnode上的无效属性。

  

1.注释节点

  因为创建注释节点的过程非常简单,所以它的属性是通过代码直接引入的:

  export const createEmptyVNode=text={

  const node=新VNode()

  node.text=文本;

  node.isComment=true

  返回节点

  }

  注释节点只有两个有效属性,text和isComment。默认情况下,其他属性都是未定义的或假的。

  比如一个真实的注释节点,对应的vnode如下:

  //!-注释节点-

  {

  文本:“注释节点”,

  isComment: true

  }

  

2.文本节点

  创建节点的过程也非常简单,代码如下:

  导出函数createTextVNode(val) {

  返回新的VNode(未定义,未定义,未定义,字符串(val))

  }

  创建文本类型的vnode时,它只有一个文本属性:

  {

  文本:“文本节点”

  }

  

3.克隆节点

  克隆节点是将已有节点的属性赋给新节点,使新创建的节点与克隆节点的属性一致,从而达到克隆的效果。它的功能是优化静态节点和槽节点。

  以静态节点为例。当组件中的一个状态改变时,当前组件将通过虚拟DOM重新呈现视图。因为静态节点的内容不会改变,所以后续的更新除了第一次渲染之外,不需要执行渲染函数来重新生成vnode。

  因此,我们将通过创建克隆节点来克隆vnode的副本,并使用克隆节点来渲染它。这样就不需要执行渲染函数来生成静态节点的新vnode,从而提高了一定的性能。

  创建克隆节点的代码如下:

  导出函数cloneVNode(vnode,deep) {

  const cloned=new VNode(vnode.tag,vnode.data,vnode.children,vnode.text,vnode.elm,vnode.context,vnode.componentOptions,vnode.asyncFactory)

  cloned.ns=vnode.ns

  cloned.isStatic=vnode.isStatic

  cloned.key=vnode.key

  cloned . is comment=vnode . is comment

  cloned.isCloned=true

  if (deep vnode.children) {

  cloned . children=clonev nodes(vnode . children)

  }

  返回克隆的

  }

  要克隆现有节点,需要将现有节点的所有属性分配给新节点。

  克隆节点和克隆节点的位移区别是isCloned属性,克隆节点为真,克隆原始节点为假。

  

4.元素节点

  一个元素通常有以下4个有效属性。

  Tag:tag是节点的名称,如p、ul、li、div等。

  数据:改变属性包括一些节点上的数据,如attrs、class和style。

  Children:当前节点的子节点列表。

  Context:是当前组件的Vue.js的实例。

  一个实元素节点,对应的vnode如下:

  //pspanHello/spanspanWorld/span/p

  {

  孩子:[VNode,VNode],

  上下文:{.},

  数据:{.},

  标签:“p”,

  .

  }

  

5.组件节点

  组件节点类似于元素节点,具有以下两个独特的属性。

  ComponentOptions:组件节点的选项参数,包含propsData、tag、children等信息。

  ComponentInstance:组件的实例,即Vue.js的实例.实际上,在Vue.js中,每个组件都有一个vue.js的实例。

  一个组件节点及其对应的vnode如下:

  //子/子

  {

  组件实例:{.},

  组件选项:{.},

  上下文:{.},

  数据:{.},

  标签:“vue-组件-1-子组件”,

  .

  }

  

6.函数式节点

  功能节点类似于组件节点,因为它有两个唯一的属性,functionalContext和functionalOptions。

  通常,功能节点的vnode如下:

  {

  功能上下文:{.},

  功能选项:{.},

  上下文:{.},

  数据:{.},

  标签:“div”

  }

  

总结

  Vnode是一个类,可以产生不同类型的VNode实例,不同类型的实例代表不同类型的真实DOM。

  因为Vue.js使用虚拟DOM来更新组件的视图,所以当属性发生变化时,整个组件都要重新渲染,而不是组件中的所有DOM节点都需要更新。所以缓存vnode,将当前新生成的vnode与缓存的vnode进行比较,只对需要更新的部分进行DOM操作,可以提升很多性能。

  vnode有很多种类型,本质上都是Vnode实例化的对象。唯一不同的是它们的属性不同。

  关于Vue.js的VNode的使用,本文就讲到这里。有关VNode使用的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

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

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