您好,登錄后才能下訂單哦!
如何解析Vue中動態組件怎么使用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
動態組件在開發的過程中大多數情況下都會用到,當我們需要在不同的組件之間進行狀態切換時,動態組件可以很好的滿足我們的需求,其中的核心是component
標簽和is
屬性的使用。
<div id="app"> <button @click="changeTabs('child1')">child1</button> <button @click="changeTabs('child2')">child2</button> <button @click="changeTabs('child3')">child3</button> <component :is="chooseTabs"> </component> </div>
// js var child1 = { template: '<div>content1</div>', } var child2 = { template: '<div>content2</div>' } var child3 = { template: '<div>content3</div>' } var vm = new Vue({ el: '#app', components: { child1, child2, child3 }, methods: { changeTabs(tab) { this.chooseTabs = tab; } } })
例子是一個動態組件的基本使用場景,當點擊按鈕時,視圖根據this.chooseTabs
值在組件child1,child2,child3
間切換。
<component>
的解讀和前面幾篇內容一致,會從AST
解析階段說起,過程也不會專注每一個細節,而是把和以往處理方式不同的地方特別說明。針對動態組件解析的差異,集中在processComponent
上,由于標簽上is
屬性的存在,它會在最終的ast
樹上打上component
屬性的標志。
// 針對動態組件的解析 function processComponent (el) { var binding; // 拿到is屬性所對應的值 if ((binding = getBindingAttr(el, 'is'))) { // ast樹上多了component的屬性 el.component = binding; } if (getAndRemoveAttr(el, 'inline-template') != null) { el.inlineTemplate = true; } }
有了ast
樹,接下來是根據ast
樹生成可執行的render
函數,由于有component
屬性,render
函數的產生過程會走genComponent
分支。
// render函數生成函數 var code = generate(ast, options); // generate函數的實現 function generate (ast,options) { var state = new CodegenState(options); var code = ast ? genElement(ast, state) : '_c("div")'; return { render: ("with(this){return " + code + "}"), staticRenderFns: state.staticRenderFns } } function genElement(el, state) { ··· var code; // 動態組件分支 if (el.component) { code = genComponent(el.component, el, state); } }
針對動態組件的處理邏輯其實很簡單,當沒有內聯模板標志時(后面會講),拿到后續的子節點進行拼接,和普通組件唯一的區別在于,_c
的第一個參數不再是一個指定的字符串,而是一個代表組件的變量
// 針對動態組件的處理 function genComponent ( componentName, el, state ) { // 擁有inlineTemplate屬性時,children為null var children = el.inlineTemplate ? null : genChildren(el, state, true); return ("_c(" + componentName + "," + (genData$2(el, state)) + (children ? ("," + children) : '') + ")") }
"with(this){return _c('div',{attrs:{"id":"app"}},[_c('child1',[_v(_s(test))])],1)}"
with(this){return _c('div',{attrs:{"id":"app"}},[_c(chooseTabs,{tag:"component"})],1)}
簡單的總結,動態組件和普通組件的區別在于:
ast
階段新增了component
屬性,這是動態組件的標志
產生render
函數階段由于component
屬性的存在,會執行genComponent
分支,genComponent
會針對動態組件的執行函數進行特殊的處理,和普通組件不同的是,_c
的第一個參數不再是不變的字符串,而是指定的組件名變量。
render
到vnode
階段和普通組件的流程相同,只是字符串換成了變量,并有{ tag: 'component' }
的data
屬性。例子中chooseTabs
此時取的是child1
。
有了render
函數,接下來從vnode到真實節點的過程和普通組件在流程和思路上基本一致。
關于如何解析Vue中動態組件怎么使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。