首頁 > 軟體

解決vue的component標籤渲染問題

2022-03-29 19:00:43

component標籤渲染問題

最近遇到一個問題,就是通過LoadJs方法載入的元件怎麼通過component實現熱載入問題

vue的component標籤是個虛擬dom,在真實dom樹上需要vue進行渲染,顯示。而我最近遇到的問題,我通過LoadJS方法,從A專案讀取B專案的物件,頁面並已元件的形式渲染到A計畫頁面上,元件沒法渲染。

我第一反應 是this.$forceUpdate(),渲染一下就是,可是並沒有成功。

然後想到一個問題VUE如何識別載入虛擬DOM和如何識別路由裡繫結的頁面?import物件和require物件有什麼區別,什麼時候用

想了一堆這類的問題,實際上import和require的區別,好多文章都有說明,而且解釋的很好。個人看來最大的區別就是一個是靜態編譯和一個動態編譯。也就是一個指令碼執行完後編譯。

所以我這裡應該是動態編譯,因為外部Js檔案在是一個blob物件,無法根據import,指定路徑,執行時候在存取對應的Js檔案。也就是這個路徑是個虛擬的,無法真實找到的時候,不要用import。

vue如何識別import物件和require物件

  • require是CommonJs的語法(AMD規範引入方式),CommonJs的模組是物件。
  • import是es6的一個語法標準(瀏覽器不支援,本質是使用node中的babel將es6轉碼為es5再執行,import會被轉碼為require),es6模組不是物件
  • require是執行時載入整個模組(即模組中所有方法),生成一個物件,再從物件上讀取它的方法(只有執行時才能得到這個物件,不能在編譯時做到靜態化),理論上可以用在程式碼的任何地方
  • import是編譯時呼叫,確定模組的依賴關係,輸入變數(es6模組不是物件,而是通過export命令指定輸出程式碼,再通過import輸入,只載入import中導的方法,其他方法不載入),import具有提升效果,會提升到模組的頭部(編譯時執行)
  • exportimport可以位於模組中的任何位置,但是必須是在模組頂層,如果在其他作用域內,會報錯

這算解決了一個問題,可是component的Is屬性時可以識別require和import物件,我直接丟進去,可是還是不行。

然後注意到一個點,VUE的生命週期!

然後發現我實在mounted匯入的物件。。。。。。

提醒一下自己和看到的人,請不要在mounteds使用require和import,我改到created裡面執行函數就可以。理論來說beforeCreated和beforeMounted也可以使用。未嘗試過。

還有提醒一下,思考一個問題,不要鑽牛角尖,換個思路,說不定豁然開朗,就像我這個問題。其實主要問題就是,匯入物件的時期和匯入的方法選擇,而不是渲染。

component元件巢狀,導致頁面重複渲染,重複請求的bug

因詳情頁面,有多個tab索引標籤考慮頁面多處重複使用,而且有多個頁面組成,最終決定使用 元件方式來參照頁面。

因 專案採用的UI元件是 element-ui,剛好看到有一個 樣式很類似於 tab索引標籤,就採用了 element的 tabs元件,可是 沒想到問題就是出現 這兒。

錯誤程式碼

<el-tabs class="header-tabs" v-model="activeName" @tab-click="handleClick">
   <el-tab-pane
     v-for="item of tabs"
     :key="item.id"
     :label="item.label"
     :name="item.id"
     :component="item.component"
     lazy
     >
      <keep-alive exclude="ContentManage">
          <component :is="currentComponent" :customeroid="agencyid"></component>
      </keep-alive>
     </el-tab-pane>
</el-tabs>

因為上述採用了 tabs索引標籤,而且也使用 v-for迴圈(沒辦法,主要是 tabs是動態的),導致 每個頁面不僅沒有辦法 快取,反而 一直重複傳送請求。自己百度了好久,最後沒辦法尋求幫助,在大佬們 遠端幫助下 最終發現的是 tabs下的 v-for導致。

因為 component 寫在v-for迴圈中,每次迴圈都會 建立一個 物件,導致建立很多的元件,點選一次tabs 迴圈後的 所有的 component都 傳送了請求,每次點選一次後,都會減少一次請求(因為 keep-alive快取的問題)。

最終解決的方法,不在 element-ui的 tabs元件,自己手寫頁面,反正樣式不復雜。

正確程式碼

<ul class="tabs-ul">
    <li
        v-for="(item) in currentTabs"
        :key="item.id"
        :class="{ active: tabSelect === item.id }"
        @click.prevent="changetabs(item.id)"
        >
        {{ item.label }}
    </li>
</ul>
<keep-alive exclude="ContentManage">
    <component :is="currentComponent" :customeroid="agencyid"></component>
</keep-alive>

這樣的就可以避免建立多個元件,從而不在出現 重複傳送請求的bug。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com