什么是路由緩存問題?


響應路由參數(shù)的變化

使用帶有參數(shù)的路由時,當用戶從/users/tom導航到/users/bob時,相同的組件實例將被重復使用。因為兩個路由都渲染同個組件,比起銷毀再創(chuàng)建,復用則顯得更加高效。不過,這也意味著組件的生命周期鉤子不會被調(diào)用。

問題:一級分類的切換正好滿足上面的條件,組件實例復用,導致分類數(shù)據(jù)無法更新

routes: [{
        path: '/',
        component: Layout,
        children: [{
            path: '',
            component: Home
        }, {
            path: '/category/:id',
            component: Category
        }]
    }]
路由緩存問題.gif

如上圖動畫顯示:路由變化了,但是頁面還有緩存,數(shù)據(jù)未變化,需要手動刷新一下頁面數(shù)據(jù)才會變化。

解決上面路由緩存問題的思路:

  1. 讓組件實例不復用,強制銷毀重建
  2. 監(jiān)聽路由變化,變化之后執(zhí)行數(shù)據(jù)更新操作
方案一:給 router-view 添加 key

以當前路由完整路徑為key的值,給router-view組件綁定

<RouterView :key="$route.fullpath">

最常見的用例是v-for結(jié)合:

<ul>
  <li v-for="item in items" :key="item.id">...</li>
</ul>

也可用于強制替換一個元素或組件而不是復用它。當你想這么做時他可能會很有用:

  • 在適當?shù)臅r候觸發(fā)組件的生命周期鉤子
  • 觸發(fā)過渡


    添加key.gif

    如上圖,但是這樣在我們上面的項目中會造成banner接口重復調(diào)用問題,造成資源浪費

方案二:使用beforeRouteUpdate導航鉤子

beforeRouteUpdate鉤子函數(shù)可以在每次路由更新之前執(zhí)行,在回調(diào)中執(zhí)行需要數(shù)據(jù)更新的業(yè)務邏輯即可

或者,使用beforeRouteUpdate,它也可取消導航:

const User={
  template: '...',
  async beforeRouteUpdate(to, from) {
    // 對路由變化做出響應
    this.userData = await fetchUser(to.params.id)
  }
}

在項目中修改:

import { onBeforeRouteUpdate } from "vue-router";
// 目標:路由參數(shù)變化的時候,可以把分類數(shù)據(jù)接口重新發(fā)送
onBeforeRouteUpdate((to) => {
  console.log(to);
  getCategoryAPI(to.params.id)
});
onBeforeRouteUpdate.gif

如上圖: 發(fā)現(xiàn)banner接口沒有存在多余請求了

總結(jié)
  1. 路由緩存問題產(chǎn)生的原因是什么?
    答:路由只有參數(shù)變化時,會復用組件實例
  1. 兩種方案都可以解決路由緩存問題,如何選擇呢?
    答:在意性能問題,選擇 onBeforeRouteUpdate,精細化控制
    不在意性能問題,選擇添加 key,簡單粗暴
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容