在一些特殊場景下,使用元件的時機無法確定,或者無法在Vue的template中確定要我們要使用的元件,這時就需要動態的掛載元件,或使用執行時間編譯動態建立元件並掛載。
今天我們將帶大家從實際專案出發,看看在實際解決客戶問題時,如何將元件進行動態掛載,並為大家展示一個完整的解決動態掛載問題的完整過程。
無法解決的「動態掛載」
#我們的電子表格控制項SpreadJS在運行時,存在這樣一個功能:當使用者雙擊儲存格會顯示一個輸入框用於編輯儲存格的內容,使用者可以根據需求按照自訂儲存格類型的規格自訂輸入框的形式,整合任何Form表單輸入類型。
這個輸入框的創建銷毀都是透過繼承單元格類型對應方法實現的,因此這裡就存在一個問題——這個動態的創建方式並不能簡單在VUE template中配置,然後直接使用。 【相關推薦:vuejs影片教學】
#而就在前不久,客戶問然詢問我:你家控制項的自訂儲存格是否支援Vue元件比如ElementUI的AutoComplete?
由於前面提到的這個問題:
沉思許久,我認真給客戶回复:“組件運行生命週期不一致,用不了”,但又話鋒一轉,表示可以使用通用元件解決這個問題。
問題呢,是順利解決了。
但是這個無奈的"用不了",卻也成為我這幾天午夜夢回跨不去的坎。
#後來,某天看Vue文件時,我想到App是運行時掛載到#app上的。 ,從理論上來說,其他元件也應該能動態掛載到需要的Dom上,這樣創建時機的問題不就解決了嘛!
正式開啟動態掛載
讓我們繼續查看文檔,全域APIVue.extend( options )是透過extend建立的。 Vue實例可以使用$mount方法直接掛載到DOM元素上-這正是我們所需要的。
<div></div> // 创建构造器 var Profile = Vue.extend({ template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>', data: function () { return { firstName: 'Walter', lastName: 'White', alias: 'Heisenberg' } } }) // 创建 Profile 实例,并挂载到一个元素上。 new Profile().$mount('#mount-point')
依照SpreadJS自訂單元格範例建立AutoCompleteCellType,並設定到儲存格中:
function AutoComplateCellType() { } AutoComplateCellType.prototype = new GC.Spread.Sheets.CellTypes.Base(); AutoComplateCellType.prototype.createEditorElement = function (context, cellWrapperElement) { // cellWrapperElement.setAttribute("gcUIElement", "gcEditingInput"); cellWrapperElement.style.overflow = 'visible' let editorContext = document.createElement("div") editorContext.setAttribute("gcUIElement", "gcEditingInput"); let editor = document.createElement("div"); // 自定义单元格中editorContext作为容器,需要在创建一个child用于挂载,不能直接挂载到editorContext上 editorContext.appendChild(editor); return editorContext; } AutoComplateCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) { let width = cellRect.width > 180 ? cellRect.width : 180; if (editorContext) { // 创建构造器 var Profile = Vue.extend({ template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>', data: function () { return { firstName: 'Walter', lastName: 'White', alias: 'Heisenberg' } } }) // 创建 Profile 实例,并挂载到一个元素上。 new Profile().$mount(editorContext.firstChild); } };
運行,雙擊進入編輯狀態,結果卻發現報錯了
[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included templates into render functions, or use the compiler-included build.
根據報錯提示,此時候我們有兩種解決方法:
- 開啟runtimeCompiler,在vue.config.js中加入runtimeCompiler: true的配置,允許執行時間編譯,這樣可以動態產生template,滿足動態元件的需求
- 提前編譯模板僅動態掛載,autocomplete的元件是確定的,我們可以使用這個方法
- 新AutoComplete.vue元件用於動態掛載,這樣可以掛載編譯好的元件。
<template> <div> <p>{{ firstName }} {{ lastName }} aka {{ alias }}</p> </div> </template> <script> export default { data: function () { return { firstName: "Walter", lastName: "White", alias: "Heisenberg", }; }, }; </script> import AutoComplate from './AutoComplate.vue' AutoComplateCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) { let width = cellRect.width > 180 ? cellRect.width : 180; if (editorContext) { // 创建构造器 var Profile = Vue.extend(AutoComplate); // 创建 Profile 实例,并挂载到一个元素上。 new Profile().$mount(editorContext.firstChild); } };
雙擊進入編輯狀態,看到元件中的內容
#下一步,對於自訂儲存格還需要設定和取得元件中的編輯內容,這時透過為元件新增props,同時在掛載時建立的VueComponent實例上直接取得到所有props內容,對應操作即可實現資料擷取設定。
更新AutoComplate.vue,新增props,增加input用於編輯
<template> <div> <p>{{ firstName }} {{ lastName }} aka {{ alias }}</p> <input> </div> </template> <script> export default { props:["value"], data: function () { return { firstName: "Walter", lastName: "White", alias: "Heisenberg", }; }, }; </script>
透過this.vm儲存VueComponent實例,在getEditorValue 和setEditorValue 方法中取得和給VUE元件設定Value。編輯結束,透過呼叫$destroy()方法銷毀動態建立的元件。
AutoComplateCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) { let width = cellRect.width > 180 ? cellRect.width : 180; if (editorContext) { // 创建构造器 var Profile = Vue.extend(MyInput); // 创建 Profile 实例,并挂载到一个元素上。 this.vm = new Profile().$mount(editorContext.firstChild); } }; AutoComplateCellType.prototype.getEditorValue = function (editorContext) { // 设置组件默认值 if (this.vm) { return this.vm.value; } }; AutoComplateCellType.prototype.setEditorValue = function (editorContext, value) { // 获取组件编辑后的值 if (editorContext) { this.vm.value = value; } }; AutoComplateCellType.prototype.deactivateEditor = function (editorContext, context) { // 销毁组件 this.vm.$destroy(); this.vm = undefined; };
整個流程跑通了,下來只需要在AutoComplate.vue中,將input替換成ElementUI 的el- autocomplete並實作對應方法就好了。
讓我們看看效果吧。
其實動態掛載並不是什麼複雜操作,理解了Vue範例,透過vm來操作實例,靈活的運用動態掛載或執行時編譯的元件就不是什麼難事了。
其實一切的解決方案就在Vue教程入門教程中,但是腳手架的使用和各種工具的使用讓我們忘記了Vue的初心,反而把簡單問題複雜化了。
今天的分享到這裡就結束啦,後續還會為大家帶來更多嚴肅有趣的內容~
更多程式相關知識,請造訪:程式設計入門! !
以上是帶你使用Vue搞定無法解決的'動態掛載”的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Vue.js是由尤雨溪在2014年發布的漸進式JavaScript框架,用於構建用戶界面。它的核心優勢包括:1.響應式數據綁定,數據變化自動更新視圖;2.組件化開發,UI可拆分為獨立、可複用的組件。

Netflix使用React作為其前端框架。 1)React的組件化開發模式和強大生態系統是Netflix選擇它的主要原因。 2)通過組件化,Netflix將復雜界面拆分成可管理的小塊,如視頻播放器、推薦列表和用戶評論。 3)React的虛擬DOM和組件生命週期優化了渲染效率和用戶交互管理。

Netflix在前端技術上的選擇主要集中在性能優化、可擴展性和用戶體驗三個方面。 1.性能優化:Netflix選擇React作為主要框架,並開發了SpeedCurve和Boomerang等工具來監控和優化用戶體驗。 2.可擴展性:他們採用微前端架構,將應用拆分為獨立模塊,提高開發效率和系統擴展性。 3.用戶體驗:Netflix使用Material-UI組件庫,通過A/B測試和用戶反饋不斷優化界面,確保一致性和美觀性。

NetflixusesAcustomFrameworkcalled“ Gibbon” BuiltonReact,notReactorVuedIrectly.1)TeamSperience:selectBasedonFamiliarity.2)ProjectComplexity:vueforsimplerprojects:reactforforforproproject,reactforforforcompleplexones.3)cocatizationneedneeds:reactoffipicatizationneedneedneedneedneedneeds:reactoffersizationneedneedneedneedneeds:reactoffersizatization needefersmoreflexibleise.4)

Netflix在框架選擇上主要考慮性能、可擴展性、開發效率、生態系統、技術債務和維護成本。 1.性能與可擴展性:選擇Java和SpringBoot以高效處理海量數據和高並發請求。 2.開發效率與生態系統:使用React提升前端開發效率,利用其豐富的生態系統。 3.技術債務與維護成本:選擇Node.js構建微服務,降低維護成本和技術債務。

Netflix主要使用React作為前端框架,輔以Vue用於特定功能。 1)React的組件化和虛擬DOM提升了Netflix應用的性能和開發效率。 2)Vue在Netflix的內部工具和小型項目中應用,其靈活性和易用性是關鍵。

Vue.js是一種漸進式JavaScript框架,適用於構建複雜的用戶界面。 1)其核心概念包括響應式數據、組件化和虛擬DOM。 2)實際應用中,可以通過構建Todo應用和集成VueRouter來展示其功能。 3)調試時,建議使用VueDevtools和console.log。 4)性能優化可通過v-if/v-show、列表渲染優化和異步加載組件等實現。

Vue.js適合小型到中型項目,而React更適用於大型、複雜應用。 1.Vue.js的響應式系統通過依賴追踪自動更新DOM,易於管理數據變化。 2.React採用單向數據流,數據從父組件流向子組件,提供明確的數據流向和易於調試的結構。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Dreamweaver Mac版
視覺化網頁開發工具