粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • Vue

    • 简介
    • 响应式基本原理
    • 路由原理
    • 生命周期钩子
    • 组件通信
    • extend API
    • mixin与mixins
    • computed与watch
    • keep-alive
    • v-show 与 v-if
    • ❤运行机制概述
    • ❤响应式系统的依赖收集追踪原理
    • ❤VNode实现
    • 编译template的过程
    • 数据状态更新时的差异 diff 及 patch 机制

实现VNode节点

vuePress-theme-reco 粥里有勺糖    2018 - 2023

实现VNode节点

粥里有勺糖 2020-04-14 大前端vue

# 实现 VNode 节点

# VNode?

render function 会被转化成 VNode 节点

Virtual DOM 其实就是一棵以 JavaScript 对象(VNode 节点)作为基础的树,用对象属性来描述节点,实际上它只是一层对真实 DOM 的抽象。最终可以通过一系列操作使这棵树映射到真实环境上。由于 Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力,如浏览器平台、Weex、Node 等

# 简单实现

class VNode{
    constructor(tag,data,children,text.element){
        // 节点标签名称
        this.tag = tag
        // 节点的数据信息 props,attr 等等
        this.data = data
        // 子节点
        this.children = children
        // 节点的文本
        this.text = text
        // 虚拟节点对应的真实dom
        this.element = element
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

示例

vue组件

<template>
  <span class="demo" v-show="isShow">
    This is a span.
  </span>
</template>
1
2
3
4
5

生成的js对象

function render(){
    return new VNode('span',{
        // 指令集合
        directives:[
            {
                /* v-show指令 */
                rawName: 'v-show',
                expression: 'isShow',
                name: 'show',
                value: true
            }
        ],
        /* 静态class */
        staticClass: 'demo'
    },[undefined,undefined,undefined,'This is a span.'])
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

转换为VNode

{
    tag:'span',
    data:{
        directives:[
            {
                rawName:'v-show',
                expression:'isShow',
                name:'show',
                value:true 
            }
        ],
        staticClass:'demo'
    },
    text:
    children:[
        {
            tag:undefined,
            data:undefined,
            text:'This is a span',
            chidlren:[]
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

方法封装

// 空节点
function createEmptyVNode(){
    const node = new VNode()
    node.text = ''
    return node
}

// 文本节点
function createTextVNode(val){
    const node = new VNode()
    node.text = String(val)
    return node
}

// 克隆节点
function cloneVNode(node){
    return new VNode(node.tag,node.data,node.children,node.text,node.element)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

总结

  • VNode 就是一个 JavaScript 对象,用 JavaScript 对象的属性来描述当前节点的一些状态
  • 用 VNode 节点的形式来模拟一棵 Virtual DOM 树
Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34