首页IT科技vue的虚拟dom会操作dom吗?(Vue中简单的虚拟DOM是什么样)

vue的虚拟dom会操作dom吗?(Vue中简单的虚拟DOM是什么样)

时间2025-06-20 23:56:26分类IT科技浏览3575
导读:1. 一个简单的虚拟DOM长什么样 其实当今前端框架不少用到了虚拟DOM的技术,但各家有各家的实现。这里我们先看下比较简单的虚拟DOM库snabbdom的虚拟DOM长什么样...

1. 一个简单的虚拟DOM长什么样

其实当今前端框架不少用到了虚拟DOM的技术             ,但各家有各家的实现            。这里我们先看下比较简单的虚拟DOM库snabbdom的虚拟DOM长什么样

我们假设有html如下                   ,其实也就是所谓的真实DOM

<div class="message">Hello World</div>

那么snabbdom对应的虚拟DOM是长以下这个样子的:

{ "sel": "div", "data": { "class": "message" }, "text": "Hello World" }

这样看来一个虚拟DOM其实就是一个json文件      ,里面的内容也不难理解             ,猜都能猜出来:

sel: 标签名 data: 标签属性 text: 标签之间的文本内容

从这里就不难理解虚拟DOM和真实DOM的关系                   ,虚拟DOM就是一个用来描述真实DOM节点的Javascript对象                   。

虚拟DOM除了可以描述单一的一个真实DOM节点      ,还能描述一颗DOM数       。

比如有html如下:

<div id="container"> <div class="message">Hello World</div> </div>

对应的虚拟DOM将会是

{ "sel": "div", "data": { "id": "container" }, "children": [ { "sel": "div", "data": { "class": "message" }, "text": "Hello World" } ] }

虚拟DOM对象里面多了个children的数组选项       ,里面的内容就是前面html中的子节点      。

2. Vue中的虚拟DOM长什么样

还是以最简单的html节点为例子

<div class="message">Hello World</div>

vue中的虚拟DOM将会是如下这个样子的

{ tag: "div", data: { "staticClass": "message" } children: [ { text: "Hello World", ... }, ], ... }

Vue中的虚拟DOM比snabbdom的虚拟DOM复杂                   ,会多出很多属性            ,我这里就不一一列出来了       ,上面只是显示了一些我觉得和snabbdom的虚拟DOM差不多的属性                   。

两个虚拟DOM看上去差不多                    ,只是:

标签名这里用tag而非sel 标签之间的文本在vue中用一个文本虚拟子节点来表示            ,而不是像snabbdom那样直接放到自身的text中

3. Vue中的虚拟DOM实现

在Vue中,虚拟DOM是通过VNode这个类来实现的             。

export default class VNode { tag: string | void; data: VNodeData | void; children: ?Array<VNode>; text: string | void; elm: Node | void; ns: string | void; context: Component | void; // rendered in this components scope key: string | number | void; componentOptions: VNodeComponentOptions | void; componentInstance: Component | void; // component instance parent: VNode | void; // component placeholder node // strictly internal raw: boolean; // contains raw HTML? (server only) isStatic: boolean; // hoisted static node isRootInsert: boolean; // necessary for enter transition check isComment: boolean; // empty comment placeholder? isCloned: boolean; // is a cloned node? isOnce: boolean; // is a v-once node? asyncFactory: Function | void; // async component factory function asyncMeta: Object | void; isAsyncPlaceholder: boolean; ssrContext: Object | void; fnContext: Component | void; // real context vm for functional nodes fnOptions: ?ComponentOptions; // for SSR caching devtoolsMeta: ?Object; // used to store functional render context for devtools fnScopeId: ?string; // functional scope id support constructor( tag?: string, data?: VNodeData, children?: ?Array<VNode>, text?: string, elm?: Node, context?: Component, componentOptions?: VNodeComponentOptions, asyncFactory?: Function ) { this.tag = tag; this.data = data; this.children = children; this.text = text; this.elm = elm; this.ns = undefined; this.context = context; this.fnContext = undefined; this.fnOptions = undefined; this.fnScopeId = undefined; this.key = data && data.key; this.componentOptions = componentOptions; this.componentInstance = undefined; this.parent = undefined; this.raw = false; this.isStatic = false; this.isRootInsert = true; this.isComment = false; this.isCloned = false; this.isOnce = false; this.asyncFactory = asyncFactory; this.asyncMeta = undefined; this.isAsyncPlaceholder = false; } }

其中包含了我们上面示例看到的最重要的tag                    ,data                   ,children等描述一个DOM结构的选项,还有很多Vue实现需要用到的选项             ,这里就不一一解析                   ,什么时候用到什么时候分析吧      ,先有个概念就好了      。

4. createTextVNode

从VNode的构造函数可以看到其接受的参数比较多             ,为了方便使用                   ,vue为创建VNode节点提供了一些函数的封装      ,其中我们最常用的就是创建一个文本节点                   。

export function createTextVNode(val: string | number) { return new VNode(undefined, undefined, undefined, String(val)); }

对应的真实DOM

<div>Hello world</div>

到此这篇关于Vue中简单的虚拟DOM是什么样的文章就介绍到这了,更多相关Vue虚拟DOM内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

声明:本站所有文章       ,如无特殊说明或标注                   ,均为本站原创发布             。任何个人或组织            ,在未征得本站同意时       ,禁止复制            、盗用                   、采集       、发布本站内容到任何网站      、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益                    ,可联系我们进行处理                   。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
网站外链的作用有哪些方面的问题(网站的外链是什么意思)