Vue中的 VueComponent

VueComponent

组件的本质

  • Vue 组件是一个可复用的 Vue 实例。
  • 每个组件本质上就是通过 Vue.extend() 创建的构造函数,或者在 Vue 3 中是由函数式 API(Composition API)创建的。
// Vue 2
const MyComponent = Vue.extend({template: '<div>Hello</div>'
});

组件注册

  • 全局注册:Vue.component(‘MyComponent’, {…})
  • 局部注册:
export default {components: {MyComponent}
}

Props 和事件

  • props:父传子,用于组件参数传递。
  • 自定义事件 $emit:子传父。
// 子组件
this.$emit('update:value', newValue);

插槽 Slot

  • 默认插槽、具名插槽、作用域插槽。
<slot name="header"></slot>

生命周期钩子

  • beforeCreate → created → beforeMount → mounted → beforeUpdate → updated → beforeDestroy → destroyed

深入理解 VueComponent

VueComponent 的创建过程(以 Vue 2 为例)

Vue 执行 new Vue({…}) 时会走如下过程:

a. Vue.extend() 创建组件构造器

function VueComponent (options) {
this._init(options);
}

b. _init() 方法中合并配置、初始化生命周期、事件、render、data 等。

c. 渲染和挂载:调用 vm.$mount() → 创建 VNode → patch → 转换为真实 DOM。

组件更新机制

  • 响应式依赖收集(Dep 和 Watcher)
  • 数据变动触发组件局部更新(通过虚拟 DOM 的 diff 算法)。

🧩 VueComponent 源码解读(以 Vue 2.x 为主)

我们从组件创建 → 渲染 → 响应更新 → 销毁 全流程解读。

组件的创建过程

🔧 Vue.component() 注册组件

Vue.component('MyComp', {props: ['msg'],template: '<div>{{ msg }}</div>'
});

注册后,内部通过 Vue.options.components[‘MyComp’] 存储组件定义,等待使用。

注册本质:调用 extend 创建一个组件构造器(子类):

function initGlobalAPI (Vue) {Vue.component = function (id, definition) {if (typeof definition === 'object') {definition = Vue.extend(definition); // 核心!}Vue.options.components[id] = definition;}
}

🏗️ Vue.extend 组件构造器

源码位置:src/core/global-api/extend.js

Vue.extend = function (extendOptions) {const Sub = function VueComponent(options) {this._init(options);};Sub.prototype = Object.create(Vue.prototype); // 原型继承Sub.prototype.constructor = Sub;Sub.options = mergeOptions(Vue.options, extendOptions);return Sub;
};

重点:

  • 每个组件都是 Vue 的子类。
  • 合并父 Vue 的选项和当前组件的选项。

组件实例的初始化

当我们在模板中写 ,Vue 解析 VNode 时会进入 createComponent() → createComponentInstanceForVnode() → new VNode.componentOptions.Ctor()。

🔄 调用 vm._init()

位置:src/core/instance/init.js

Vue.prototype._init = function (options) {vm.$options = mergeOptions(resolveConstructorOptions(vm.constructor), options);initLifecycle(vm);initEvents(vm);initRender(vm);callHook(vm, 'beforeCreate');initState(vm); // 初始化 props、methods、data、computed、watchcallHook(vm, 'created');if (vm.$options.el) {vm.$mount(vm.$options.el);}
}

组件的挂载与渲染

🔨 vm.$mount() → 编译模板 → 生成 render 函数

位置:src/platforms/web/entry-runtime-with-compiler.js

const mount = Vue.prototype.$mount;
Vue.prototype.$mount = function (el) {el = document.querySelector(el);if (!this.$options.render) {const template = this.$options.template;const render = compileToFunctions(template);this.$options.render = render;}return mount.call(this, el);
}

🧱 渲染流程:render() → vnode → patch()

位置:src/core/instance/lifecycle.js

vm._update(vm._render());

•	_render() 执行 render 函数,返回 vnode。
•	_update() 使用 patch 将 vnode 转为真实 DOM。

响应式更新机制

🔁 组件的响应式核心依赖于:Observer、Dep、Watcher

  • data 中的数据会被劫持(defineReactive)
  • 每个组件对应一个渲染 watcher。
  • 数据更新时通知 Dep → 触发 watcher → 重新执行 render → 生成新 vnode → diff patch。
new Watcher(vm, updateComponent, noop);

组件销毁过程

调用 $destroy():

Vue.prototype.$destroy = function () {callHook(vm, 'beforeDestroy');// 删除 watcher// 解绑事件// 从 DOM 移除callHook(vm, 'destroyed');
}

🧬 源码主线流程总结(Vue 2)

Vue.component(…) → Vue.extend(…) → 组件构造函数 Sub

渲染 →
createComponent() →
new Sub(options) →
_init() →
mergeOptions → initState →
created → $mount()

$mount() →
compile(template) → render →
render() → vnode →
patch(vnode) → 挂载 DOM

数据更新 → Observer 触发 Dep.notify →
Watcher.update() → 重新 render → patch → 更新 DOM

📘 推荐文件入口

功能文件描述
全局 API 初始化src/core/global-api/index.js包括 Vue.component
组件构造器src/core/global-api/extend.js实现 Vue.extend
Vue 初始化src/core/instance/init.js实现 _init()
生命周期src/core/instance/lifecycle.jscreated、mounted 等钩子
渲染函数src/core/instance/render.jsvm._render()
虚拟 DOM → DOMsrc/core/vdom/patch.jsdiff 算法
响应式系统src/core/observer/包含 Dep、Watcher、Observer

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

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

相关文章

使用 FFmpeg 将视频转换为高质量 GIF(保留原始尺寸和帧率)

在制作教程动图、产品展示、前端 UI 演示等场景中,我们经常需要将视频转换为体积合适且清晰的 GIF 动图。本文将详细介绍如何使用 FFmpeg 工具将视频转为高质量 GIF,包括: ✅ 保留原视频尺寸或自定义缩放✅ 保留原始帧率或自定义帧率✅ 使用调色板优化色彩质量✅ 降低体积同…

【自然语言处理与大模型】大模型Agent四大的组件

大模型Agent是基于大型语言模型构建的智能体&#xff0c;它们能够模拟独立思考过程&#xff0c;灵活调用各类工具&#xff0c;逐步达成预设目标。这类智能体的设计旨在通过感知、思考与行动三者的紧密结合来完成复杂任务。下面将从大模型大脑&#xff08;LLM&#xff09;、规划…

《软件工程》第 11 章 - 结构化软件开发

结构化软件开发是一种传统且经典的软件开发方法&#xff0c;它强调将软件系统分解为多个独立的模块&#xff0c;通过数据流和控制流来描述系统的行为。本章将结合 Java 代码示例、可视化图表&#xff0c;深入讲解面向数据流的分析与设计方法以及实时系统设计的相关内容。 11.1 …

初步尝试AI应用开发平台——Dify的本地部署和应用开发

随着大语言模型LLM和相关应用的流行&#xff0c;在本地部署并构建知识库&#xff0c;结合企业的行业经验或个人的知识积累进行定制化开发&#xff0c;是LLM的一个重点发展方向&#xff0c;在此方向上也涌现出了众多软件框架和工具集&#xff0c;Dify就是其中广受关注的一款&…

高阶数据结构——哈希表的实现

目录 1.概念引入 2.哈希的概念&#xff1a; 2.1 什么叫映射&#xff1f; 2.2 直接定址法 2.3 哈希冲突&#xff08;哈希碰撞&#xff09; 2.4 负载因子 2.5 哈希函数 2.5.1 除法散列法&#xff08;除留余数法&#xff09; 2.5.2 乘法散列法&#xff08;了解&#xff09…

7.安卓逆向2-frida hook技术-介绍

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

DB-GPT扩展自定义Agent配置说明

简介 文章主要介绍了如何扩展一个自定义Agent&#xff0c;这里是用官方提供的总结摘要的Agent做了个示例&#xff0c;先给大家看下显示效果 代码目录 博主将代码放在core目录了&#xff0c;后续经过对源码的解读感觉放在dbgpt_serve.agent.agents.expand目录下可能更合适&…

Android 架构演进之路:从 MVC 到 MVI,拥抱单向数据流的革命

在移动应用开发的世界里&#xff0c;架构模式的演进从未停歇。从早期的 MVC 到后来的 MVP、MVVM&#xff0c;每一次变革都在尝试解决前一代架构的痛点。而今天&#xff0c;我们将探讨一种全新的架构模式 ——MVI&#xff08;Model-View-Intent&#xff09;&#xff0c;它借鉴了…

【YOLOv8-pose部署至RK3588】模型训练→转换RKNN→开发板部署

已在GitHub开源与本博客同步的YOLOv8_RK3588_object_pose 项目&#xff0c;地址&#xff1a;https://github.com/A7bert777/YOLOv8_RK3588_object_pose 详细使用教程&#xff0c;可参考README.md或参考本博客第六章 模型部署 文章目录 一、项目回顾二、文件梳理三、YOLOv8-pose…

集成30+办公功能的实用工具

软件介绍 本文介绍的软件是千峰办公助手。 软件功能概述与开发目的 千峰办公助手集成了自动任务、系统工具、文件工具、PDF工具、OCR图文识别、文字处理、电子表格七个模块&#xff0c;拥有30余项实用功能。作者开发该软件的目的是解决常见办公痛点&#xff0c;把机械操作交…

IDEA启动报错:Cannot invoke “org.flowable.common.engine.impl.persistence.ent

1.问题 项目启动报错信息 java.lang.NullPointerException: Cannot invoke "org.flowable.common.engine.impl.persistence.ent 2.问题解析 出现这个问题是在项目中集成了Flowable或Activiti工作流&#xff0c;开启自动创建工作流创建的表&#xff0c;因为不同环境的数据…

网络安全--PHP第三天

今天学习文件上传的相关知识 上传的前端页面如下 upload.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

【愚公系列】《生产线数字化设计与仿真》004-颜色分类站仿真(基础概念)

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…

基于 uni-app + <movable-view>拖拽实现的标签排序-适用于微信小程序、H5等多端

在实际业务中&#xff0c;我们经常遇到「标签排序」或「菜单调整」的场景。微信小程序原生的 movable-view 为我们提供了一个简单、高效的拖拽能力&#xff0c;结合 Vue3 uni-app 的组合&#xff0c;我们可以实现一个体验良好的标签管理界面。 核心组件&#xff1a;<movab…

一些较好的学习方法

1、网上有一些非常经典的电路&#xff0c;而且有很多视频博主做了详细的讲解。 2、有一部分拆解的UP主&#xff0c;拆解后会还原该器件的原理图&#xff0c;并一步步做讲解。 3、有两本书&#xff0c;数电、模电&#xff0c;这两本书中的内容很多都值得学习。 5、某宝上卖的…

《1.1_4计算机网络的分类|精讲篇|附X-mind思维导图》

网络相关知识 按使用范围分类 公用网 由电信部门或其他提供通信服务的经营部门组建、管理和控制&#xff0c;向全社会提供服务的网络。 专用网 由某个单位或部门组建、仅供本单位或部门内部使用的网络。 按传输介质分类 有线网络 如&#xff1a;双绞线、同轴电缆、光纤…

Git 和 GitHub 学习指南本地 Git 配置、基础命令、GitHub 上传流程、企业开发中 Git 的使用流程、以及如何将代码部署到生产服务器

Windows 上 Git 安装与配置 下载安装&#xff1a;访问 Git 官方网站下载适用于 Windows 的安装程序。运行安装包时会出现许可协议、安装目录、组件选择等界面&#xff08;如下图&#xff09;。在“Select Components”页面建议勾选 Git Bash Here 等选项&#xff0c;以便在资源…

航空航天领域对滚珠丝杆的精度要求有多高?

航空航天领域对滚珠丝杆的精度要求非常高&#xff0c;尤其是飞行器、火箭和卫星等载具的导航和定位系统都需要高精度的滚珠丝杆&#xff0c;以确保高精度的位置控制和稳定的导航性能。那么&#xff0c;航空航天领域对滚珠丝杆的精度要求有多高&#xff1f; 1、定位精度&#xf…

技术篇-2.5.Matlab应用场景及开发工具安装

Matlab 在数学建模和数值分析等领域具有无可替代的地位。它几乎涵盖所有常见数学算法的内置函数库&#xff0c;使得从数据预处理、方程求解到优化算法的实现&#xff0c;无需编写大量底层代码即可快速完成&#xff1b;同时&#xff0c;Matlab 强大的可视化能力&#xff0c;可以…

Vtk概览1

vtk环境搭建 见&#xff08;VTK开发环境配置(Visual Studio C)-详细图文教程-CSDN博客&#xff09; 在学习vtk图形图像进阶的第二章时&#xff0c;通过vs2022建的控制台程序&#xff0c;编写运行示例2.1 发现 不显示图像。 #include <iostream> #include<vtkRenderW…