記錄在舊背景系統中嵌入微應用時,遇到的關于 tab 标簽頁及元件緩存的問題
頁面結構
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5SZzUGMlB3chFDOvwVOxADM2YDNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
這裡主要功能頁都将通過 main.vue 元件渲染到右側容器中, 左側為主菜單。每一子頁被激活後,将新增tab标簽。tab 标簽之間切換将不更新元件内容。
原來元件渲染結構
這裡iframe未被使用,是以關注點在兩個路由的渲染入口, 1. tab頁内容入口 2. 其他子頁内容入口.
多 keep-alive 與 router-view
我們知道 keep-alive 用于維持元件狀态,router-view 将作為路由比對後的元件渲染出口.
這裡将 keep-alive 和 router-view 嵌套在 tab中,将生成多組渲染出口.
如果隻是從單純渲染的角度,單一的出口既可以滿足。 但單一出口的問題在于, keep-alive 對于元件緩存的處理。
實際測試會發現,單一出口時,路由切換, tab标簽關閉後新增,都将維持元件的狀态。 這就和我們的預期有出入了, 我們期望關閉tab标簽關閉後,元件狀态也被重置。這裡就和keep-alive的緩存機制有關,keep-alive 将緩存包裹内的元件執行個體,當下次渲染時,重複使用該執行個體。是以keep-alive 内的元件重複渲染時,不會觸發元件内的created鈎子。
而多 keep-alive , router-view 為每一tab标簽獨立配置設定元件緩存, 當該标簽移除時,keep-alive也将被移除,是以元件緩存也将清除。 下次新增标簽将為全新元件。
微應用引入
問題1: 原 main.vue 主容器與 mou路由 '/' 綁定,如何觸發微應用加載 ?
為了盡量相容原元件加載方式,這裡微應用的加載觸發,選擇沿用原觸發方式,隻在配置已經渲染出口時做差異化處理. 這裡隻做簡單流程梳理
路由注冊以及觸發流程
菜單UI加載及觸發.png
微應用渲染入口
這裡微應用的加載,都通過手動控制,将周期鈎子與微應用容器元件關聯在一起
主容器入口
微應用容器
問題2: 如何渲染微應用且保持微應用狀态 ?
微應用狀态保持,需要基座與微應配合。
保證微應用容器在使用中不會被登出, 這裡利用與原路由出口一緻的設定方式
微應用内配置keep-alive
這裡子應用作為微應用時将設定統一的路由字首,類似主應用的嵌套路由元件
總結
對于這類tab标簽頁引入微應用的情況,
主要的問題是:
主次應用路由嵌套關系
子應用指定渲染容器
子應用的生命周期控制
子應用與原元件的相容協同
一個簡單直接的辦法,可以将子應用看作一類線上動态路由元件。 而這類元件的聲明周期是關注的重點.