【手写 Vue2.x 源码】第十一篇 - Vue 的数据渲染流程

news2024/12/24 2:47:35

一,前言

上篇,主要介绍了数组数据变化的观测情况,涉及以下几个点:

  • 实现了数组数据变化被劫持后,已重写原型方法的具体逻辑;
  • 数组各种数据变化时的观测情况分析;

目前为止,数据劫持的各种情况就全部分析完了

本篇,Vue的数据渲染流程


二,如何渲染

1,代码回顾

数据初始化完成后,将开始进行视图渲染

export function initMixin(Vue) {
  Vue.prototype._init = function (options) {
    const vm = this;
    vm.$options = options;
    
    initState(vm);

    if (vm.$options.el) {
      // todo...
    }
  }
}

el 为 dom 挂载处,如:

<div id=app>{{message}}</div>

2,问题分析

Vue 不会直接操作字符串,可以想象一下:

  • 从字符串中解析出指令,以及进行值更新是比较困难的
  • 再考虑到节点复用的场景,更是无法通过对比字符串来完成

3,Vue 视图渲染

vue 支持 template 和 jsx:

  • 日常开发中,大部分会采用 template 完成模板的编写,因为 template 即简单又方便;
  • 而相比 template来讲,jsx 则加更灵活。写法上也显得稍微复杂一些;

三,渲染流程分析

1,流程分析

Vue 需要对 template 进行解析,从而将 template 模板语法转变为 javascript 语法;

而这个转化的过程,就需要用到 ast 语法树(可描述 css、js、html 等语法)

使用 ast 语法树来对 html 的语法结构进行描述,根据 ast 树形结构将代码重组为 js 语法

即后续对 html 模板的操作,就都可以通过 js 来完成,而不必考虑解析字符串了

2,Vue 模板编译原理

  1. 将 template 模板编译为 render 函数
  2. 通过 rander 函数再返回虚拟 dom
  3. 再通过 diff 算法比对虚拟 dom

流程:template模板 -> render 函数 -> 虚拟dom -> diff 算法


四,简单分析

https://template-explorer.vuejs.org/
image.png

  • div 模板:最终被编译成为一个 render 方法,即 render 函数;
  • _c 函数:相当于 createElement,创建div,内部包含属性 id ,值为 app;
  • _v 函数:创建文本,即将_s(msg)创建为一个文本;
  • _s 函数:相当于 JSON.stringify,如果吗模板参数msg为对象,通过 _s 使其转为 string

五,Vue 数据渲染的核心流程

1,初次渲染时

  1. template 模板被编译为 ast 语法树;
  2. 通过 ast 语法树生成 render 函数;
  3. 通过 render 函数返回 vnode 虚拟节点;
  4. 使用 vnode 虚拟节点生成真实 dom 并进行渲染;

2,视图更新时

  1. 调用 render 函数生成新的 vnode 虚拟节点;
  2. 通过 diff 算法对新老 vnode 虚拟节点进行对比;
  3. 根据虚拟节点比对结果,更新真实 dom;

六,结尾

本篇,主要介绍了 vue 数据渲染核心流程

下一篇,template 模板生成 ast 语法树

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webpack 如何编写 loader

三种本地开发测试 loader 的方法 1. 匹配&#xff08;test&#xff09;单个 loader 你可以通过在 rule 对象使用 path.resolve 指定一个本地文件&#xff1a; webpack.config.js const path require(path);module.exports {//...module: {rules: [{test: /\.js$/,use: [{…

Ansible Automation Platform - 在 RHEL 安装 Ansible Automation Platform 2.3 环境

《OpenShift / RHEL / DevSecOps 汇总目录》 文本已在 RHEL 9 AAP 2.3 环境中进行验证。 说明&#xff1a; 本文介绍如何在一个节点上部署一套 all-in-one 的 Ansible Automation Platform 2.3 的运行环境。红帽 Ansible Automation Platform 2.3 需要至少 RHEL 8.4 以上的环…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + Velodyne VLP-16雷达 测试使用

简介&#xff1a;介绍 Velodyne VLP-16 16线激光雷达 在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX1里已经安装了ROS版本&#xff1a;Melod…

HashMap、HashTable、ConcurrentHashMap之间的区别及常见面试题

Java集合类有的集合类是存在线程安全的问题&#xff0c;但是由于之前对于集合类的使用都是在单线程的情况下使用的&#xff0c;不没有在多线程环境下使用&#xff0c;所以不涉及线程安全的问题&#xff1b;这篇博客着重讲解一下多线程环境下使用哈希表。HashMapHashMap本身不是…

一些开发时常用的网站或命令

目录关于gitgit下载网址git安装教程Gortoisegit下载地址关于PythonAnyWhere关于Linux压缩与解压命令关于python的相对与绝对路径使用_\_file_\_实现跨平台关于宝塔面板关于浏览器驱动下载本博客首次编辑于2023.01.04 &#xff0c;后续将持续进行更新 关于git git下载网址 gi…

Linux - 系统文件目录说明

目录/ - 根目录/bin - 用户基础二进制文件目录/boot - 静态启动文件/dev - 设备文件/etc - 配置文件/home - 主目录/lib - 基础共享库/lib64 - 64位基础共享库/lostfound - 可恢复的文件/media - 可移动媒体/mnt - 临时挂载点目录/opt - 自选软件包/proc - 内核 & 进程文件…

【Node】事件循环机制

Node 中的异步 API 定时器&#xff1a;setTimeout、setIntervalI/O 操作&#xff1a;文件读写、数据库操作、网络请求…Node 独有的 API&#xff1a;process.nextTick、setImmediate 事件循环的流程 Node 的事件循环分为 6 个阶段&#xff0c;这 6 个阶段会按顺序反复运行运行…

高并发内存池项目

文章目录一、项目介绍二、什么是内存池2.1 池化技术2.2 内存池2.3 内存池的作用2.4 malloc三、设计定长内存池四、高并发内存池整体框架设计六、threadcache6.1 threadcache整体设计6.2 threadcache哈希桶映射对齐规则6.3 编写对齐和映射的相关函数6.4 编写ThreadCache类6.5 th…

电网头条知识竞赛题库答案(自动答题)

今天教你们自动完成2023年电网头条的知识竞赛&#xff0c;小编也为大家安排好了教程&#xff0c;首先呢需要知道电网助手&#xff0c;打开电网助手网页https://wwwl.lanzouw.com/b01w803yj 为了帮到大家&#xff0c;我特地分享出来&#xff0c;希望能给大家带来一丝丝便利&…

1.3第二周 星期二Samba、FTP

目录 01 Samba文件共享服务 Samba服务基础 2.主配置文件 02 linux文件传输服务 1.用户访问的Samba 03 FTP服务概述 1.vsftp知识预备 04 操作流程&#xff1a; 1&#xff0e;使用时记得装ftp的包&#xff1a;yum install ftp -y 2&#xff0e;装完之后启动服务&am…

【北京理工大学-Python 数据分析-2.1Matplotlib库入门】

Matplotlib库的使用 Matplotlib库由各种可视化类构成&#xff0c;内部结构复杂&#xff0c;受Matlab启发。matplotlib.pyplot是绘制各类可视化图形的命令字库&#xff0c;相当于快捷方式。 import matplotlib.pyplot as plt plt.plot([3,1,4,5,2]) plt.ylabel("Grade&qu…

实战四十七:基于机器(逻辑回归随机森林线性回归)学习预测销售门店的商品销量详细教程(代码+数据)

项目概述: 使用时间序列预测来预测来Corporacin Favorita 的数据的商店销售额。 具体来说,构建一个模型来更准确地预测在不同 Favorita 商店销售的数千种商品的单位销售额。您将使用包含日期、商店和商品信息、促销和单位销售的易于理解的训练数据集来练习您的机器学习技能。…

基于java ssm springboot+VUE疫情防疫系统系统前后端分离设计和实现

基于java ssm springbootVUE疫情防疫系统系统前后端分离设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留…

Goland中使用GoPlantUml生成ER关系图

前言 Golang语言在近些年的开发语言中异军突起&#xff0c;在越来越多的公司项目中频繁出镜&#xff0c;也有越来越多的中间件选择使用Golang语言进行实现。正所谓源码之下无秘密&#xff0c;更友好地翻读源码对于理解功能特性以及后续使用非常有帮助&#xff0c;观摩学习源码也…

RMAN异地恢复-适用于数据库量比较大的场景

之前验证异地备份&#xff0c;只对数据库做个全备就备份恢复了&#xff0c;这种适用于数据库比较小的场景&#xff0c;因为如果数据库量大的话&#xff0c;备份&#xff0c;拷贝备份&#xff0c;恢复数据库的时间就比较长&#xff0c;停业务的时间就会比较长。 如果数据库比较…

JavaWeb知识汇总

文章目录前导一、数据库1.相关概念2.数据模型3.SQL4.约束5.数据库设计6.多表查询7.事务二、JDBC1.步骤2.JDBC事务管理3.数据库连接池三、Maven1.maven生命周期2.maven坐标详解3.依赖管理四、Mybatis1.快速入门2.Mapper代理开发3.核心配置文件4.参数传递5.注解开发五、HTML1.快速…

【进阶C语言】字符串函数+内存函数

文章目录一.字符串函数1.strlen功能&#xff1a;求字符串长度&#xff08;不包括\0&#xff09;函数模拟实现&#xff1a;2.1 strcmp功能函数模拟实现2.2 strncmp3.1 strcat功能函数模拟实现3.2strncat4.1 strcpy功能函数模拟实现4.2 strncpy5.strstr功能函数模拟实现6.strtok功…

论文《An Effective Consistency Constraint for Sequential Recommendation》

C2Rec: An Effective Consistency Constraint for SequentialRecommendation 这篇文章提出了序列推荐建模中一种有效的一致性约束防范&#xff0c;不用修改模型结构&#xff0c;仅仅添加2个额外的损失函数&#xff0c;就能达到非常好的效果。不像基于对比学习的方法&#xff0…

C++初阶--string

目录 string对象的创建&#xff1a; 遍历修改 const修饰的迭代器(只读)&#xff1a; 反向迭代器&#xff1a; reserve与resize&#xff1a; find&#xff0c;rfind&#xff0c;substr&#xff1a; insert&#xff1a; erase&#xff1a; getchar、getline&#xff1a; string对…

Java基础学习笔记(十一)—— 包装类与泛型

包装类与泛型1 包装类1.1 基本类型包装类1.2 Integer类1.3 自动装箱 / 拆箱2 泛型2.1 泛型概述2.2 泛型的用法2.3 类型通配符1 包装类 1.1 基本类型包装类 基本类型包装类的作用 将基本数据类型封装成对象 的好处在于可以在对象中定义更多的功能方法操作该数据 public stat…