淺談Vue的加載順序探討
在Vuejs 1.0版本中,如果父子組件進(jìn)行配合,它們的生命周期執(zhí)行具有如下特點(diǎn):
1. created總是先父后子
生命周期函數(shù)created總是按照從父到子的順序依次執(zhí)行,但是兄弟之間沒有嚴(yán)格按照這樣的順序執(zhí)行,估計(jì)是采用了異步函數(shù),不僅如此,子組件在父組件中的插入順序也是隨機(jī)的,并沒有什么特別的規(guī)律。假定子組件的引用順序如下:
<div class="container"> <child-c1 v-ref:child1></child-c1> <child-c2 v-ref:child2></child-c2> </div>
如果采用$children引用來獲取所有的子組件,那么”child-c1”并不總是處于第一個(gè)位置,如下:
// 大多數(shù)時(shí)候判斷會(huì)失敗 if(this.$children[0] === this.$refs.child1) { // 這里的代碼很可能得不到執(zhí)行機(jī)會(huì) }
2. ready的順序更混亂
按照我的估計(jì),父子組件的ready順序應(yīng)該是先子后父,這樣才能保證組件完全加載完成,但從實(shí)踐的實(shí)例來看,ready完全沒有順序,有時(shí)候是父組件先加載完成,也有時(shí)候是子組件先加載完成,所以在編程實(shí)踐中,絕對(duì)不可以依賴他們的加載順序。
3. 結(jié)論
在實(shí)踐中,如果需要保障組件依次加載完成,絕對(duì)不可以依賴組件的生命順序,也不能依賴父子組件的ready生命周期。
如何判斷所有的子組件加載完成
在父子組件的配合使用中,尤其是配置信息與業(yè)務(wù)信息相分離的情況下,我們經(jīng)常需要在所有的子組件加載完成后,再執(zhí)行父組件的相關(guān)服務(wù),以如下的組件結(jié)構(gòu)為例:
<jq-grid :url="url" col-size="5" :sub-grid="true" ref="accountGrid" :on-ready="initGrid" :query="queryParams"> <jq-col label="賬號(hào)" name="username" width="75" :sortable="true"></jq-col> <jq-col label="用戶名稱" name="remarkName" width="75" :sortable="true"></jq-col> <jq-col label="創(chuàng)建時(shí)間" name="createTime" width="90"> </jq-col> </jq-grid>
在上面的例子中,我們需要組合子組件的配置信息,因此,只有所有的子組件加載完成,組合的配置信息才能準(zhǔn)確完整。
所以,如果直接用mounted事件(1.0中為ready事件),則一定得到不正確的結(jié)果,為了解決此問題,我們不妨生命如下的數(shù)據(jù)結(jié)構(gòu)與方法:
props : { colSize : { type : Number, default : 1 } } data () { return { // 用于獲取所有的子組件配置信息 colModel : [], readySize : 0 } }, methods : { /** * 由子組件在加載完成時(shí)調(diào)用 */ addColModel () { this.readySize ++ // 檢查進(jìn)度是否設(shè)置的colSize一致 if(this.readySize == this.colSize) { // 這時(shí)候所有的子組件已加載完成 } } }
通過設(shè)置配置項(xiàng)“colSize”與檢查子組件調(diào)用的方法“addColModel”,我們可確定所有子組件加載完成的時(shí)刻(此時(shí)父組件有可能加載完成,也可能未加載完成),從而進(jìn)行必要的配置信息整理操作。
但是在實(shí)際應(yīng)用中,我們發(fā)現(xiàn),如果子組件的數(shù)量較多時(shí),會(huì)發(fā)生另外一種現(xiàn)象,子組件加載順序會(huì)隨機(jī)發(fā)生,如果要保證加載順序與配置順序一致,我們可以在子組件中加入“order”屬性,如下,最新配置內(nèi)容如下:
<jq-grid :url="url" col-size="8" :sub-grid="true" ref="hostGrid" :on-ready="initGrid" :query="queryParams"> <jq-col order="1" label="名稱" name="hostName" width="75" :sortable="true" ></jq-col> <jq-col order="2" label="主機(jī)型號(hào)" name="model" width="60" :sortable="true"></jq-col> <jq-col order="3" label="生產(chǎn)廠商" name="vendor" width="60" :sortable="true"></jq-col> </jqgrid>
經(jīng)過這樣的處理,我們可以在所有子組件加載完成對(duì)其進(jìn)行排序,如下:
// 由于Vue無法確定子元素的加載順序,必須手動(dòng)指定order this.colModel.sort((a, b) => a.order - b.order)
結(jié)論
通過手動(dòng)添加輔助變量與方法,可以獲取子組件加載完成的時(shí)刻,從而執(zhí)行整合性操作。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue使用Axios庫請(qǐng)求數(shù)據(jù)時(shí)跨域問題的解決方法詳解
在 VUE 項(xiàng)目開發(fā)時(shí),遇到個(gè)問題,正常設(shè)置使用 Axios 庫請(qǐng)求數(shù)據(jù)時(shí),報(bào)錯(cuò)提示跨域問題,那在生產(chǎn)壞境下,該去怎么解決呢?下面小編就來和大家詳細(xì)講講2024-01-01vue框架和react框架的區(qū)別以及各自的應(yīng)用場(chǎng)景使用
這篇文章主要介紹了vue框架和react框架的區(qū)別以及各自的應(yīng)用場(chǎng)景使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue實(shí)現(xiàn)權(quán)限控制路由(vue-router 動(dòng)態(tài)添加路由)
今天小編就為大家分享一篇vue實(shí)現(xiàn)權(quán)限控制路由(vue-router 動(dòng)態(tài)添加路由),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11在瀏覽器console中如何調(diào)用vue內(nèi)部方法
這篇文章主要介紹了在瀏覽器console中如何調(diào)用vue內(nèi)部方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07詳細(xì)講解如何創(chuàng)建, 發(fā)布自己的 Vue UI 組件庫
當(dāng)我們自己開發(fā)了一個(gè) _UI Component_, 需要在多個(gè)項(xiàng)目中使用的時(shí)候呢? 我們首先想到的可能是直接復(fù)制一份過去對(duì)嗎?我們?yōu)槭裁床话l(fā)布一個(gè) UI 組件庫給自己用呢?下面小編和大家來一起學(xué)習(xí)下吧2019-05-05Vue自定義指令實(shí)現(xiàn)按鈕級(jí)的權(quán)限控制的示例代碼
在Vue中可以通過自定義指令來實(shí)現(xiàn)按鈕權(quán)限控制,本文主要介紹了Vue自定義指令實(shí)現(xiàn)按鈕級(jí)的權(quán)限控制的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05Vue程序化的事件監(jiān)聽器(實(shí)例方案詳解)
本文通過兩種方案給大家介紹了Vue程序化的事件監(jiān)聽器,每種方案通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-01-01Vue Router的手寫實(shí)現(xiàn)方法實(shí)現(xiàn)
這篇文章主要介紹了Vue Router的手寫實(shí)現(xiàn)方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03