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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82498.shtml
英文地址,請注明出處:http://en.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…