【Vue3源码学习】— CH3.1 apiCreateApp.ts: 创建Vue应用实例

本文详细介绍了Vue3中createApp在apiCreateApp.ts中的作用,探讨了创建应用实例、挂载、卸载以及提供与注入等核心概念。通过源码解析,阐述了Vue3的挂载过程、虚拟DOM机制和关键函数,揭示了Vue响应式原理和模块化设计的优势。
摘要由CSDN通过智能技术生成

在Vue 3中,createApp是启动Vue应用的核心。apiCreateApp.ts文件包含了创建Vue应用实例的API,不仅允许开发者挂载根组件,还提供了配置全局属性、指令和组件的能力。本文将深入探讨createApp的工作原理和它提供的各种方法。

1.Vue项目中的应用

Vue项目通常在入口文件通过createApp创建并配置Vue实例,这是整个应用的起点:

import {
    createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)
app.mount('#app')

2. 关键概念

2.1 挂载(mount)

挂载过程将Vue应用连接到DOM元素上,是应用启动的关键步骤。通过.mount(selector)方法,Vue将应用的根组件渲染为实际DOM元素并插入指定挂载点。这一步骤是响应式数据变化反映到DOM、用户看到界面内容的先决条件。

2.2 卸载(unmount)

卸载过程涉及从其挂载点移除Vue应用,清除事件监听器和响应式系统,避免内存泄漏。通过.unmount()方法,应用实例从页面中完全移除,停止响应数据变化。

2.3 提供与注入(Provide/Inject)

提供(Provide)和注入(Inject)机制允许跨组件通信,特别适用于深层嵌套组件或需要跨多层传递数据的场景。.provide(key, value)方法定义提供的数据,inject(key)方法在组件内访问由其上游组件(或应用实例)提供的数据或方法。

3. 核心功能

3.1 创建应用实例

createApp函数接收根组件作为参数,返回应用实例。该实例提供方法注册全局组件、指令、混入、提供/注入等,是应用配置的入口。

3.2 实例属性

带有下划线(_)的属性主要用于Vue内部管理和高级用途,通常情况下开发者不需要直接操作这些属性。config属性提供了一个更为官方和安全的方式来修改应用的配置,这是与应用实例交互时更常用的接口。

属性 描述 使用示例
_uid 应用实例的唯一标识符 用于内部管理,通常不需要直接使用
_component 应用的根组件对象 用于引用创建应用时传入的根组件
_props 传递给根组件的props对象 用于存储和访问根组件的props
_container 应用被挂载的DOM容器 在app.mount()后,可用于访问挂载的容器元素
_context 应用的上下文对象,包含应用级别的设置和全局注册 用于访问应用的全局配置和注册
_instance 根组件的实例 在开发工具中可用于访问根组件实例的状态和属性
config 应用的配置对象,允许修改Vue的全局配置 例如,通过app.config.globalProperties添加全局属性

3.3 实例方法

方法 描述
use 用于安装Vue插件
mixin 允许全局注册一个混入,影响之后所有创建的Vue实例
component 全局注册或检索一个组件
directive 全局注册或检索一个指令
mount 挂载Vue应用到DOM元素上
unmount 卸载应用实例
provide 允许应用实例提供一个可以被整个应用中的组件注入的值
runWithContext 在当前应用上下文中执行一个函数

使用示例

//安装Vue Router插件
app.use(router) ;
//添加一个全局混入
app.mixin({
    
    created() {
    console.log('Global Mixin') } 
})
//注册全局组件
app.component('MyComponent', MyComponent) 
//获取全局组件
app.component('MyComponent') 
//注册全局指令
directive('my-directive', {
   }) 
//获取全局指令
app.directive('my-directive') 
//挂载应用到具有id="app"的DOM元素
app.mount('#app') 
//卸载已挂载的Vue应用
app.unmount() 
//提供一个可以被注入的值
app.provide('key', value) 
//执行函数
app.runWithContext(
    () => {
    /* 在应用上下文中执行某些操作 */ }
)

4. 源码解析

4.1 createAppContext

/**
 * 创建一个新的应用上下文
 * 这个上下文对象为整个应用提供了一个全局的作用域,使得在任何地方都可以访问到这些全局注册的资源:
 * 如混入(mixins)、组件、指令、提供的值(provides)等
 */
export function createAppContext(): AppContext {
   
  return {
   
    app: null as any,
    config: {
   
      isNativeTag: NO,
      performance: false,
      globalProperties: {
   },
      optionMergeStrategies: {
   },
      errorHandler: undefined,
      warnHandler: undefined,
      compilerOptions: {
   },
    },
    mixins: [],
    components: {
   },
    directives: {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值