广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3初始化如何调用函数
  • 326
分享到

Vue3初始化如何调用函数

2024-04-02 19:04:59 326人浏览 安东尼
摘要

目录vue3初始化调用函数入口文件 runtime-dom/src/index.txReactiveEffectVue3程序初始化流程初始化改写的原因流程实现源码流程初始化流程Vue

Vue3初始化调用函数

createApp({}).mount(‘#app')

入口文件 runtime-dom/src/index.tx

  • createApp -> createRenderer -> createBaseRenderer(这里还创建了render函数以及一系列渲染时的函数) -> createAppapi(返回了真正的createApp方法),返回了 实例 app,
  • 然后 app.mount(“#app”) -> createVnode -> render(vnode,rootcontainier,isSVG) -> patch -> processComponent -> mountComponent(初次渲染)或者是updateComponent ->(createComponentInstance , setupComponent,setupRenderEffect)
  • 对于setupComponent,有setup函数和没有setup函数分情况处理,如果有就走setup函数处理,初始化props等需要传递给setup函数的参数,调用setup,setupComponent->finishComponentSetup(在这里会处理 2.x版本的options选项初始化),
  • 对于setupRenderEffect,执行一系列生命钩子函数,创建渲染ReactiveEffect,并执行了**effect.run()**方法

ReactiveEffect

类似于 vue2.x 的Watcher, computed,watch,渲染过程中componentUpdateFn也使用了 ReactiveEffect,

const effect = new ReactiveEffect(fn,…)后,除了计算属性会在被访问时才去调用effect.run()->调用fn(),在fn里访问响应式变量,收集依赖,其余的setupRenderEffect,watch,watchEffect,均会在创建ReactiveEffect后调用effect.run()收集依赖,其中

  • setupRenderEffect会访问依赖的响应变量
  • watch(source,cb,options),会执行访问source的函数,收集依赖
  • watchEffect(fn),会自动执行一次fn收集依赖
  • effect(fn,options),其中options有个lazy:true选项,表示不立即执行fn函数收集依赖,返回一个run函数,再次调用run(),执行一次fn函数,收集依赖
// 1.计算属性
// computed.ts
// ComputedRefImpl类构造函数调用了new ReactiveEffect
this.effect = new ReactiveEffect(getter, () => {
      if (!this._dirty) {
        this._dirty = true
        triggerRefValue(this)
      }
    })
    
// 2. effect
// effect.ts
// effect函数中,可以接收第二个参数effect(fn,{lazy:true}),表示不立即执行
  const _effect = new ReactiveEffect(fn)
// 3. apiWatch.ts doWatch方法
// watch和watchEffect都是通过doWatch函数来,在这里调用new ReactiveEffect,然后根据不同情况执行effect.run(),对于watchEffect就是//执行器回调,对于watch就是访问监听的数据,然后收集依赖
  const effect = new ReactiveEffect(getter, scheduler)
// 4. render.ts
//在 setupRenderEffect中
const effect = (instance.effect = new ReactiveEffect(
      componentUpdateFn,//更新组件函数
      () => queueJob(update),
      instance.scope // track it in component's effect scope
    ))

Vue3程序初始化流程

初始化

在vue3中,程序的初始化不再沿用vue2的new Vue()方法,而是使用了createApp。在createApp中发生了什么呢?

改写的原因

createApp是一个Vue中的工厂函数,以函数的方式进行导入和调用。而函数式的好处是

1、消灭了原来挂载在Vue上的静态方法,变成实例方法,可以减少内存占用,便于tree-shaking,减小了打包体积;

2、因为函数式和class装饰器对ts的支持好,使用函数的方式调用,可以更好的支持ts,提高类型支持

3、根组件的api,如data要和子组件的api保持相同的格式,挂载从$mount改为mount,简化了api并统一了api的一致性

4、new Vue中挂载的方法会造成全局污染,不能独立出来,createApp可以相互独立,并按需挂载。

流程实现

mount

const Vue = {
	createApp(options) {
		//返回app实例
		return {
			mount(selector){
				// 获取渲染函数,编译结果
				// 渲染dom,追加到宿主元素
			}
			compile(template){
			//返回render
				return function render(){
					//描述视图
				}
			}
		}
	}
}

在调用createApp时,如果options中无render,则初始化组件,调用compile产生一个render,若有render则直接挂载;

Vue2中追加元素使用比较替换的方式,diff元素间区别进行对比判断,Vue3中则是直接进行删除重加。

可以在setup或者是data中定义响应式变量, setup的优先级更高。

createApp

Vue暴露的两个初始化的函数,createApp和createRenderer,他们之间的调用关系 


function createApp(options){
    const renderer =  Vue.createRenderer({
        
        aaa(){},
        bbb(){}
    })
    
    return renderer.createApp()
}
function createRenderer({aaa,bbb}){
    
    
    return createApp(options){
        
        return {
            
        }
    }
}

源码流程

1、用户调用createApp方法 =》 通过ensureRenderer得到渲染器

2、渲染器调用createRender =》※调用工厂函数baseGreateRenderer,这个函数中定义了patch和diff等,最终会return一个render用来给spa页面进行渲染,一个hydrate用来给ssr页面进行注水,还有一个函数的createApp(不同于Vue的createApp)

3、在函数的createApp中会定义程序的实例方法,如mount,get,set,use,mixin等

4、mount实例方法会去查看是否有根组件挂载,使用什么方法进行挂载(spa/ssr)

5、render方法调用patch方法进行打补丁

6、patch方法根据传入的节点类型进行挂载方法的判断,如果首次挂载则为挂载component,之后是挂载element(patch方法会将vnode转化为node节点)

7、patch方法执行内部processComponent方法,最终执行mountComponent方法,也就是Vue2中$mount最终执行的方法

初始化流程

1、根组件的实例化:调用createComponentInstance

2、初始化根组件:调用setupComponent方法,也就是Vue2中的this.$_init方法,用来将选项进行合并,并设置钩子和响应式

3、安装render函数的副作用函数:setupRendererEffect

在Vue3中取消了watcher改为了副作用函数,副作用函数会在每次响应式数据发生变化的时候重新执行,内部的render函数的执行会触发依赖收集,这样当响应式数据变化时,响应式组件就会更新。

PS:与react中的useEffect不同的方面是,useEffect需要手动的收集依赖,而Vue中的effect()会自动的收集依赖。 

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

--结束END--

本文标题: Vue3初始化如何调用函数

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

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

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

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

下载Word文档
猜你喜欢
  • Vue3初始化如何调用函数
    目录Vue3初始化调用函数入口文件 runtime-dom/src/index.txReactiveEffectVue3程序初始化流程初始化改写的原因流程实现源码流程初始化流程Vue...
    99+
    2022-11-13
  • Vue3初始化怎么调用函数
    这篇文章主要介绍“Vue3初始化怎么调用函数”,在日常操作中,相信很多人在Vue3初始化怎么调用函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3初始化怎么调用函数”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-02
  • js如何初始化数组
    这篇文章给大家分享的是有关js如何初始化数组的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。初始化数组如果想要初始化一个指定长度的一维数组,并指定默认值,可以这样:const array =&n...
    99+
    2023-06-17
  • java如何初始化数组
    什么是初始化在Java程序开发中,使用数组之前都会对其进行初始化,这是因为数组是引用类型,声明数组只是声明一个引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使用该数组变量来访问数组元素。 (推荐学习:j...
    99+
    2017-08-16
    java教程 java
  • java数组如何初始化
    Java语言中数组必须先初始化,然后才可以使用。所谓初始化就是为数组的数组元素分配内存空间,并为每个数组元素附初始值。注意:数组完成初始化后,内存空间中针对该数组的各个元素就有个一个默认值:基本数据类型的整数类型(byte、short、in...
    99+
    2020-04-23
    java入门 java 数组 初始化
  • java 如何初始化数组
    一、什么是初始化在Java程序开发中,使用数组之前都会对其进行初始化,这是因为数组是引用类型,声明数组只是声明一个引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使用该数组变量来访问数组元素。所谓数组初始化就...
    99+
    2018-10-10
    java入门 java 初始化 数组
  • java数组如何初始化?
    Java语言中数组必须先初始化,然后才可以使用。所谓初始化就是为数组的数组元素分配内存空间,并为每个数组元素附初始值。注意:数组完成初始化后,内存空间中针对该数组的各个元素就有个一个默认值: ● 基本数据类型的整数类型(byte、short...
    99+
    2018-03-13
    java教程 java 数组 初始化
  • C#中如何初始化数组
    这篇文章给大家介绍C#中如何初始化数组,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#数组初始化int[] iArray = new int[3]{2, 3, 4} 花括号被称为数组初始化器,数组初始化器只能在声明数...
    99+
    2023-06-17
  • win10磁盘初始化函数不正确如何解决
    要解决Windows 10磁盘初始化函数不正确的问题,您可以尝试以下方法:1. 使用磁盘管理工具初始化磁盘:按下Win + X键,然...
    99+
    2023-09-20
    win10
  • Go 的入口函数和包初始化的使用
    目录包 packagemain.main 函数:Go 应用的入口函数package main注意其他包也可以拥有 main 函数或方法重点引子init 函数:Go 包的初始化函数和 ...
    99+
    2022-11-13
  • 怎么使用c#构造函数初始化列表
    在C#中,可以使用构造函数初始化列表来初始化类的成员变量。构造函数初始化列表是在构造函数的参数列表后面使用冒号来定义的。下面是一个示...
    99+
    2023-09-28
    c#
  • c语言数组如何初始化
    C语言数组可以通过以下几种方式进行初始化:1. 静态初始化:在定义数组时,直接给出初始值,并用大括号括起来。```cint arr[...
    99+
    2023-08-25
    c语言
  • vue中如何初始化data数据
    目录如何初始化data数据vue程序初始化流程初始化改写的原因流程实现源码流程初始化流程如何初始化data数据 后台管理系统中,新建和编辑使用同一个页面,常常需要初始化data数据。...
    99+
    2022-11-13
  • GO如何初始化数据结构
    本篇内容主要讲解“GO如何初始化数据结构”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“GO如何初始化数据结构”吧!使用 golang 进行编码过程中,你们都是如何初始化数据结构的呢?GO 里面提...
    99+
    2023-07-04
  • 从oracle到hdfs如何初始化数据
    这篇文章主要讲解了“从oracle到hdfs如何初始化数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“从oracle到hdfs如何初始化数据”吧!### oracle GoldenGate...
    99+
    2023-06-03
  • 详解从源码分析tomcat如何调用Servlet的初始化
    目录引言一、代码启动tomcat二、tomcat框架三、创建容器(addWebapp())3.1 方法 调用流程图3.2 源码分析四、启动容器(tomcat.start())4.1、...
    99+
    2022-11-12
  • MySQL数据库服务器如何初始化
    小编给大家分享一下MySQL数据库服务器如何初始化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  风险性操作命令被强迫隐含重改...
    99+
    2022-10-19
  • 如何在Java中静态初始化数组
    这期内容当中小编将会给大家带来有关如何在Java中静态初始化数组,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客...
    99+
    2023-06-14
  • 如何在Java中初始化二维数组
    本篇文章给大家分享的是有关如何在Java中初始化二维数组,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。常用的java框架有哪些1.SpringMVC,Spring Web MV...
    99+
    2023-06-14
  • 如何使用Mkusb初始化USB设备
    这篇文章将为大家详细讲解有关如何使用Mkusb初始化USB设备,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Mkusb是用于在Ubuntu Linux上制作可启动驱动器的图形实用程序,它使用dd工具在后台...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作