如何解析Vue中動態(tài)組件怎么使用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為猇亭企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、成都網(wǎng)站制作,猇亭網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
動態(tài)組件在開發(fā)的過程中大多數(shù)情況下都會用到,當我們需要在不同的組件之間進行狀態(tài)切換時,動態(tài)組件可以很好的滿足我們的需求,其中的核心是component
標簽和is
屬性的使用。
// js var child1 = { template: 'content1', } var child2 = { template: 'content2' } var child3 = { template: 'content3' } var vm = new Vue({ el: '#app', components: { child1, child2, child3 }, methods: { changeTabs(tab) { this.chooseTabs = tab; } } })
例子是一個動態(tài)組件的基本使用場景,當點擊按鈕時,視圖根據(jù)this.chooseTabs
值在組件child1,child2,child3
間切換。
的解讀和前面幾篇內(nèi)容一致,會從AST
解析階段說起,過程也不會專注每一個細節(jié),而是把和以往處理方式不同的地方特別說明。針對動態(tài)組件解析的差異,集中在processComponent
上,由于標簽上is
屬性的存在,它會在最終的ast
樹上打上component
屬性的標志。
// 針對動態(tài)組件的解析 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
樹,接下來是根據(jù)ast
樹生成可執(zhí)行的render
函數(shù),由于有component
屬性,render
函數(shù)的產(chǎn)生過程會走genComponent
分支。
// render函數(shù)生成函數(shù) var code = generate(ast, options); // generate函數(shù)的實現(xiàn) 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; // 動態(tài)組件分支 if (el.component) { code = genComponent(el.component, el, state); } }
針對動態(tài)組件的處理邏輯其實很簡單,當沒有內(nèi)聯(lián)模板標志時(后面會講),拿到后續(xù)的子節(jié)點進行拼接,和普通組件唯一的區(qū)別在于,_c
的第一個參數(shù)不再是一個指定的字符串,而是一個代表組件的變量
// 針對動態(tài)組件的處理 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)}
簡單的總結(jié),動態(tài)組件和普通組件的區(qū)別在于:
ast
階段新增了component
屬性,這是動態(tài)組件的標志
產(chǎn)生render
函數(shù)階段由于component
屬性的存在,會執(zhí)行genComponent
分支,genComponent
會針對動態(tài)組件的執(zhí)行函數(shù)進行特殊的處理,和普通組件不同的是,_c
的第一個參數(shù)不再是不變的字符串,而是指定的組件名變量。
render
到vnode
階段和普通組件的流程相同,只是字符串換成了變量,并有{ tag: 'component' }
的data
屬性。例子中chooseTabs
此時取的是child1
。
有了render
函數(shù),接下來從vnode到真實節(jié)點的過程和普通組件在流程和思路上基本一致。
關(guān)于如何解析Vue中動態(tài)組件怎么使用問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。