广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3中的执行流程思路分析-流程图
  • 854
分享到

Vue3中的执行流程思路分析-流程图

Vue3执行流程Vue3流程图Vue3执行流程思路 2022-12-03 22:12:17 854人浏览 泡泡鱼
摘要

目录一. 前言二. vue3 思路分析1. createRender(options)2. createApp3. app.mount(‘#app’)4. r

一. 前言

本文只在为大家梳理完整的Vue3代码执行流程,从创建createApp到渲染为真实dom节点。

在读后续文章时,请大家参考以下流程图食用,好了废话不多说,开整!!!

(本文主要为梳理思路,不展示太多源码。)

二. Vue3 思路分析

提示:一定要按照流程图哦!!!

1. createRender(options)

我们创建vue3时,最常见的一个api就是createApp,但是在执行createRender时,createApp还没有被创建,那该方法是干什么的呢,传入的参数有是什么呢?我们接着往下看。

options:源码中也叫做 nodeOps,其实就是vue3自己重新封装的一些dom操作,例如insert、remove、createElement等,在pc端,其实就是利用domcument下的一些原生方法实现

优点:那就有人要问了,为什么要重新封装

首先有这么几点好处:

  • 1.封装后使用更清楚简短,方便调用
  • 2.最重要的一点,那就是将vue的渲染工作与dom操作完全解耦,这样更适合多端操作,只需要重入对应的nodeOps即可,自己重新封装对应的dom操作方法,比如移动端等

从流程图来看,调用该方法之后,返回三个Api,其中我们只关心两个重要的也是常用的createApp、render
我们继续往下看。

2. createApp

这个方法大家应该都不陌生,该方法传入一个根组件rootComponent,但是并没有做任何处理,在该方法中主要任务创建了一个全局对象app

我们来看下app中常见的几个api

App

  • use: 用来注册插件,为vue实现扩展,如vueRouter、vuex、pinia等
  • component: 用来注册全局组件,可以在任意组件中使用
  • 注意:以上方法都应该在mount挂载之前执行
  • mount: 这一步也就是最关键的一部,开始执行将组件渲染的第一步,我们继续往下看

3. app.mount(‘#app’)

从流程图中我们可以看到,挂载中主要执行了两个操作

  • 1.createVNode
  • 首先将我们传入的根组件传入到createVNode方法中,将组件包装成vnode对象并且返回
  • 2.render(vnode, rootContainer)
  • 此处的render就是在前边执行createRender时返回的方法,我们在此处继续执行它,并且传入两个参数,第一个是我们包装后的rootComponent,第二个是挂载传入真实domrootContainer

好了,mount执行完毕,我们进入到render中继续向下执行

4. render(vnode, container)

在此方法中,做了一个最重要的工作就是将已经渲染的vnode,也可以称之为旧的vnode保存到container._vnode上,然后调用

patch(container._vnode|| null, vnode)

这样,就形成了新旧vnode,也就有了diff的说法,让我们进入到patch方法中。

5. patch(n1, n2, container)

patch中文意思打补丁,也就描述了他的用法,对比新旧vnode,也就是我们常说的diff算法,将新的vnode渲染到真实dom中。

该方法中主要分为了两大分支,当然还有其它,我们就先忽略,跟着主线走下去

  • 1.processComponent
  • 当传入的n2为组件时进入这个分支
  • 2.processElement
  • 当传入的n2为元素类型时走该分支

我们先进入processComponent来对传入的rootComponent进行处理

6. processComponent

该方法中又出现了两个分支

  • mountComponent: 在第一次挂载时执行update
  • Component: 组件跟新时执行

我们接着往下看

7. mountComponent

该组件中执行了三个主要的方法,我们一个个来看

  • createInstance:首先是创建实例,我们自定义的每个组件第一次渲染时都会走该分支,为每个组件定义了一个组件实例instance,因此vue3中就有了一个方法getCurrentInstance来访问每个组件的实例。
  • setupComponent:这一步非常重要,该方法接受一个参数,也就是刚刚创建的组件实例,在这一步中,调用了我们传入的setup,所以,我们调用的所有方法,也就是在这被执行,比如Reactive,ref,生命hook,watch,computed等,之后将setup调用的结果保存到instance中的setupState属性中。
  • setupRenderEffect:在一切准备工作都做完之后,接下来就该进行渲染,我们继续进入到该方法中。

8. setupRenderEffect

该方法中创建了一个componentUpdateFn组件更新函数,也就是在这,实现了真正的响应式处理,在setupComponent中,执行了setup,在这我们对数据进行了响应式处理,利用reactive/refs对数据实现了处理,在get中收集依赖,set中更新依赖。

在创建好componentUpdateFn方法之后,我们创建了一个新的对象

new ReactiveEffect(componentUpdateFn),之后我们执行返回对象的run方法,其中执行了传入的componentUpdateFn函数,在componentUpdateFn中,我们首先对组件的render或者template进行处理,也就对我们用到了响应式数据进行了get,由此,将ReactiveEffect收集到对应数据的依赖中,在每次数据修改时,执行componentUpdateFn,之后,在挂载函数中继续执行patch,传入处理后的render或者temeplate,至此回到patch中,进行递归

9. patch

此时,传入的是根标签包装后的vnode,所以,此次走的分支为processElement,让我们跟着流程图继续往下看。

10. processElement mountElement

在该方法中,我们利用我们传入的nodeOpts,也就是dom操作方法,将vnode渲染为真实的dom,此时,终于将组件渲染到页面上,同时将转换的真实dom存放在vnode.el上。

patchElement
该方法也就是diff算法的核心,当组件更新之后,通过diff算法,将新的vnode渲染到页面上。

三. 结尾

至此,vue3从创建到渲染的所有流程执行结束,在数据更新之后,我们通过执行依赖,也就是componentUpdateFn函数,重复之前的步骤,重新执行组件的render函数获取根标签,传递给patch,然后更新页面,一直重复该过程。也就实现了页面的改变。直到网页关闭。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Vue3中的执行流程思路分析-流程图

本文链接: https://www.lsjlt.com/news/174004.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3中的执行流程思路分析-流程图
    目录一. 前言二. Vue3 思路分析1. createRender(options)2. createApp3. app.mount(‘#app’)4. r...
    99+
    2022-12-03
    Vue3执行流程 Vue3流程图 Vue3执行流程思路
  • Mybatis中的PageHelper的执行流程分析
    PageHelper Mybatis的执行流程 mybatis中首先要在配置文件中配置一些东西然后根据这些配置去创建一个会话工厂再根据会话工厂创建会话,会话发出操作数据库的sql语...
    99+
    2022-11-13
  • AngularJS执行流程的示例分析
    这篇文章主要介绍了AngularJS执行流程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.启动阶段浏览器解析HTML页面,读取...
    99+
    2022-10-19
  • Mybatis执行SQL命令的流程分析
    目录MapperProxy的功能:MapperMethod的功能:Mybatis中的Sql命令,在枚举类SqlCommandType中定义的。 public enum SqlComm...
    99+
    2023-05-16
    Mybatis执行SQL命令 Mybatis执行SQL
  • mysql中执行查询语句的流程分析
    这篇文章给大家分享的是有关mysql中执行查询语句的流程分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。比如,在我们从student表中查询一个id=2的信息selec ...
    99+
    2022-10-18
  • ​thinkphp框架执行流程的示例分析
    这篇文章给大家分享的是有关thinkphp框架执行流程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。thinkphp框架执行流程 首先总结一下,框架执行的大致流程: index.php->载入框架...
    99+
    2023-06-06
  • laravel的执行流程实例代码分析
    这篇文章主要讲解了“laravel的执行流程实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“laravel的执行流程实例代码分析”吧!1.index.php$app =&...
    99+
    2023-07-04
  • Android开发OkHttp执行流程源码分析
    目录前言介绍执行流程OkHttpClientclient.newCall(request):RealCall.enqueue()Dispatcher.enqueue()Interce...
    99+
    2022-11-13
  • 解析HashMap中的put方法执行流程
    目录引言HashMap底层数据结构put方法的执行流程总结引言 在Java集合中,HashMap的重要性不言而喻,作为一种存储键值对的数据结构,它在日常开发中有着非常多的应用场景,也...
    99+
    2022-11-12
  • php中PHPCMS流程图的示例分析
    小编给大家分享一下php中PHPCMS流程图的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先要知道PHPCMS这个系...
    99+
    2022-10-19
  • mysql中SQL语句的执行流程
    今天就跟大家聊聊有关mysql中SQL语句的执行流程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。       &n...
    99+
    2022-10-18
  • Android项目中gradle的执行流程
    目录gradle文件执行流程自定义gradle文件的导入方法gradle中定义的变量如何被java代码使用gradle文件执行流程 做过Android开发的同学都知道 ,Androi...
    99+
    2022-11-13
  • Unity中的Tilemap流程分析
    作为一个闯关类2d冒险类游戏,地图的设计就尤为重要,我们可以选择手动绘制,也可以导入现有的模板。 主要流程 首先创建文件夹: Tiles存放瓦片 Palette存放调色板 TileM...
    99+
    2022-11-12
  • Spring Security过滤器链加载执行流程的示例分析
    这篇文章主要介绍Spring Security过滤器链加载执行流程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Spring Security实现原理Spring Security 采用 IoC ...
    99+
    2023-06-22
  • Python利用Charles 实现全部自动答题思路流程分析
    利用Charles 达成“我是达人”答题类爆破思路 最近公司需要使用“我是答题”小程序,对武汉疫情进行知识问题;榜单靠前的也有一定的学分奖励;虽然平时总不屑于公司组织的此类活动,但是看了这次活动形式,还是决定直接“爆...
    99+
    2022-06-02
    Python实现全部自动答题 Python Charles自动答题
  • 【Mybatis源码解析】mapper实例化及执行流程源码分析
    文章目录 简介 环境搭建 源码解析 附 基础环境:JDK17、SpringBoot3.0、mysql5.7 储备知识:《【Spring6源码・AOP】AOP源码解析》、《JDBC详细...
    99+
    2023-08-20
    mybatis java spring boot
  • PostgreSQL中执行sql的流程是什么
    小编给大家分享一下PostgreSQL中执行sql的流程是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、SQL执行流程PG执行SQL的过程有以下几个步骤:第一步,根据输入的SQL语...
    99+
    2022-10-18
  • MySQL中SQL执行流程是怎么样的
    这篇文章主要介绍MySQL中SQL执行流程是怎么样的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MYSQL体系结构先看一张架构图,如下:模块详解Connector:用来支持各种语言...
    99+
    2022-10-18
  • golang中的jwt使用教程流程分析
    目录golang-jwt使用加密解密源码分析SignedStringParseWithClaimsgolang-jwt使用 老版本<v4.0.0 为github.com/dgr...
    99+
    2023-05-20
    golang jwt使用 golang jwt
  • PHP 中的 RASP 实现流程分析
    一、什么是 RASP RASP 全称是 Runtime Application self-protection,即运行时应用自我保护,这是一种嵌入到应用程序内部,实时检测来自外部的请...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作