Vue.extend

Vue.extend 是 Vue 2 中的一個重要 API,用于基于一個組件配置對象創建一個“可復用的組件構造函數”。它是 Vue 內部構建組件的底層機制之一,適用于某些高級用法,比如手動掛載組件、彈窗動態渲染等。

?? 在 Vue 3 中已被移除,Vue 3 使用 defineComponent 替代組件定義方式,推薦改用 Composition API 和函數式組件模式。

🧩 Vue.extend 的基本用法

const MyComponent = Vue.extend({template: '<div>Hello {{ name }}</div>',data() {return {name: 'World'};}
});

這個 MyComponent 是一個構造函數,你可以像創建 Vue 實例一樣使用它:

const vm = new MyComponent();
vm.$mount('#app'); // 或者不傳參數,使用 vm.$mount() + DOM 操作手動插入

📦 使用場景舉例

? 動態創建組件實例(如彈窗)

const Popup = Vue.extend({template: '<div class="popup">我是彈窗</div>'
});const instance = new Popup();
instance.$mount(); // 不傳參數,不插入頁面
document.body.appendChild(instance.$el); // 手動掛載

? 結合 propsData 動態傳值

const Alert = Vue.extend({props: ['message'],template: '<div class="alert">{{ message }}</div>'
});const alertInstance = new Alert({propsData: {message: '操作成功'}
});
alertInstance.$mount();
document.body.appendChild(alertInstance.$el);

? 用于組件庫或插件封裝(如 Message、Toast)

很多組件庫(如 Element UI)內部使用 Vue.extend 構建彈窗或消息提示組件。

🔍深入理解:Vue.extend 做了什么?

本質上:

Vue.extend(ComponentOptions)

會返回一個新的組件構造函數,該構造函數是基于你傳入的選項創建的,繼承自 Vue 構造器,具備 Vue 實例的能力。

相當于內部做了:

function SubComponent() {Vue.call(this); // 繼承 Vue 構造器// ...
}
SubComponent.prototype = Object.create(Vue.prototype);

所以你可以這樣理解:

  • Vue.extend 類似于類的繼承
  • 生成的構造器可以多次 new 實例化
  • 實例是完整的 Vue 實例,具備 data、methods、watch、生命周期等功能

? 注意事項

問題原因
this.xxx 報錯未通過 $mount 激活組件
propsData 無效只能傳給 Vue.extend 的實例,而不是組件本身
內存泄漏手動創建的組件需要手動 $destroy() 和移除 DOM

🚫 Vue 3 替代方案

Vue.extend 在 Vue 3 被移除,推薦使用:

? defineComponent + createApp

import { createApp, defineComponent } from 'vue';const Alert = defineComponent({props: ['message'],template: '<div>{{ message }}</div>'
});const app = createApp(Alert, { message: '你好 Vue 3' });
const container = document.createElement('div');
document.body.appendChild(container);
app.mount(container);

? 總結

內容Vue.extend
定義方式const Ctor = Vue.extend(options)
本質返回繼承自 Vue 的構造函數
常見用途彈窗、動態組件、組件庫
Vue 3 替代defineComponent + createApp()

例子

Vue 2 彈窗組件的樣式增強版,加入了:

  • ? 遮罩層(點擊遮罩可關閉)
  • ? 居中彈出 + 陰影 + 圓角
  • ? 動畫效果(淡入、淡出)
  • ? 簡潔現代風格(仿 Element UI)

🗂? 目錄結構

├── index.html
├── main.js
├── MyDialog.js

📄 MyDialog.js — 定義彈窗組件

// MyDialog.js
import Vue from 'vue';const MyDialog = Vue.extend({props: ['message'],data() {return {visible: false};},mounted() {// 延遲顯示以觸發動畫setTimeout(() => this.visible = true, 10);},methods: {close() {this.visible = false;setTimeout(() => {this.$destroy();if (this.$el && this.$el.parentNode) {this.$el.parentNode.removeChild(this.$el);}}, 300); // 延遲移除以匹配動畫},onMaskClick(e) {if (e.target === this.$el) {this.close();}}},template: `<div class="dialog-mask" @click="onMaskClick"><div class="dialog-box" :class="{ 'dialog-show': visible, 'dialog-hide': !visible }"><p class="dialog-message">{{ message }}</p><button class="dialog-close" @click="close">關閉</button></div></div>`,style: `.dialog-mask {position: fixed;top: 0; left: 0;width: 100vw; height: 100vh;background: rgba(0, 0, 0, 0.4);display: flex;align-items: center;justify-content: center;z-index: 9999;}.dialog-box {background: white;border-radius: 8px;padding: 20px 24px;box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2);transform: scale(0.9);opacity: 0;transition: all 0.3s ease;min-width: 300px;}.dialog-show {transform: scale(1);opacity: 1;}.dialog-hide {transform: scale(0.9);opacity: 0;}.dialog-message {font-size: 16px;margin-bottom: 16px;}.dialog-close {background-color: #409eff;border: none;color: white;padding: 8px 16px;border-radius: 4px;cursor: pointer;}.dialog-close:hover {background-color: #66b1ff;}`
});// 注入樣式(確保樣式在頁面中)
const style = document.createElement('style');
style.textContent = MyDialog.options.style;
document.head.appendChild(style);export default MyDialog;

📄 main.js — 使用 Vue.extend 創建實例并掛載

// main.js
import Vue from 'vue';
import MyDialog from './MyDialog.js';new Vue({el: '#app',methods: {showDialog() {const DialogConstructor = MyDialog;const instance = new DialogConstructor({propsData: {message: '這是一個提示彈窗'}});instance.$mount(); // 手動掛載組件document.body.appendChild(instance.$el); // 插入到頁面}},template: `<div><button @click="showDialog">打開彈窗</button></div>`
});

📄 index.html — 引入腳本

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>增強版 Vue.extend 彈窗示例</title><style>/* 彈窗遮罩層樣式 */.dialog-overlay {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background: rgba(0, 0, 0, 0.6);display: flex;align-items: center;justify-content: center;z-index: 1000;}/* 彈窗內容樣式 */.dialog-content {background: #fff;padding: 20px;border-radius: 5px;text-align: center;min-width: 300px;box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);}/* 過渡動畫 - 淡入淡出 */.dialog-fade-enter-active,.dialog-fade-leave-active {transition: opacity 0.3s;}.dialog-fade-enter,.dialog-fade-leave-to {opacity: 0;}</style>
</head>
<body><div id="app"></div><!-- Vue 2 官方 CDN --><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!-- 使用 type="module" 加載我們的腳本 --><script type="module" src="./main.js"></script>
</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84479.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MySQL系列】SQL 分組統計與排序

博客目錄 引言一、基礎語法解析二、GROUP BY 的底層原理三、ORDER BY 的排序機制四、NULL 值的處理策略五、性能優化建議六、高級變體查詢 引言 在現代數據分析和數據庫管理中&#xff0c;分組統計是最基礎也是最核心的操作之一。無論是業務報表生成、用戶行為分析還是系統性能…

spring中的InstantiationAwareBeanPostProcessor接口詳解

一、接口定位與核心功能 InstantiationAwareBeanPostProcessor是Spring框架中擴展Bean生命周期的關鍵接口&#xff0c;繼承自BeanPostProcessor。它專注于Bean的實例化階段&#xff08;對象創建和屬性注入&#xff09;的干預&#xff0c;而非父接口的初始化階段&#xff08;如…

uniapp使用sse連接后端,接收后端推過來的消息(app不支持!!)

小白終成大白 文章目錄 小白終成大白前言一、什么是SSE呢&#xff1f;和websocket的異同點有什么&#xff1f;相同點不同點 二、直接上實現代碼總結 前言 一般的請求就是前端發 后端回復 你一下我一下 如果需要有什么實時性的 后端可以主動告訴前端的技術 我首先會想到 webso…

QML學習06Button

QMLx學習06Button 1、Button1.1 狀態改變&#xff08;checkable&#xff09;1.2 排斥性&#xff08;autoExclusive&#xff09;1.3 重復觸發&#xff08;autoRepeat&#xff09;、第一次觸發延時時間&#xff08;autoRepeatDelay&#xff09;、相互之間觸發的時間間隔&#xff…

什么是前端工程化?它有什么意義

前端工程化是指通過工具、流程和規范,將前端開發從手工化、碎片化的模式轉變為系統化、自動化和標準化的生產過程。其核心目標是 提升開發效率、保障代碼質量、增強項目可維護性,并適應現代復雜 Web 應用的需求。 一、前端工程化的核心內容 1. 模塊化開發 代碼模塊化:使用 …

校園二手交易系統

該交易平臺分為兩部分&#xff0c;前臺和后臺。用戶在前臺進行商品選購以及交易&#xff1b;管理員登錄后臺可以對商品進行維護&#xff0c;主要功能包含&#xff1a; 后臺系統的主要功能模塊如下&#xff1a; 登錄功能、注冊功能、后臺首頁 系統設置&#xff1a; 菜單管理、…

06-Web后端基礎(java操作數據庫)

1. 前言 在前面我們學習MySQL數據庫時&#xff0c;都是利用圖形化客戶端工具(如&#xff1a;idea、datagrip)&#xff0c;來操作數據庫的。 我們做為后端程序開發人員&#xff0c;通常會使用Java程序來完成對數據庫的操作。Java程序操作數據庫的技術呢&#xff0c;有很多啊&a…

uni-app學習筆記十三-vue3中slot插槽的使用

在頁面開發中&#xff0c;通常一個頁面分為頭部&#xff0c;尾部&#xff0c;和中心內容區。其中頭部&#xff0c;尾部一般比較固定&#xff0c;而中心區域往往是多樣的&#xff0c;需要自定義開發。此時&#xff0c;我們可以引入slot(插槽)來實現這一目標。<slot> 作為一…

Agent模型微調

這篇文章講解&#xff1a; 把 Agent 和 Fine-Tuning 的知識串起來&#xff0c;在更高的技術視角看大模型應用&#xff1b;加深對 Agent 工作原理的理解&#xff1b;加深對 Fine-Tuning 訓練數據處理的理解。 1. 認識大模型 Agent 1.1 大模型 Agent 的應用場景 揭秘Agent核心…

【最新版】Arduino IDE的安裝入門Demo

1、背景說明 1、本教程編寫日期為2025-5-24 2、Arduino IDE的版本為&#xff1a;Arduino IDE 2.3.6 3、使用的Arduino為Arduino Uno 1、ArduinoIDE的安裝 1、下載。網址如下&#xff1a;官網 2、然后一路安裝即可。 期間會默認安裝相關驅動&#xff0c;默認安裝即可。 3、安…

Python應用運算符初解

大家好!運算符是編程中不可或缺的工具&#xff0c;它們能幫助我們執行各種計算和操作。無論是數學運算&#xff0c;還是變量賦值&#xff0c;運算符都在背后默默發揮作用。對于編程初學者來說&#xff0c;理解并掌握常見運算符的用法是邁向編程世界的重要一步。 算術運算符: 加…

小米2025年校招筆試真題手撕(二)

一、題目 給一個長度為n的序列和一個整數x&#xff0c;每次操作可以選擇序列中的一個元素&#xff0c;將其從序列中刪去&#xff0c;或者將其值加一。 問至少操作多少次&#xff0c;可以使操作后的序列&#xff08;可以為空&#xff09;中數字之和是x的倍數。 輸入描述&#…

CNN卷積神經網絡到底卷了啥?

參考視頻&#xff1a;卷積神經網絡&#xff08;CNN&#xff09;到底卷了啥&#xff1f;8分鐘帶你快速了解&#xff01; 我們知道&#xff1a; 圖片是由像素點構成&#xff0c;即最終的成像效果是由背后像素的顏色數值所決定 在Excel中&#xff1a;有這樣一個由數值0和1組成的66…

教師技術知識對人工智能賦能下教學效果的影響:以教學創新為中介的實證研究

教師技術知識對人工智能賦能下教學效果的影響&#xff1a;以教學創新為中介的實證研究 摘要 隨著教育信息化的快速發展&#xff0c;人工智能技術在教育領域的應用日益廣泛&#xff0c;為教育教學帶來了深刻變革。然而&#xff0c;當前關于教師技術知識如何影響人工智能賦能下的…

Linux驅動學習筆記(九)

設備模型 1.kobject的全稱為kernel object&#xff0c;即內核對象&#xff0c;每一個kobject都會對應到系統/sys/下的一個目錄&#xff0c;這些目錄的子目錄也是一個kobject&#xff0c;以此類推&#xff0c;這些kobject構成樹狀關系&#xff0c;如下圖&#xff1a; kobject定…

25年上半年五月之軟考之設計模式

目錄 一、單例模式 二、工廠模式 三、 抽象工廠模式 四、適配器模式 五、策略模式 六、裝飾器模式 ?編輯 考點&#xff1a;會挖空super(coffeOpertion); 七、代理模式 為什么必須要使用代理對象&#xff1f; 和裝飾器模式的區別 八、備忘錄模式 一、單例模式 這個…

Python打卡第36天

浙大疏錦行 作業&#xff1a; 對之前的信貸項目&#xff0c;利用神經網絡訓練下&#xff0c;嘗試用到目前的知識點讓代碼更加規范和美觀。 import torch import torch.nn as nn import torch.optim as optim from sklearn.model_selection import train_test_split from sklear…

全面理解類和對象(下)

文章目錄 再談構造函數初始化列表 static概念&#xff1a; 友元友元函數友元類 內部類再次理解類和對象 再談構造函數 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day; };上述代碼有了…

TomatoSCI分析日記——層次聚類

TomatoSCI分析日記——層次聚類 今天介紹的是一種常見的聚類方法——層次聚類。層次聚類會將數據集劃分成嵌套的簇&#xff0c;形成一個層次結構&#xff08;樹狀圖&#xff09;&#xff0c;經常用于探究樣本的相似性。用大白話來說&#xff0c;就是&#xff1a;我有一大堆樣品…

mysql都有哪些鎖?

MySQL中的鎖機制是確保數據庫并發操作正確性和一致性的重要組成部分&#xff0c;根據鎖的粒度、用途和特性&#xff0c;可以分為多種類型。以下是MySQL中常見的鎖及其詳細說明&#xff1a; 一、按鎖的粒度劃分 行級鎖&#xff08;Row-level Locks&#xff09; 描述&#xff1a;…